本文以包含服務提供者和服務消費者的Spring Cloud應用為例,讓您快速體驗如何在本地開發、調試Spring Cloud應用并部署到SAE,實現應用的服務注冊與發現,以及消費者對提供者的調用。
背景信息
如果您對Spring Cloud很陌生,僅了解Spring和Maven基礎知識,那么閱讀本文后,您將掌握如何通過Spring Cloud Alibaba Nacos Discovery實現Spring Cloud應用的服務注冊與發現,以及實現消費者對提供者的調用。
如果您熟悉Spring Cloud中的Eureka、Consul和ZooKeeper等服務注冊組件,但未使用過Spring Cloud Alibaba的服務注冊組件Nacos Discovery,那么您僅需將服務注冊組件的服務依賴關系和服務配置替換成Spring Cloud Alibaba Nacos Discovery,無需修改任何代碼。
Spring Cloud Alibaba Nacos Discovery同樣實現了Spring Cloud Registry的標準接口與規范,與您之前使用Spring Cloud接入服務注冊與發現的方式基本一致。
如果您熟悉如何使用開源版本的Spring Cloud Alibaba Nacos Discovery實現Spring Cloud應用的服務注冊與發現,那么您可以將應用直接部署到SAE,即可使用到SAE提供的商業版服務注冊與發現的能力。更多信息,請參見應用托管概述。
為什么使用SAE服務注冊中心
SAE服務注冊中心提供了開源Nacos Server的商用版本,使用開源版本Spring Cloud Alibaba Nacos Discovery開發的應用可以直接使用SAE提供的商業版服務注冊中心。
SAE服務注冊中心與Nacos、Eureka和Consul相比,具有以下優勢:
共享組件,節省了部署、運維Nacos、Eureka或Consul的成本。
在服務注冊和發現的調用中都進行了鏈路加密,保護您的服務,無需再擔心服務被未授權的應用發現。
SAE服務注冊中心與SAE其他組件緊密結合,為您提供一整套的微服務解決方案,包括環境隔離、灰度發布等。
您在SAE部署應用時,SAE服務注冊中心以高優先級自動設置Nacos Server服務端地址和服務端口,以及命名空間、AccessKey、Context-path等信息,無需進行任何額外的配置。
當您的微服務應用較多時,注冊中心按推薦程度由高到低依次排序如下。
搭建并部署商業版的服務注冊中心(使用MSE的Nacos作為服務注冊中心)的具體操作,請參見使用MSE的Nacos注冊中心。
搭建并部署自建Nacos注冊中心時,您需要確認以下內容。
確保SAE的網絡與自建Nacos的網絡互通。
確保
-D
和-XX
參數未交替使用,以免命令失效。示例代碼如下:修改前:
java -Dalicloud.deployment.mode=EDAS_MANAGED -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+UnlockExperimentalVMOptions -XX:+UseWisp2 -Dio.netty.transport.noNative=true -XX:+UseG1GC -Dspring.profiles.active=yace -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar /home/admin/app/xx-server.jar
修改后:
java -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+UnlockExperimentalVMOptions -XX:+UseWisp2 -Dio.netty.transport.noNative=true -XX:+UseG1GC -Dspring.profiles.active=yace -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar /home/admin/app/xx-server.jar
建議在部署應用時,使用鏡像或者JAR包方式,并配置啟動參數
-Dnacos.use.endpoint.parsing.rule=false
和-Dnacos.use.cloud.namespace.parsing=false
。重要啟動參數需要放在
-jar
之前,否則可能會導致無法使用非SAE自帶的注冊中心。如果采用鏡像方式,請將
-Dnacos.use.endpoint.parsing.rule=false
和-Dnacos.use.cloud.namespace.parsing=false
配置在鏡像文件的程序啟動命令中。Docker鏡像制作方法,請參見制作Java鏡像。示例代碼如下:
RUN echo 'eval exec java -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
如果采用JAR包方式,請在控制臺啟動命令設置區域的options設置文本框輸入
-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false
。圖示為Open JDK 8運行環境下的Java應用。具體操作,請參見設置啟動命令。
SAE提供Java微服務自動尋址的Nacos Server能力,您可以通過SAE的服務注冊發現功能配置。具體操作,請參見使用SAE內置Nacos。
準備工作
下載Maven并設置環境變量。
啟動Nacos Server。
下載并解壓Nacos Server。
進入nacos/bin目錄,啟動Nacos Server。
Linux、Unix、macOS系統:執行命令
sudo sh startup.sh -m standalone
。Windows系統:執行命令
startup.cmd -m standalone
。
說明standalone
表示單機模式運行,非集群模式。startup.cmd文件默認以集群模式啟動,因此您在使用Windows系統時,如果直接雙擊執行startup.cmd文件會導致啟動失敗,此時需要在startup.cmd文件內設置MODE="standalone"
。 更多信息,請參見Nacos快速開始。
步驟一:創建服務提供者
在本地創建服務提供者應用工程,添加依賴,開啟服務注冊與發現功能,并將注冊中心指定為Nacos Server。
創建命名為
nacos-service-provider
的Maven工程。在
pom.xml
文件中添加依賴。具體示例,請參見nacos-service-provider。本文以Spring Boot 2.1.4.RELEASE和Spring Cloud Greenwich.SR1為例,依賴如下:
說明不支持Spring Boot 2.4及以上版本。支持Spring Cloud Alibaba2.2.6.RELEASE版本(1.4.2客戶端版本)。
<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.0.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
,并添加以下代碼。其中
@EnableDiscoveryClient
注解表明此應用需開啟服務注冊與發現功能。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); } }
在Package
com.aliware.edas
中創建EchoController
。EchoController
中,指定URL mapping為/echo/{string}
,指定HTTP方法為GET,從URL路徑中獲取方法參數,并回顯收到的參數。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; } }
在
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
文件中增加配置。更多信息,請參見配置項參考。驗證結果。
執行
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
中添加依賴。具體示例,請參見nacos-service-consumer。
<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.0.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
并添加相關配置。使用
@EnableDiscoveryClient
注解啟用服務注冊與發現。使用
@EnableFeignClients
注解激活FeignClient。添加
@LoadBalanced
注解將RestTemplate與服務發現集成。
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); } }
在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、macOS系統:運行以下命令。
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。
步驟四:將應用部署到SAE
在本地完成應用的開發和測試后,便可將應用打包并部署到SAE。具體步驟,請參見創建應用。
SAE不支持創建空應用,因此第一次部署需在控制臺完成。
如果使用JAR包部署,在應用部署配置時選擇應用運行環境為標準Java應用運行環境。
如果使用WAR包部署,在應用部署配置時應用運行環境為apache-tomcat-XXX。
當您將應用部署到SAE時,SAE服務注冊中心會以更高優先級去設置Nacos Server服務端地址和服務端口,以及命名空間、AccessKey、Context-path信息。您無需進行任何額外的配置,原有的配置內容可以選擇保留或刪除。
步驟五:結果驗證
配置項參考
配置項 | 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 | 無 | 高優先級。 |
注冊的端口 | spring.cloud.nacos.discovery.port | -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 | 無 | 地域的某個服務的入口域名。通過此域名可以動態地獲取服務端地址,此配置在部署到SAE時無需填寫。 |
是否集成Ribbon | ribbon.nacos.enabled | true | 如果沒有明確需求,不需要修改。 |
更多關于Spring Cloud Alibaba Nacos Discovery的信息,請參見開源版本的Nacos Discovery。