您好,登錄后才能下訂單哦!
作者:Piotr Mińkowski,“Mastering Spring Cloud”一書作者
原文鏈接:
https://dzone.com/articles/microservices-with-spring-cloud-alibaba
如果你正在尋找一個Spring Cloud Netflix的替代方案,建議可以看下這篇和Spring Cloud Alibaba相關的文章。
前段時間,Spring Cloud在其官方博客宣布:阿里巴巴開源 Spring Cloud Alibaba,發布了首個預覽版本0.2.0,并已和Spring Boot 2.0兼容,該項目支持基于阿里巴巴的開源組件和阿里云云產品,構建微服務體系。
這個項目看起來非常有趣,并且目前已成為SpringCloud孵化器倉庫中最流行的項目之一。
Spring Cloud還支持另一個流行的阿里巴巴開源組件——Sentinel,他負責流量控制、并發、斷路和負載保護。
我們的演示示例由三個微服務和API網關組成,非常類似于我之前寫過的一篇文章《基于SpringBoot 2.0、Eureka和Spring Cloud搭建微服務的快速指南》中所描述的體系結構。
唯一的區別在于,用于配置管理和服務發現的工具。微服務調用服務暴露的接口,而department-service調用employee-service暴露的接口,使用OpenFeign客戶端實現了服務間的通信。整個系統的復雜性隱藏在使用NetflixZuul實現的API網關之后。
“SpringCloud Alibaba是否可以替代SpringCloud Netflix?”
答案是肯定的,但不是全部。Spring Cloud Alibaba仍然與Ribbon集成,Ribbon是基于服務發現的負載平衡。在這種情況下,Netflix Eureka很有可能被Nacos替換掉。
Nacos(DynamicNaming and Configuration Service)是一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺易于使用的平臺,按照這個定義,您可以使用Nacos用于:
服務發現-可以注冊您的微服務,并通過DNS或HTTP接口發現其他微服務。它還為注冊服務提供實時健康檢查。
分布式配置——Nacos提供的動態配置服務允許您在所有環境中以集中和動態的方式管理所有服務的配置。事實上,您也可以使用它來替換Spring Cloud Config Server。
動態DNS——它支持加權路由,使得更容易實現中間層負載平衡、靈活的路由策略、流控制和簡單的DNS解析服務。
Spring Cloud還支持另一個流行的阿里巴巴開源組件——Sentinel,他負責流量控制、并發、斷路和負載保護。
我們的演示示例由三個微服務和API網關組成,非常類似于我之前寫過的一篇文章《基于SpringBoot 2.0、Eureka和Spring Cloud搭建微服務的快速指南》中所描述的體系結構。唯一的區別在于,用于配置管理和服務發現的工具。
微服務調用服務暴露的接口,而department-service調用employee-service暴露的接口,使用OpenFeign客戶端實現了服務間的通信。整個系統的復雜性隱藏在使用NetflixZuul實現的API網關之后。
1. 運行Nacos服務器
您可以在Windows和Linux系統上運行Nacos。首先,您應該下載GitHub上提供的最新穩定版本。解壓縮之后,必須通過執行以下命令以單機模式運行它:
cmd nacos/bin/startup.cmd -m standalone
默認情況下,Nacos從端口8848開始。它提供/nacos/v1下的HTTP API,以及地址http://localhost:8848/nacos下的管理web控制臺。如果查看日志,您會發現它只是一個使用SpringFramework編寫的應用程序。
2. 依賴關系
正如我前面提到的,Spring Cloud Alibaba仍然處于孵化階段,因此它不包含在SpringCloud Release Train中。這就是為什么我們需要在pom.xml的依賴關系管理部分中包括一個針對阿里巴巴的特殊BOM。我們還將使用Spring Cloud的最新穩定版本,即現在的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進行服務發現的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內創建配置。
Nacos提供了創建和管理配置屬性的優雅方式。我們可以使用網絡管理控制臺來做到這一點。下面圖片中可見的字段Data ID實際上是配置文件的名稱。配置屬性列表應該放在Configuration Content字段中。
好消息是,它在修改了Nacos之后會動態刷新應用程序配置。在應用程序中,您唯一要做的就是注釋應該用@RefreshScope或@ConfigurationProperties刷新的bean。
現在,讓我們考慮以下情況。我們將稍微修改一下配置,以添加一些帶有測試數據的屬性,如下所示。
這是我們存儲庫bean的實現。它將帶有前綴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());}}
現在,您可以更改一些屬性值,如下圖所示。然后,如果調用在端口8090(http://localhost:8090)上可用的employee-service,您應該會看到具有修改值的雇員的完整列表。
對于我們另外兩個微服務,部門服務和組織服務,應該創建相同的配置屬性。假設您已經完成了,那么您應該在Nacos上具有以下配置條目。
4. 使用Nacos啟用服務發現
要使用Nacos實現服務發現,首先需要包括starterspring-cloud-starter-alibaba-nacos-discovery。配置服務器也是如此;您還需要在bootstrap.yml文件中設置Nacos服務器的地址。
spring: application: name: employee-service cloud: nacos: discovery: server-addr: localhost:8848
最后一步是通過使用@EnableDiscoveryClient注釋主類來為應用程序啟用發現客戶端。
@SpringBootApplication@EnableDiscoveryClient@EnableSwagger2public class EmployeeApplication {public static void main(String[] args) {SpringApplication.run(EmployeeApplication.class, args);}}
如果您為所有的微服務提供相同的實現并運行它們,您將在Nacos Web控制臺中看到以下已注冊的應用程序列表。
5. 服務間的通信
微服務之間的通信是使用標準Spring Cloud組件實現:RestTemplate或OpenFeign客戶端。
默認情況下,負載平衡由Ribbon客戶端實現。與Spring Cloud Netflix相比,唯一的區別之前的服務注冊中心使用的是 SpringCloud Netflix。下面是負責與employee service公開的端點GET/department/{departmentId} 通信的 FeignClient 客戶端在部門服務中集成的實現。
@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,來啟用端口號的動態生成。
現在,我們可以使用相同的配置設置運行單個服務的許多實例,而不必擔心單個微服務的端口號沖突。讓我們擴大employee-service實例的數量。
如果希望測試服務間通信,可以調用以下方法,這些方法使用OpenFeign客戶端調用其他微服務公開的端點: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. 運行API網關
現在是運行體系結構中最后一個組件——API網關。它建在Spring Cloud Netflix Zuul之上,同樣使用Nacos作為發現和配置服務器。
<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代理和發現客戶端。
@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
在運行網關之后,它為所有定義的微服務公開的API公開了Swagger2規范。假設您已經在端口8080上運行了它,那么您可以在地址http://localhost:8080/swagger-ui.html下訪問它。由于這個原因,您可以從一個單獨的位置調用方法。
7. 結論
示例應用程序的源代碼可以在GitHub上通過阿里巴巴分支中的sample-spring-microservices-new獲得。
本文的主要目的是展示如何使用用于服務發現和配置管理的AlibabaNacos替換一些流行的SpringCloud組件。
SpringCloud Alibaba項目處于開發的早期階段,所以我們可能在不久的將來期待一些新的有趣的特性。您也可以在此處Spring Cloud Alibaba GitHub站點上找到其他一些示例。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。