溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微服務Spring Cloud Alibaba之我見

發(fā)布時間:2020-08-09 00:39:26 來源:ITPUB博客 閱讀:213 作者:技術(shù)瑣話 欄目:軟件技術(shù)


作者:Piotr Mińkowski,“Mastering Spring Cloud”一書作者

原文鏈接:

https://dzone.com/articles/microservices-with-spring-cloud-alibaba


 

微服務Spring Cloud Alibaba之我見

如果你正在尋找一個Spring Cloud Netflix的替代方案,建議可以看下這篇和Spring Cloud Alibaba相關的文章。

前段時間,Spring Cloud在其官方博客宣布:阿里巴巴開源 Spring Cloud Alibaba,發(fā)布了首個預覽版本0.2.0,并已和Spring Boot 2.0兼容,該項目支持基于阿里巴巴的開源組件和阿里云云產(chǎn)品,構(gòu)建微服務體系。

這個項目看起來非常有趣,并且目前已成為SpringCloud孵化器倉庫中最流行的項目之一。

微服務Spring Cloud Alibaba之我見


Spring Cloud還支持另一個流行的阿里巴巴開源組件——Sentinel,他負責流量控制、并發(fā)、斷路和負載保護。

我們的演示示例由三個微服務和API網(wǎng)關組成,非常類似于我之前寫過的一篇文章《基于SpringBoot 2.0、Eureka和Spring Cloud搭建微服務的快速指南》中所描述的體系結(jié)構(gòu)。

唯一的區(qū)別在于,用于配置管理和服務發(fā)現(xiàn)的工具。微服務調(diào)用服務暴露的接口,而department-service調(diào)用employee-service暴露的接口,使用OpenFeign客戶端實現(xiàn)了服務間的通信。整個系統(tǒng)的復雜性隱藏在使用NetflixZuul實現(xiàn)的API網(wǎng)關之后。

“SpringCloud Alibaba是否可以替代SpringCloud Netflix?”

答案是肯定的,但不是全部。Spring Cloud Alibaba仍然與Ribbon集成,Ribbon是基于服務發(fā)現(xiàn)的負載平衡。在這種情況下,Netflix Eureka很有可能被Nacos替換掉。

Nacos(DynamicNaming and Configuration Service)是一個更易于構(gòu)建云原生應用的動態(tài)服務發(fā)現(xiàn)、配置管理和服務管理平臺易于使用的平臺,按照這個定義,您可以使用Nacos用于:

  • 服務發(fā)現(xiàn)-可以注冊您的微服務,并通過DNS或HTTP接口發(fā)現(xiàn)其他微服務。它還為注冊服務提供實時健康檢查。

  • 分布式配置——Nacos提供的動態(tài)配置服務允許您在所有環(huán)境中以集中和動態(tài)的方式管理所有服務的配置。事實上,您也可以使用它來替換Spring Cloud Config Server。

  • 動態(tài)DNS——它支持加權(quán)路由,使得更容易實現(xiàn)中間層負載平衡、靈活的路由策略、流控制和簡單的DNS解析服務。

Spring Cloud還支持另一個流行的阿里巴巴開源組件——Sentinel,他負責流量控制、并發(fā)、斷路和負載保護。

我們的演示示例由三個微服務和API網(wǎng)關組成,非常類似于我之前寫過的一篇文章《基于SpringBoot 2.0、Eureka和Spring Cloud搭建微服務的快速指南》中所描述的體系結(jié)構(gòu)。唯一的區(qū)別在于,用于配置管理和服務發(fā)現(xiàn)的工具。

微服務調(diào)用服務暴露的接口,而department-service調(diào)用employee-service暴露的接口,使用OpenFeign客戶端實現(xiàn)了服務間的通信。整個系統(tǒng)的復雜性隱藏在使用NetflixZuul實現(xiàn)的API網(wǎng)關之后。

微服務Spring Cloud Alibaba之我見


1. 運行Nacos服務器

您可以在Windows和Linux系統(tǒng)上運行Nacos。首先,您應該下載GitHub上提供的最新穩(wěn)定版本。解壓縮之后,必須通過執(zhí)行以下命令以單機模式運行它:

cmd nacos/bin/startup.cmd -m standalone

 默認情況下,Nacos從端口8848開始。它提供/nacos/v1下的HTTP API,以及地址http://localhost:8848/nacos下的管理web控制臺。如果查看日志,您會發(fā)現(xiàn)它只是一個使用SpringFramework編寫的應用程序。


 2. 依賴關系

正如我前面提到的,Spring Cloud Alibaba仍然處于孵化階段,因此它不包含在SpringCloud Release Train中。這就是為什么我們需要在pom.xml的依賴關系管理部分中包括一個針對阿里巴巴的特殊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為當前支持的組件提供了三個啟動器。這些是使用Nacos進行服務發(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的配置管理,我們只需要引入一個starter,即spring-cloud-starter-alibaba-nacos-config。它不提供Nacos服務器的自動配置地址,因此我們需要為bootstrap.yml文件中的應用程序顯式地設置它。

spring:application:name: employee-servicecloud:nacos:  config:    server-addr: localhost:8848

 我們的應用程序嘗試與Nacos連接,并獲取在文件中提供的與屬性spring.application.name的值同名的配置。目前,Spring Cloud Alibaba只支持.properties文件,因此我們需要在文件employee-service.properties內(nèi)創(chuàng)建配置。

Nacos提供了創(chuàng)建和管理配置屬性的優(yōu)雅方式。我們可以使用網(wǎng)絡管理控制臺來做到這一點。下面圖片中可見的字段Data ID實際上是配置文件的名稱。配置屬性列表應該放在Configuration Content字段中。

微服務Spring Cloud Alibaba之我見

好消息是,它在修改了Nacos之后會動態(tài)刷新應用程序配置。在應用程序中,您唯一要做的就是注釋應該用@RefreshScope或@ConfigurationProperties刷新的bean。

現(xiàn)在,讓我們考慮以下情況。我們將稍微修改一下配置,以添加一些帶有測試數(shù)據(jù)的屬性,如下所示。


微服務Spring Cloud Alibaba之我見

 


這是我們存儲庫bean的實現(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,您應該會看到具有修改值的雇員的完整列表。

 

微服務Spring Cloud Alibaba之我見

對于我們另外兩個微服務,部門服務和組織服務,應該創(chuàng)建相同的配置屬性。假設您已經(jīng)完成了,那么您應該在Nacos上具有以下配置條目。

微服務Spring Cloud Alibaba之我見


4. 使用Nacos啟用服務發(fā)現(xiàn)

要使用Nacos實現(xiàn)服務發(fā)現(xiàn),首先需要包括starterspring-cloud-starter-alibaba-nacos-discovery。配置服務器也是如此;您還需要在bootstrap.yml文件中設置Nacos服務器的地址。

spring: application:   name: employee-service cloud: nacos:  discovery:    server-addr: localhost:8848

 最后一步是通過使用@EnableDiscoveryClient注釋主類來為應用程序啟用發(fā)現(xiàn)客戶端。

@SpringBootApplication@EnableDiscoveryClient@EnableSwagger2public class EmployeeApplication {public static void main(String[] args) {SpringApplication.run(EmployeeApplication.class, args);}}

 如果您為所有的微服務提供相同的實現(xiàn)并運行它們,您將在Nacos Web控制臺中看到以下已注冊的應用程序列表。 

5.  服務間的通信

微服務之間的通信是使用標準Spring Cloud組件實現(xiàn):RestTemplate或OpenFeign客戶端。

默認情況下,負載平衡由Ribbon客戶端實現(xiàn)。與Spring Cloud Netflix相比,唯一的區(qū)別之前的服務注冊中心使用的是 SpringCloud Netflix。下面是負責與employee service公開的端點GET/department/{departmentId} 通信的 FeignClient 客戶端在部門服務中集成的實現(xiàn)。

@FeignClient(name = "employee-service")public interface EmployeeClient {@GetMapping("/department/{departmentId}")List < Employee > findByDepartment(@PathVariable("departmentId") Long departmentId);}

不要忘記為Spring Boot應用程序啟用Feign客戶端。

@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients@EnableSwagger2public class DepartmentApplication {public static void main(String[] args) {SpringApplication.run(DepartmentApplication.class, args);}}


我們還應該運行多個employee-service實例,以便在客戶端測試負載均衡。在此之前,我們可以通過在Nacos上存儲的配置中將屬性server.port設置為0,來啟用端口號的動態(tài)生成。

現(xiàn)在,我們可以使用相同的配置設置運行單個服務的許多實例,而不必擔心單個微服務的端口號沖突。讓我們擴大employee-service實例的數(shù)量。


微服務Spring Cloud Alibaba之我見


如果希望測試服務間通信,可以調(diào)用以下方法,這些方法使用OpenFeign客戶端調(diào)用其他微服務公開的端點:GET /organization/{organizationId}/with-employees from department-service, and GET /{id}/with-departmentsGET /{id}/with-departments-and-employeesGET /{id}/with-employees from organization-service.

6. 運行API網(wǎng)關

現(xiàn)在是運行體系結(jié)構(gòu)中最后一個組件——API網(wǎng)關。它建在Spring Cloud Netflix Zuul之上,同樣使用Nacos作為發(fā)現(xiàn)和配置服務器。

<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>

 在包括所需的依賴項之后,我們需要為應用程序啟用Zuul代理和發(fā)現(xiàn)客戶端。

@SpringBootApplication@EnableDiscoveryClient@EnableZuulProxy@EnableSwagger2public class ProxyApplication {public static void main(String[] args) {SpringApplication.run(ProxyApplication.class, args);}}

以下是為我們的三個示例微服務定義的Zuul路由的配置:  

zuul:  routes:  department:    path: /department/**  serviceId: department-serviceemployee:  path: /employee/**  serviceId: employee-serviceorganization:  path: /organization/**  serviceId: organization-service

在運行網(wǎng)關之后,它為所有定義的微服務公開的API公開了Swagger2規(guī)范。假設您已經(jīng)在端口8080上運行了它,那么您可以在地址http://localhost:8080/swagger-ui.html下訪問它。由于這個原因,您可以從一個單獨的位置調(diào)用方法。

7. 結(jié)論

示例應用程序的源代碼可以在GitHub上通過阿里巴巴分支中的sample-spring-microservices-new獲得。

本文的主要目的是展示如何使用用于服務發(fā)現(xiàn)和配置管理的AlibabaNacos替換一些流行的SpringCloud組件。

SpringCloud Alibaba項目處于開發(fā)的早期階段,所以我們可能在不久的將來期待一些新的有趣的特性。您也可以在此處Spring Cloud Alibaba GitHub站點上找到其他一些示例。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI