本文以包含服務提供者(本文簡稱Provider)和服務消費者(本文簡稱Consumer)的Dubbo微服務應用為例,介紹如何在本地通過XML配置的方式,開發Dubbo微服務示例應用,并部署到Serverless 應用引擎 SAE(Serverless App Engine)。
為什么托管到SAE
將Dubbo應用托管到SAE,您僅需關注Dubbo應用自身的邏輯,無需再關注注冊中心和配置中心搭建和維護,托管后還可以使用SAE提供的彈性伸縮、一鍵啟停和監控等功能,有效降低開發和運維成本。
當您的微服務應用較多時,注冊中心按推薦程度由高到低依次排序如下:
商業版的服務注冊中心(MSE)
自建服務注冊中心
SAE內置服務注冊中心
如果您選擇商業版的服務注冊中心,即使用MSE的Nacos作為服務注冊中心,具體操作,請參見使用MSE的Nacos注冊中心。
如果您選擇使用自建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應用。具體操作,請參見設置啟動命令。
準備工作
下載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快速開始。
版本說明
Dubbo 2.7.x, Dubbo 3.0.x 版本的生命周期已于2023年03月結束,請使用新版本開發您的應用。本文以Dubbo 3.2.15版本為例,介紹如何將Dubbo應用托管到SAE。
步驟一:創建服務提供者
在本地創建一個提供者應用工程,添加依賴、配置服務注冊與發現,并將注冊中心指定為Nacos。
創建Maven項目并引入依賴。
使用IDE(如IntelliJ IDEA或Eclipse)創建一個Maven項目。
在
pom.xml
文件中添加dubbo、dubbo-registry-nacos和nacos-client依賴。<dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.2.15</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>3.2.15</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.1.1</version> </dependency> </dependencies>
開發Dubbo服務提供者。
Dubbo中服務都是以接口形式提供。
在src/main/java路徑下創建一個package
com.alibaba.edas
。在
com.alibaba.edas
下創建一個接口(interface)IHelloService
,里面包含一個SayHello
方法。package com.alibaba.edas; public interface IHelloService { String sayHello(String str); }
在
com.alibaba.edas
下創建一個類IHelloServiceImpl
,實現此接口。package com.alibaba.edas; public class IHelloServiceImpl implements IHelloService { public String sayHello(String str) { return "hello " + str; } }
配置Dubbo服務。
在src/main/resources路徑下創建
provider.xml
文件并打開。在
provider.xml
中,添加Spring相關的XML Namespace(xmlns)和XML Schema Instance(xmlns:xsi),以及Dubbo相關的Namespace(xmlns:dubbo)和Schema Instance(xsi:schemaLocation)。<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
在
provider.xml
中將接口和實現類暴露成Dubbo服務。<dubbo:application name="demo-provider"/> <dubbo:protocol name="dubbo" port="28082"/> <dubbo:service interface="com.alibaba.edas.IHelloService" ref="helloService"/> <bean id="helloService" class="com.alibaba.edas.IHelloServiceImpl"/>
在
provider.xml
中將注冊中心指定為本地啟動的Nacos Server。<dubbo:registry address="nacos://127.0.0.1:8848" />
127.0.0.1
為Nacos Server的地址。如果您的Nacos Server部署在另外一臺機器,則需要修改成對應的IP地址。當將應用部署到SAE后,無需做任何修改,注冊中心會替換成SAE上的注冊中心的地址。8848
為Nacos Server的端口號,不可修改。
啟動服務。
在
com.alibaba.edas
中創建類Provider,并按下面的代碼在Provider的main函數中加載Spring Context,將配置好的Dubbo服務暴露。package com.alibaba.edas; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"provider.xml"}); context.start(); System.in.read(); } }
執行Provider的main函數,啟動服務。
登錄Nacos控制臺
http://127.0.0.1:8848
,在左側導航欄中單擊服務列表,查看提供者列表。可以看到服務提供者里已經包含了
com.alibaba.edas.IHelloService
,且可以查詢該服務的服務分組和提供者IP。
步驟二:創建服務消費者
在本地創建一個消費者應用工程,添加依賴、訂閱服務的配置。
創建Maven項目并引入依賴。
使用IDE(如IntelliJ IDEA或Eclipse)創建一個Maven項目。
在
pom.xml
文件中添加dubbo、dubbo-registry-nacos和nacos-client依賴。<dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.2.15</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>3.2.15</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.1.1</version> </dependency> </dependencies>
開發Dubbo服務消費者。
Dubbo中服務都是以接口形式提供。
在src/main/java路徑下創建Package,命名為
com.alibaba.edas
。在
com.alibaba.edas
下創建一個接口(interface)IHelloService
,里面包含一個SayHello
方法。說明通常是在一個單獨的模塊中定義接口,服務提供者和服務消費者都通過Maven依賴來引用此模塊。本文為了簡便,服務提供者和服務消費者分別創建兩個完全一模一樣的接口,實際使用中不推薦這樣使用。
package com.alibaba.edas; public interface IHelloService { String sayHello(String str); }
配置Dubbo服務。
在src/main/resources路徑下創建
consumer.xml
文件并打開。在
consumer.xml
中,添加Spring相關的XML Namespace(xmlns)和XML Schema Instance(xmlns:xsi),以及Dubbo相關的Namespace(xmlns:dubbo)和Schema Instance(xsi:schemaLocation)。<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
在
consumer.xml
中添加如下配置,訂閱Dubbo服務。<dubbo:application name="demo-consumer"/> <dubbo:registry address="nacos://127.0.0.1:8848"/> <dubbo:reference id="helloService" interface="com.alibaba.edas.IHelloService"/>
啟動并驗證服務。
在
com.alibaba.edas
下創建類Consumer,并按下面的代碼在Consumer的main函數中加載Spring Context,訂閱并消費Dubbo服務。package com.alibaba.edas; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.concurrent.TimeUnit; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"}); context.start(); while (true) { try { TimeUnit.SECONDS.sleep(5); IHelloService demoService = (IHelloService)context.getBean("helloService"); String result = demoService.sayHello("world"); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } } }
執行Consumer的main函數,啟動服務。
驗證結果。
啟動后,可以看到控制臺不斷地輸出
hello world
,表明服務消費成功。登錄Nacos控制臺
http://127.0.0.1:8848
,在左側導航欄中單擊服務列表,再在服務列表頁面選擇調用者列表。可以看到包含了
com.alibaba.edas.IHelloService
,且可以查看該服務的服務分組和調用者IP。
步驟三:部署到SAE
分別在Provider和Consumer的pom.xml文件中添加如下配置,配置完成后執行mvn clean package將本地程序編譯為可執行的JAR包。
Provider
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>spring-boot</classifier> <mainClass>com.alibaba.sae.Provider</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
Consumer
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>spring-boot</classifier> <mainClass>com.alibaba.sae.Consumer</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
將編譯好的Provider和Consumer應用包部署至SAE。具體操作,請參見在SAE控制臺使用JAR文件部署微服務應用。