将Dubbo应用托管到SAE

本文以包含服务提供者(本文简称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应用。具体操作,请参见设置启动命令sc_configure_a_startup_command_for_nacos

准备工作

  • 下载Maven并设置环境变量。

  • 启动Nacos Server。

    1. 下载并解压Nacos Server

    2. 进入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。

  1. 创建Maven项目并引入依赖。

    1. 使用IDE(如IntelliJ IDEA或Eclipse)创建一个Maven项目。

    2. 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>            
  2. 开发Dubbo服务提供者。

    Dubbo中服务都是以接口形式提供。

    1. src/main/java路径下创建一个packagecom.alibaba.edas

    2. com.alibaba.edas下创建一个接口(interface)IHelloService,里面包含一个SayHello方法。

        package com.alibaba.edas;
      
        public interface IHelloService {
            String sayHello(String str);
        }                                
    3. com.alibaba.edas下创建一个类IHelloServiceImpl,实现此接口。

        package com.alibaba.edas;
      
        public class IHelloServiceImpl implements IHelloService {
            public String sayHello(String str) {
                return "hello " + str;
            }
        }                          
  3. 配置Dubbo服务。

    1. src/main/resources路径下创建provider.xml文件并打开。

    2. 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">                               
    3. 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"/>                                
    4. 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的端口号,不可修改。

  4. 启动服务。

    1. 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();
          }
      }                
    2. 执行Provider的main函数,启动服务。

  5. 登录Nacos控制台http://127.0.0.1:8848,在左侧导航栏中单击服务列表,查看提供者列表。

    可以看到服务提供者里已经包含了com.alibaba.edas.IHelloService,且可以查询该服务的服务分组提供者IP

步骤二:创建服务消费者

在本地创建一个消费者应用工程,添加依赖、订阅服务的配置。

  1. 创建Maven项目并引入依赖。

    1. 使用IDE(如IntelliJ IDEA或Eclipse)创建一个Maven项目。

    2. 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>            
  2. 开发Dubbo服务消费者。

    Dubbo中服务都是以接口形式提供。

    1. src/main/java路径下创建Package,命名为com.alibaba.edas

    2. com.alibaba.edas下创建一个接口(interface)IHelloService,里面包含一个SayHello方法。

      说明

      通常是在一个单独的模块中定义接口,服务提供者和服务消费者都通过Maven依赖来引用此模块。本文为了简便,服务提供者和服务消费者分别创建两个完全一模一样的接口,实际使用中不推荐这样使用。

        package com.alibaba.edas;
      
        public interface IHelloService {
            String sayHello(String str);
        }                                
  3. 配置Dubbo服务。

    1. src/main/resources路径下创建consumer.xml文件并打开。

    2. 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">                              
    3. 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"/>
  4. 启动并验证服务。

    1. 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();
                      }
                  }
              }
          }               
    2. 执行Consumer的main函数,启动服务。

  5. 验证结果。

    启动后,可以看到控制台不断地输出hello world,表明服务消费成功。

    登录Nacos控制台http://127.0.0.1:8848,在左侧导航栏中单击服务列表,再在服务列表页面选择调用者列表

    可以看到包含了com.alibaba.edas.IHelloService,且可以查看该服务的服务分组调用者IP

步骤三:部署到SAE

  1. 分别在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>                        
  2. 将编译好的Provider和Consumer应用包部署至SAE。具体操作,请参见在SAE控制台使用JAR文件部署微服务应用