將Dubbo應(yīng)用托管到SAE
本文以包含服務(wù)提供者(本文簡稱Provider)和服務(wù)消費者(本文簡稱Consumer)的Dubbo微服務(wù)應(yīng)用為例,介紹如何在本地通過XML配置的方式,開發(fā)Dubbo微服務(wù)示例應(yīng)用,并部署到Serverless 應(yīng)用引擎 SAE(Serverless App Engine)。
為什么托管到SAE
將Dubbo應(yīng)用托管到SAE,您僅需關(guān)注Dubbo應(yīng)用自身的邏輯,無需再關(guān)注注冊中心和配置中心搭建和維護(hù),托管后還可以使用SAE提供的彈性伸縮、一鍵啟停和監(jiān)控等功能,有效降低開發(fā)和運維成本。
當(dāng)您的微服務(wù)應(yīng)用較多時,注冊中心按推薦程度由高到低依次排序如下:
商業(yè)版的服務(wù)注冊中心(MSE)
自建服務(wù)注冊中心
SAE內(nèi)置服務(wù)注冊中心
如果您選擇商業(yè)版的服務(wù)注冊中心,即使用MSE的Nacos作為服務(wù)注冊中心,具體操作,請參見使用MSE的Nacos注冊中心。
如果您選擇使用自建Nacos作為服務(wù)注冊中心,具體操作,請參見使用自建Nacos服務(wù)注冊中心。您需要確認(rèn)以下內(nèi)容:
確保SAE的網(wǎng)絡(luò)與自建Nacos的網(wǎng)絡(luò)互通。
確保
-D
和-XX
參數(shù)未交替使用,以免命令失效。示例代碼如下:修改前:
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
建議在部署應(yīng)用時,使用鏡像或者JAR包方式,并配置啟動參數(shù)
-Dnacos.use.endpoint.parsing.rule=false
和-Dnacos.use.cloud.namespace.parsing=false
。重要啟動參數(shù)需要放在
-jar
之前,否則可能會導(dǎo)致無法使用非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包方式,請在控制臺啟動命令設(shè)置區(qū)域的options設(shè)置文本框輸入
-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false
。圖示為Open JDK 8運行環(huán)境下的Java應(yīng)用。具體操作,請參見設(shè)置啟動命令。
準(zhǔn)備工作
下載Maven并設(shè)置環(huán)境變量。
啟動Nacos Server。
下載并解壓Nacos Server。
進(jìn)入nacos/bin目錄,啟動Nacos Server。
Linux、Unix、macOS系統(tǒng):執(zhí)行命令
sudo sh startup.sh -m standalone
。Windows系統(tǒng):執(zhí)行命令
startup.cmd -m standalone
。
說明standalone
表示單機模式運行,非集群模式。startup.cmd文件默認(rèn)以集群模式啟動,因此您在使用Windows系統(tǒng)時,如果直接雙擊執(zhí)行startup.cmd文件會導(dǎo)致啟動失敗,此時需要在startup.cmd文件內(nèi)設(shè)置MODE="standalone"
。 更多信息,請參見Nacos快速開始。
版本說明
Dubbo 2.7.x, Dubbo 3.0.x 版本的生命周期已于2023年03月結(jié)束,請使用新版本開發(fā)您的應(yīng)用。本文以Dubbo 3.2.15版本為例,介紹如何將Dubbo應(yīng)用托管到SAE。
步驟一:創(chuàng)建服務(wù)提供者
在本地創(chuàng)建一個提供者應(yīng)用工程,添加依賴、配置服務(wù)注冊與發(fā)現(xiàn),并將注冊中心指定為Nacos。
創(chuàng)建Maven項目并引入依賴。
使用IDE(如IntelliJ IDEA或Eclipse)創(chuàng)建一個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>
開發(fā)Dubbo服務(wù)提供者。
Dubbo中服務(wù)都是以接口形式提供。
在src/main/java路徑下創(chuàng)建一個package
com.alibaba.edas
。在
com.alibaba.edas
下創(chuàng)建一個接口(interface)IHelloService
,里面包含一個SayHello
方法。package com.alibaba.edas; public interface IHelloService { String sayHello(String str); }
在
com.alibaba.edas
下創(chuàng)建一個類IHelloServiceImpl
,實現(xiàn)此接口。package com.alibaba.edas; public class IHelloServiceImpl implements IHelloService { public String sayHello(String str) { return "hello " + str; } }
配置Dubbo服務(wù)。
在src/main/resources路徑下創(chuàng)建
provider.xml
文件并打開。在
provider.xml
中,添加Spring相關(guān)的XML Namespace(xmlns)和XML Schema Instance(xmlns:xsi),以及Dubbo相關(guān)的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
中將接口和實現(xiàn)類暴露成Dubbo服務(wù)。<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部署在另外一臺機器,則需要修改成對應(yīng)的IP地址。當(dāng)將應(yīng)用部署到SAE后,無需做任何修改,注冊中心會替換成SAE上的注冊中心的地址。8848
為Nacos Server的端口號,不可修改。
啟動服務(wù)。
在
com.alibaba.edas
中創(chuàng)建類Provider,并按下面的代碼在Provider的main函數(shù)中加載Spring Context,將配置好的Dubbo服務(wù)暴露。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(); } }
執(zhí)行Provider的main函數(shù),啟動服務(wù)。
登錄Nacos控制臺
http://127.0.0.1:8848
,在左側(cè)導(dǎo)航欄中單擊服務(wù)列表,查看提供者列表。可以看到服務(wù)提供者里已經(jīng)包含了
com.alibaba.edas.IHelloService
,且可以查詢該服務(wù)的服務(wù)分組和提供者IP。
步驟二:創(chuàng)建服務(wù)消費者
在本地創(chuàng)建一個消費者應(yīng)用工程,添加依賴、訂閱服務(wù)的配置。
創(chuàng)建Maven項目并引入依賴。
使用IDE(如IntelliJ IDEA或Eclipse)創(chuàng)建一個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>
開發(fā)Dubbo服務(wù)消費者。
Dubbo中服務(wù)都是以接口形式提供。
在src/main/java路徑下創(chuàng)建Package,命名為
com.alibaba.edas
。在
com.alibaba.edas
下創(chuàng)建一個接口(interface)IHelloService
,里面包含一個SayHello
方法。說明通常是在一個單獨的模塊中定義接口,服務(wù)提供者和服務(wù)消費者都通過Maven依賴來引用此模塊。本文為了簡便,服務(wù)提供者和服務(wù)消費者分別創(chuàng)建兩個完全一模一樣的接口,實際使用中不推薦這樣使用。
package com.alibaba.edas; public interface IHelloService { String sayHello(String str); }
配置Dubbo服務(wù)。
在src/main/resources路徑下創(chuàng)建
consumer.xml
文件并打開。在
consumer.xml
中,添加Spring相關(guān)的XML Namespace(xmlns)和XML Schema Instance(xmlns:xsi),以及Dubbo相關(guān)的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服務(wù)。<dubbo:application name="demo-consumer"/> <dubbo:registry address="nacos://127.0.0.1:8848"/> <dubbo:reference id="helloService" interface="com.alibaba.edas.IHelloService"/>
啟動并驗證服務(wù)。
在
com.alibaba.edas
下創(chuàng)建類Consumer,并按下面的代碼在Consumer的main函數(shù)中加載Spring Context,訂閱并消費Dubbo服務(wù)。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(); } } } }
執(zhí)行Consumer的main函數(shù),啟動服務(wù)。
驗證結(jié)果。
啟動后,可以看到控制臺不斷地輸出
hello world
,表明服務(wù)消費成功。登錄Nacos控制臺
http://127.0.0.1:8848
,在左側(cè)導(dǎo)航欄中單擊服務(wù)列表,再在服務(wù)列表頁面選擇調(diào)用者列表。可以看到包含了
com.alibaba.edas.IHelloService
,且可以查看該服務(wù)的服務(wù)分組和調(diào)用者IP。
步驟三:部署到SAE
分別在Provider和Consumer的pom.xml文件中添加如下配置,配置完成后執(zhí)行mvn clean package將本地程序編譯為可執(zhí)行的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應(yīng)用包部署至SAE。具體操作,請參見在SAE控制臺使用JAR文件部署微服務(wù)應(yīng)用。