本文以包含服务提供者 Provider 和服务消费者 Consumer 的 Dubbo 微服务应用为例,介绍如何在本地通过 XML 配置的方式,开发 Dubbo 微服务示例应用,并部署到 SAE。

为什么托管到 SAE

将 Dubbo 应用托管到 SAE,您仅需关注 Dubbo 应用自身的逻辑,无需再关注注册中心和配置中心搭建和维护,托管后还可以使用 SAE 提供的弹性伸缩、一键启停、监控等功能,大大降低开发和运维成本。

说明 如果您坚持使用自建 Nacos 为服务注册中心,请参见如何搭建 Nacos 为服务注册中心(不推荐)进行搭建。

准备工作

在开始开发前,请确保您已经完成以下工作:

  • 下载 Maven 并设置环境变量。
  • 下载最新版本的 Nacos Server
  • 按以下步骤启动 Nacos Server。
    1. 解压下载的 Nacos Server 压缩包
    2. 进入nacos/bin目录,启动 Nacos Server。
      • Linux/Unix/Mac 系统:执行命令sh startup.sh -m standalone
      • Windows 系统:双击执行startup.cmd文件。

创建服务提供者

在本地创建一个提供者应用工程,添加依赖,配置服务注册与发现,并将注册中心指定为 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>2.7.3</version>
          </dependency>
      
          <dependency>
              <groupId>org.apache.dubbo</groupId>
              <artifactId>dubbo-registry-nacos</artifactId>
              <version>2.7.3</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 方法。
        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) 和 Scheme 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 后,无需做任何修改,注册中心会替换成EDAS上的注册中心的地址。
      • 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>2.7.3</version>
          </dependency>
      
          <dependency>
              <groupId>org.apache.dubbo</groupId>
              <artifactId>dubbo-registry-nacos</artifactId>
              <version>2.7.3</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) 和 Scheme 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. 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
    说明
    • 使用自建Nacos时请确保SAE的网络与自建Nacos的网络互通。
    • 使用自建Nacos为服务注册中心,在部署应用时建议使用镜像方式或者JAR包方式,并配置启动参数-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false
      • 如采用镜像方式,请将-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false配置在镜像文件中。Docker镜像制作方法参见制作应用容器Docker镜像
      • 如采用JAR包方式,请在控制台启动命令设置区域的options设置文本框输入-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false

更多信息

问题反馈

如果您在使用 SAE 过程中有任何疑问,欢迎您扫描下面的二维码加入钉钉群进行反馈。问题反馈