作者:Piotr Mińkowski,“Mastering Spring Cloud”一書作者
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了通化縣免費(fèi)建站歡迎大家使用!
原文鏈接:https://dzone.com/articles/microservices-with-spring-cloud-alibaba
如果你正在尋找一個(gè)Spring Cloud Netflix的替代方案,建議可以看下這篇和Spring Cloud Alibaba相關(guān)的文章。
前段時(shí)間,Spring Cloud在其官方博客宣布:阿里巴巴開源 Spring Cloud Alibaba,發(fā)布了首個(gè)預(yù)覽版本0.2.0,并已和Spring Boot 2.0兼容,該項(xiàng)目支持基于阿里巴巴的開源組件和阿里云云產(chǎn)品,構(gòu)建微服務(wù)體系。
這個(gè)項(xiàng)目看起來非常有趣,并且目前已成為SpringCloud孵化器倉庫中最流行的項(xiàng)目之一。
Spring Cloud還支持另一個(gè)流行的阿里巴巴開源組件——Sentinel,他負(fù)責(zé)流量控制、并發(fā)、斷路和負(fù)載保護(hù)。
我們的演示示例由三個(gè)微服務(wù)和API網(wǎng)關(guān)組成,非常類似于我之前寫過的一篇文章《基于SpringBoot 2.0、Eureka和Spring Cloud搭建微服務(wù)的快速指南》中所描述的體系結(jié)構(gòu)。
唯一的區(qū)別在于,用于配置管理和服務(wù)發(fā)現(xiàn)的工具。微服務(wù)調(diào)用服務(wù)暴露的接口,而department-service調(diào)用employee-service暴露的接口,使用OpenFeign客戶端實(shí)現(xiàn)了服務(wù)間的通信。整個(gè)系統(tǒng)的復(fù)雜性隱藏在使用NetflixZuul實(shí)現(xiàn)的API網(wǎng)關(guān)之后。
“SpringCloud Alibaba是否可以替代SpringCloud Netflix?”
答案是肯定的,但不是全部。Spring Cloud Alibaba仍然與Ribbon集成,Ribbon是基于服務(wù)發(fā)現(xiàn)的負(fù)載平衡。在這種情況下,Netflix Eureka很有可能被Nacos替換掉。
Nacos(DynamicNaming and Configuration Service)是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺易于使用的平臺,按照這個(gè)定義,您可以使用Nacos用于:
服務(wù)發(fā)現(xiàn)-可以注冊您的微服務(wù),并通過DNS或HTTP接口發(fā)現(xiàn)其他微服務(wù)。它還為注冊服務(wù)提供實(shí)時(shí)健康檢查。
分布式配置——Nacos提供的動(dòng)態(tài)配置服務(wù)允許您在所有環(huán)境中以集中和動(dòng)態(tài)的方式管理所有服務(wù)的配置。事實(shí)上,您也可以使用它來替換Spring Cloud Config Server。
動(dòng)態(tài)DNS——它支持加權(quán)路由,使得更容易實(shí)現(xiàn)中間層負(fù)載平衡、靈活的路由策略、流控制和簡單的DNS解析服務(wù)。
Spring Cloud還支持另一個(gè)流行的阿里巴巴開源組件——Sentinel,他負(fù)責(zé)流量控制、并發(fā)、斷路和負(fù)載保護(hù)。
我們的演示示例由三個(gè)微服務(wù)和API網(wǎng)關(guān)組成,非常類似于我之前寫過的一篇文章《基于SpringBoot 2.0、Eureka和Spring Cloud搭建微服務(wù)的快速指南》中所描述的體系結(jié)構(gòu)。唯一的區(qū)別在于,用于配置管理和服務(wù)發(fā)現(xiàn)的工具。
微服務(wù)調(diào)用服務(wù)暴露的接口,而department-service調(diào)用employee-service暴露的接口,使用OpenFeign客戶端實(shí)現(xiàn)了服務(wù)間的通信。整個(gè)系統(tǒng)的復(fù)雜性隱藏在使用NetflixZuul實(shí)現(xiàn)的API網(wǎng)關(guān)之后。
1. 運(yùn)行Nacos服務(wù)器
您可以在Windows和Linux系統(tǒng)上運(yùn)行Nacos。首先,您應(yīng)該下載GitHub上提供的最新穩(wěn)定版本。解壓縮之后,必須通過執(zhí)行以下命令以單機(jī)模式運(yùn)行它:
cmd nacos/bin/startup.cmd -m standalone
默認(rèn)情況下,Nacos從端口8848開始。它提供/nacos/v1下的HTTP API,以及地址http://localhost:8848/nacos下的管理web控制臺。如果查看日志,您會(huì)發(fā)現(xiàn)它只是一個(gè)使用SpringFramework編寫的應(yīng)用程序。
2. 依賴關(guān)系
正如我前面提到的,Spring Cloud Alibaba仍然處于孵化階段,因此它不包含在SpringCloud Release Train中。這就是為什么我們需要在pom.xml的依賴關(guān)系管理部分中包括一個(gè)針對阿里巴巴的特殊BOM。我們還將使用Spring Cloud的最新穩(wěn)定版本,即現(xiàn)在的Finchley.SR2。
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>0.2.0.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
Spring Cloud Alibaba為當(dāng)前支持的組件提供了三個(gè)啟動(dòng)器。這些是使用Nacos進(jìn)行服務(wù)發(fā)現(xiàn)的spring-cloud-starter-alibaba-nacos-discovery、用于分布式配置的spring-cloud-starter-alibaba-nacos-config以及用于限流降級的spring-cloud-starter-alibaba-sentinel。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos- discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos- config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
3. 使用Nacos啟用分布式配置
為了啟用Nacos的配置管理,我們只需要引入一個(gè)starter,即spring-cloud-starter-alibaba-nacos-config。它不提供Nacos服務(wù)器的自動(dòng)配置地址,因此我們需要為bootstrap.yml文件中的應(yīng)用程序顯式地設(shè)置它。
spring:application:name: employee-servicecloud:nacos: config: server-addr: localhost:8848
我們的應(yīng)用程序嘗試與Nacos連接,并獲取在文件中提供的與屬性spring.application.name的值同名的配置。目前,Spring Cloud Alibaba只支持.properties文件,因此我們需要在文件employee-service.properties內(nèi)創(chuàng)建配置。
Nacos提供了創(chuàng)建和管理配置屬性的優(yōu)雅方式。我們可以使用網(wǎng)絡(luò)管理控制臺來做到這一點(diǎn)。下面圖片中可見的字段Data ID實(shí)際上是配置文件的名稱。配置屬性列表應(yīng)該放在Configuration Content字段中。
好消息是,它在修改了Nacos之后會(huì)動(dòng)態(tài)刷新應(yīng)用程序配置。在應(yīng)用程序中,您唯一要做的就是注釋應(yīng)該用@RefreshScope或@ConfigurationProperties刷新的bean。
現(xiàn)在,讓我們考慮以下情況。我們將稍微修改一下配置,以添加一些帶有測試數(shù)據(jù)的屬性,如下所示。
這是我們存儲(chǔ)庫bean的實(shí)現(xiàn)。它將帶有前綴repository.employees的所有配置屬性注入到employees列表中。
@Repository@ConfigurationProperties(prefix = "repository")public class EmployeeRepository {private List < Employee > employees = new ArrayList < > ();public List < Employee > getEmployees() {return employees;}public void setEmployees(List < Employee > employees) {this.employees = employees;}public Employee add(Employee employee) {employee.setId((long)(employees.size() + 1));employees.add(employee);return employee;}public Employee findById(Long id) {Optional < Employee > employee = employees.stream().filter(a - > a.getId().equals(id)).findFirst();if (employee.isPresent())return employee.get();elsereturn null;}public List < Employee > findAll() {return employees;}public List < Employee > findByDepartment(Long departmentId) {return employees.stream().filter(a -> a.getDepartmentId().equals(departmentId)).collect(Collectors.toList());}public List < Employee > findByOrganization(Long organizationId) {return employees.stream().filter(a -> a.getOrganizationId().equals(organizationId)).collect(Collectors.toList());}}
現(xiàn)在,您可以更改一些屬性值,如下圖所示。然后,如果調(diào)用在端口8090(http://localhost:8090)上可用的employee-service,您應(yīng)該會(huì)看到具有修改值的雇員的完整列表。
對于我們另外兩個(gè)微服務(wù),部門服務(wù)和組織服務(wù),應(yīng)該創(chuàng)建相同的配置屬性。假設(shè)您已經(jīng)完成了,那么您應(yīng)該在Nacos上具有以下配置條目。
4. 使用Nacos啟用服務(wù)發(fā)現(xiàn)
要使用Nacos實(shí)現(xiàn)服務(wù)發(fā)現(xiàn),首先需要包括starterspring-cloud-starter-alibaba-nacos-discovery。配置服務(wù)器也是如此;您還需要在bootstrap.yml文件中設(shè)置Nacos服務(wù)器的地址。
spring: application: name: employee-service cloud: nacos: discovery: server-addr: localhost:8848
最后一步是通過使用@EnableDiscoveryClient注釋主類來為應(yīng)用程序啟用發(fā)現(xiàn)客戶端。
@SpringBootApplication@EnableDiscoveryClient@EnableSwagger2public class EmployeeApplication {public static void main(String[] args) {SpringApplication.run(EmployeeApplication.class, args);}}
如果您為所有的微服務(wù)提供相同的實(shí)現(xiàn)并運(yùn)行它們,您將在Nacos Web控制臺中看到以下已注冊的應(yīng)用程序列表。
5. 服務(wù)間的通信
微服務(wù)之間的通信是使用標(biāo)準(zhǔn)Spring Cloud組件實(shí)現(xiàn):RestTemplate或OpenFeign客戶端。
默認(rèn)情況下,負(fù)載平衡由Ribbon客戶端實(shí)現(xiàn)。與Spring Cloud Netflix相比,唯一的區(qū)別之前的服務(wù)注冊中心使用的是 SpringCloud Netflix。下面是負(fù)責(zé)與employee service公開的端點(diǎn)GET/department/{departmentId} 通信的 FeignClient 客戶端在部門服務(wù)中集成的實(shí)現(xiàn)。
@FeignClient(name = "employee-service")public interface EmployeeClient {@GetMapping("/department/{departmentId}")List < Employee > findByDepartment(@PathVariable("departmentId") Long departmentId);}
不要忘記為Spring Boot應(yīng)用程序啟用Feign客戶端。
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients@EnableSwagger2public class DepartmentApplication {public static void main(String[] args) {SpringApplication.run(DepartmentApplication.class, args);}}
我們還應(yīng)該運(yùn)行多個(gè)employee-service實(shí)例,以便在客戶端測試負(fù)載均衡。在此之前,我們可以通過在Nacos上存儲(chǔ)的配置中將屬性server.port設(shè)置為0,來啟用端口號的動(dòng)態(tài)生成。
現(xiàn)在,我們可以使用相同的配置設(shè)置運(yùn)行單個(gè)服務(wù)的許多實(shí)例,而不必?fù)?dān)心單個(gè)微服務(wù)的端口號沖突。讓我們擴(kuò)大employee-service實(shí)例的數(shù)量。
如果希望測試服務(wù)間通信,可以調(diào)用以下方法,這些方法使用OpenFeign客戶端調(diào)用其他微服務(wù)公開的端點(diǎn):GET /organization/{organizationId}/with-employees
from department-service
, and GET /{id}/with-departments
, GET /{id}/with-departments-and-employees
, GET /{id}/with-employees
from organization-service
.
6. 運(yùn)行API網(wǎng)關(guān)
現(xiàn)在是運(yùn)行體系結(jié)構(gòu)中最后一個(gè)組件——API網(wǎng)關(guān)。它建在Spring Cloud Netflix Zuul之上,同樣使用Nacos作為發(fā)現(xiàn)和配置服務(wù)器。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>
在包括所需的依賴項(xiàng)之后,我們需要為應(yīng)用程序啟用Zuul代理和發(fā)現(xiàn)客戶端。
@SpringBootApplication@EnableDiscoveryClient@EnableZuulProxy@EnableSwagger2public class ProxyApplication {public static void main(String[] args) {SpringApplication.run(ProxyApplication.class, args);}}
以下是為我們的三個(gè)示例微服務(wù)定義的Zuul路由的配置:
zuul: routes: department: path: /department/** serviceId: department-serviceemployee: path: /employee/** serviceId: employee-serviceorganization: path: /organization/** serviceId: organization-service
在運(yùn)行網(wǎng)關(guān)之后,它為所有定義的微服務(wù)公開的API公開了Swagger2規(guī)范。假設(shè)您已經(jīng)在端口8080上運(yùn)行了它,那么您可以在地址http://localhost:8080/swagger-ui.html下訪問它。由于這個(gè)原因,您可以從一個(gè)單獨(dú)的位置調(diào)用方法。
7. 結(jié)論
示例應(yīng)用程序的源代碼可以在GitHub上通過阿里巴巴分支中的sample-spring-microservices-new獲得。
本文的主要目的是展示如何使用用于服務(wù)發(fā)現(xiàn)和配置管理的AlibabaNacos替換一些流行的SpringCloud組件。
SpringCloud Alibaba項(xiàng)目處于開發(fā)的早期階段,所以我們可能在不久的將來期待一些新的有趣的特性。您也可以在此處Spring Cloud Alibaba GitHub站點(diǎn)上找到其他一些示例。
網(wǎng)站題目:我是如何替換SpringCloudNetflix的?
當(dāng)前網(wǎng)址:http://www.rwnh.cn/article12/jgpgdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、營銷型網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、ChatGPT、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)