EDAS提供Nacos的商用版本注冊中心,使用Nacos作為注冊中心開發的應用無需修改任何代碼,部署到EDAS后,即可使用EDAS提供的共享注冊中心。本文介紹如何在本地基于Nacos開發一對Spring Cloud微服務示例應用(包含一個服務提供者Provider和一個服務消費者Consumer)。
如何選擇注冊中心
微服務應用通過注冊中心實現服務注冊與發現。在開發應用時,可以根據實際需求,參考下圖選擇注冊中心。
您可以使用本文介紹的Nacos作為注冊中心實現應用的服務注冊與發現,也可以使用自建或MSE托管的Eureka、ZooKeeper和Consul等其它類型的注冊中心。無論使用哪種類型的注冊中心,在將應用部署到EDAS之后,都可以使用EDAS提供的應用托管、微服務治理及云原生PaaS平臺能力。
MSE支持的注冊中心類型以及如何托管注冊中心,請參見功能概覽。
關于如何將應用部署到EDAS,請參見應用創建和部署概述(ECS)和創建和部署應用概述(K8s)。
您可以按照本文的內容實現應用的服務注冊與發現,也可以直接下載應用Demo:service-provider和service-consumer。
準備工作
已下載Maven并設置環境變量。
已下載最新版本的Nacos Server。
已按以下步驟啟動Nacos Server。
解壓下載的Nacos Server壓縮包。
進入
nacos/bin
目錄,啟動Nacos Server。Linux/Unix/Mac系統:執行命令
sudo sh startup.sh -m standalone
。Windows系統:雙擊執行
startup.cmd
文件。
可選:
在本地開發應用時,可以使用Alibaba Cloud Toolkit插件實現本地應用和部署在EDAS中的應用的相互調用,即端云互聯,而無需搭建VPN,幫助您提升開發效率。更多信息,請參見端云互聯簡介。
操作步驟
步驟一:創建服務提供者
在本地創建服務提供者應用工程,添加依賴,開啟服務注冊與發現功能,并將注冊中心指定為Nacos Server。
創建名為
nacos-service-provider
的Maven工程。在
pom.xml
文件中添加依賴。以Spring Boot 2.1.4.RELEASE和Spring Cloud Greenwich.SR1為例,依賴如下。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
說明示例中使用的版本為Spring Cloud Greenwich,對應Spring Cloud Alibaba版本為2.1.1.RELEASE。
如果使用Spring Cloud Finchley版本,對應Spring Cloud Alibaba版本為2.0.1.RELEASE。
如果使用Spring Cloud Edgware版本,對應Spring Cloud Alibaba版本為1.5.1.RELEASE。Spring Cloud Edgware版本的生命周期已結束,不推薦使用該版本開發應用。
在
src\main\java
下創建Packagecom.aliware.edas
。在Package
com.aliware.edas
中創建服務提供者的啟動類ProviderApplication
,并添加以下代碼。package com.aliware.edas; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
@EnableDiscoveryClient
:表明該應用需開啟服務注冊與發現功能。在Package
com.aliware.edas
中創建EchoController
。package com.aliware.edas; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } }
EchoController
中,指定URL Mapping為/echo/{string}
,指定HTTP方法為GET,從URL路徑中獲取方法參數,并返回收到的參數。在
src\main\resources
路徑下創建文件application.properties
,在application.properties
中添加如下配置,指定Nacos Server的地址。spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
127.0.0.1
為Nacos Server的地址。如果您的Nacos Server部署在另外一臺機器,需修改為對應的IP地址。您可在application.properties
文件中增加其它配置以滿足更多需求。更多信息,請參見配置項參考。驗證服務提供者service-provider是否創建成功。
執行
nacos-service-provider
中ProviderApplication
的main
函數,啟動應用。登錄本地啟動的Nacos Server控制臺
http://127.0.0.1:8848/nacos
。本地Nacos控制臺的默認用戶名和密碼同為nacos。
在左側導航欄,選擇服務管理 > 服務列表。
可以看到服務列表中已經包含
service-provider
,單擊詳情,查詢該服務的詳情。
步驟二:創建服務消費者
本節介紹服務注冊的功能,以及如何配合使用Nacos服務與RestTemplate和FeignClient兩個客戶端。
創建名為
nacos-service-consumer
的Maven工程。在
pom.xml
中添加依賴。<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
在
src\main\java
下創建Packagecom.aliware.edas
。在Package
com.aliware.edas
中配置RestTemplate和FeignClient。在Package
com.aliware.edas
中創建接口類EchoService
,添加@FeignClient
注解,并配置對應的HTTP URL地址及HTTP方法。package com.aliware.edas; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); }
在Package
com.aliware.edas
中創建啟動類ConsumerApplication
并添加相關配置。package com.aliware.edas; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
@EnableDiscoveryClient
:啟用服務注冊與發現。@EnableFeignClients
:激活FeignClient。@LoadBalanced
:集成RestTemplate與服務發現。
在Package
com.aliware.edas
中創建類TestController
以演示和驗證服務發現功能。package com.aliware.edas; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class TestController { @Autowired private RestTemplate restTemplate; @Autowired private EchoService echoService; @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } }
在
src\main\resources
路徑下創建文件application.properties
,在application.properties
中添加以下配置,指定Nacos Server的地址。spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
127.0.0.1
為Nacos Server的地址。如果您的Nacos Server部署在另外一臺機器,需修改為對應的IP地址。您可在application.properties
文件中增加其它配置以滿足更多需求。更多信息,請參見配置項參考。驗證結果。
執行
nacos-service-consumer
中ConsumerApplication
的main
函數,啟動應用。登錄本地啟動的Nacos Server控制臺
http://127.0.0.1:8848/nacos
。本地Nacos控制臺的默認用戶名和密碼同為nacos。
在左側導航欄,選擇服務管理 > 服務列表,可以看到服務列表中已經包含
service-consumer
,單擊詳情,查詢該服務的詳情。
步驟三:本地測試
在本地測試消費者對提供者的服務調用結果。
Linux/Unix/Mac系統:運行以下命令。
curl http://127.0.0.1:18082/echo-rest/rest-rest curl http://127.0.0.1:18082/echo-feign/feign-rest
Windows系統:在瀏覽器中輸入http://127.0.0.1:18082/echo-rest/rest-rest和http://127.0.0.1:18082/echo-feign/feign-rest。
后續步驟
應用開發完成后,即可部署到EDAS。具體操作,請參見應用創建和部署概述(ECS)和創建和部署應用概述(K8s)。
配置項說明
配置項 | Key | 默認值 | 說明 |
服務端地址 | spring.cloud.nacos.discovery.server-addr | 無 | Nacos Server啟動監聽的IP地址和端口。 |
服務名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 當前服務的名稱。 |
網卡名 | spring.cloud.nacos.discovery.network-interface | 無 | 當IP未配置時,注冊的IP為此網卡所對應的IP地址。如果網卡名也未配置,默認取第一塊網卡的地址。 |
注冊的IP地址 | spring.cloud.nacos.discovery.ip | 無 | 注冊到注冊中心的IP地址。優先級最高。 |
注冊的端口 | spring.cloud.nacos.discovery.port | -1 | 默認情況下無需配置,系統會自動探測。設置為-1表示不限端口。 |
命名空間 | spring.cloud.nacos.discovery.namespace | 無 | 常用于隔離不同環境的資源,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。 |
Metadata | spring.cloud.nacos.discovery.metadata | 無 | 使用Map格式配置,您可以根據自己的需求自定義一些和服務相關的元數據信息。 |
集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | Nacos集群的名稱。 |
接入點 | spring.cloud.nacos.discovery.endpoint | 無 | 地域的某個服務的入口域名。通過該域名可以動態地獲取服務端地址,該配置在部署到EDAS時無需填寫。 |
是否集成Ribbon | ribbon.nacos.enabled | true | 是否啟用Ribbon負載均衡。Ribbon是客戶端負載均衡器,通過負載均衡策略選擇其中一個實例處理請求。如果沒有明確需求,無需修改。 |
關于更多Spring Cloud Alibaba Nacos Discovery的信息,請參見開源版本的Nacos Discovery。