您可以将 Dubbo 微服务应用托管到 EDAS,使用 EDAS 提供的共享组件、企业级安全加固和完整的微服务解决方案,帮助您节省运维成本、提升安全性和开发效率。本文将介绍如何在本地通过 XML 配置的方式开发一个 Dubbo 微服务示例应用(包含一个服务提供者 Provider 和一个服务消费者 Consumer)并部署到 EDAS。

背景信息

您只需要关注 Dubbo 应用自身的逻辑,无需再关注注册中心、配置中心和元数据中心的搭建和维护,托管后还可以使用 EDAS 提供的弹性伸缩、限流降级、监控及微服务治理能力,而且整个托管过程对您来说是完全透明的,不会增加您的理解成本和开发成本。

如果已有 Dubbo 应用,可以直接部署到 EDAS 的 ECS 或 K8s 集群,详情请参见应用部署概述(ECS 集群)应用部署概述(K8s集群)

准备工作

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

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

在本地开发应用时,可以使用 Alibaba Cloud Toolkit 插件实现本地应用和部署在 EDAS 中的应用的相互调用,即端云互联,而无需搭建 VPN,帮助您提升开发效率。详情请参见端云互联简介

版本说明

EDAS 支持托管 2.5.x,2.6.x,2.7.x 版本的 Dubbo。推荐使用 2.7.x,可以获得更强大的服务治理能力。本文将会以 2.7.3 版本为例,介绍如何将 Dubbo 应用托管到 EDAS

创建服务提供者

在本地创建一个提供者应用工程,添加依赖,配置服务注册与发现,并将注册中心指定为 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 地址。当将应用部署到 EDAS 后,无需做任何修改,注册中心会替换成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

部署到 EDAS

应用可以直接部署到 EDAS 中,无需做任何修改,注册中心会被自动替换为 EDAS 上的注册中心。

您可以根据实际需求选择部署的集群类型(主要为 ECS 集群或容器服务 Kubernetes 集群)和部署途径(控制台或工具),详情请参见在 ECS 集群中部署应用在容器服务K8s集群中使用镜像方式部署应用

说明 EDAS 集成的 ACM 即 Nacos 的正式商用版本。当您将应用部署到 EDAS 的时候,EDAS 会自动替换您本地 Nacos Server 的地址和服务端口(127.0.0.1:8848),您无需修改。

如果您使用控制台部署,在部署前,需要在本地应用程序中完成以下操作:

  1. pom.xml文件中添加以下打包插件的配置。
    • 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.edas.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.edas.Consumer</mainClass>
                         </configuration>
                     </execution>
                 </executions>
             </plugin>
       </plugins>
      </build>
      							
  2. 执行 mvn clean package 将本地的程序打成 JAR 包。

在将 Dubbo 微服务应用部署到 EDAS 后,您可以使用 EDAS 进行微服务治理,详情请参见黑白名单

更多信息