全部产品
云市场

通过 edas-dubbo-extension 将 Dubbo 应用托管到 EDAS(不推荐)

更新时间:2019-08-29 20:09:58

如果您只有简单的 Java 基础和 Maven 经验,而不熟悉 Dubbo,本文档将帮助您从零开始开发 Dubbo 服务,并使用 EDAS 服务注册中心实现服务注册与发现。

注意:EDAS 目前支持的 Dubbo 版本为 2.5.3 到 2.7.0。

  • 如果您使用的 Dubbo 版本为 2.5.3 ~ 2.6.x,对应的edas-dubbo-extension的版本为 1.0.8
  • 如果您使用的 Dubbo 版本为 2.7.0,对应的edas-dubbo-extension的版本改成 2.0.3

如果您熟悉 Dubbo,可以选择性地阅读相关章节。

本文档将以一个提供者和一个消费者为例,向您介绍如何在本地使用 xml 开发服务提供者、消费者,如何部署到 EDAS 中,在 EDAS 服务注册中心完成服务注册,以及实现消费者对提供者的调用。您还可以使用 Spring Boot 开发 Dubbo 应用

本地开发中主要描述开发中涉及的关键信息,如果您想了解完整的 Dubbo 服务程序,可下载 edas-dubbo-demo

为什么使用 EDAS 服务注册中心

EDAS 服务注册中心实现了 Dubbo 所提供的 SPI 标准的注册中心扩展,能够完整地支持 Dubbo 服务注册、路由规则配置规则功能。

EDAS 服务注册中心能够完全代替 ZooKeeper 和 Redis,作为您 Dubbo 服务的注册中心。同时,与 ZooKeeper 和 Redis 相比,还具有以下优势:

  • EDAS 服务注册中心为共享组件,节省了您运维、部署 ZooKeeper 等组件的机器成本。
  • EDAS 服务注册中心在通信过程中增加了鉴权加密功能,为您的服务注册链路进行了安全加固。
  • EDAS 服务注册中心与 EDAS 其他组件紧密结合,为您提供一整套的微服务解决方案。

本地开发

准备工作

  • 下载、启动并配置轻量级配置中心。

    为了便于本地开发,EDAS 提供了一个包含了 EDAS 服务注册中心基本功能的轻量级配置中心。基于轻量级配置中心开发的应用无需修改任何代码和配置就可以部署到 EDAS 中。

    请您参考配置轻量级配置中心进行下载、启动及配置。推荐使用最新版本。

  • 下载 Maven 并设置环境变量(如已安装可跳过)。

创建服务提供者

在本地创建一个提供者应用工程,添加依赖,配置服务注册与发现,并将注册中心指定为 EDAS 轻量级配置中心。

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

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

    2. 在 Maven 项目中的pom.xml文件中添加 dubboedas-dubbo-extension 依赖,版本分别为 2.6.21.0.8

      1. <dependencies>
      2. <dependency>
      3. <groupId>com.alibaba</groupId>
      4. <artifactId>dubbo</artifactId>
      5. <version>2.6.2</version>
      6. </dependency>
      7. <dependency>
      8. <groupId>com.alibaba.edas</groupId>
      9. <artifactId>edas-dubbo-extension</artifactId>
      10. <version>1.0.8</version>
      11. </dependency>
      12. </dependencies>
  2. 开发 Dubbo 服务提供者。

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

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

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

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

      1. package com.alibaba.edas;
      2. public class IHelloServiceImpl implements IHelloService {
      3. public String sayHello(String str) {
      4. return "hello " + str;
      5. }
      6. }
  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)。

      1. <beans xmlns="http://www.springframework.org/schema/beans"
      2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      3. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
      4. xsi:schemaLocation="http://www.springframework.org/schema/beans
      5. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
      6. http://code.alibabatech.com/schema/dubbo
      7. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    3. provider.xml 中将接口和实现类暴露成 Dubbo 服务。

      1. <dubbo:application name="demo-provider"/>
      2. <dubbo:protocol name="dubbo" port="28082"/>
      3. <dubbo:service interface="com.alibaba.edas.IHelloService" ref="helloService"/>
      4. <bean id="helloService" class="com.alibaba.edas.IHelloServiceImpl"/>
    4. provider.xml 中将注册中心指定为 EDAS 轻量级配置中心。

      其中 127.0.0.1 为轻量级配置中心的地址,如果您的轻量级配置中心部署在另外一台机器,则需要修改成对应的 IP 地址。由于轻量级配置中心不支持修改端口,所以端口必须使用 8080。

      1. <dubbo:registry id="edas" address="edas://127.0.0.1:8080"/>
  4. 启动服务。

    1. com.alibaba.edas中创建类 Provider,并按下面的代码在 Provider 的 main 函数中加载 Spring Context,将配置好的 Dubbo 服务暴露。

      1. package com.alibaba.edas;
      2. import org.springframework.context.support.ClassPathXmlApplicationContext;
      3. public class Provider {
      4. public static void main(String[] args) throws Exception {
      5. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"provider.xml"});
      6. context.start();
      7. System.in.read();
      8. }
      9. }
    2. 执行 Provider 的 main 函数,启动服务。

  5. 登录轻量级配置中心控制台 http://127.0.0.1:8080,在左侧导航栏中单击服务列表 ,查看提供者列表。可以看到服务提供者里已经包含了 com.alibaba.edas.IHelloService,且可以查询该服务的服务分组提供者 IP

创建服务消费者

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

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

    步骤和创建服务提供者相同,不再赘述。具体步骤可参考创建服务提供者的相关步骤。

  2. 开发 Dubbo 服务。

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

    1. src/main/java路径下创建 package com.alibaba.edas

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

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

      1. package com.alibaba.edas;
      2. public interface IHelloService {
      3. String sayHello(String str);
      4. }
  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)。

      1. <beans xmlns="http://www.springframework.org/schema/beans"
      2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      3. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
      4. xsi:schemaLocation="http://www.springframework.org/schema/beans
      5. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
      6. http://code.alibabatech.com/schema/dubbo
      7. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    3. consumer.xml 中添加如下配置,订阅 Dubbo 服务。

      1. <dubbo:application name="demo-consumer"/>
      2. <dubbo:registry id="edas" address="edas://127.0.0.1:8080"/>
      3. <dubbo:reference id="helloService" interface="com.alibaba.edas.IHelloService"/>
  4. 启动、验证服务。

    1. com.alibaba.edas下创建类 Consumer,并按下面的代码在 Consumer 的 main 函数中加载 Spring Context,订阅并消费 Dubbo 服务。

      1. package com.alibaba.edas;
      2. import org.springframework.context.support.ClassPathXmlApplicationContext;
      3. import java.util.concurrent.TimeUnit;
      4. public class Consumer {
      5. public static void main(String[] args) throws Exception {
      6. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"});
      7. context.start();
      8. while (true) {
      9. try {
      10. TimeUnit.SECONDS.sleep(5);
      11. IHelloService demoService = (IHelloService)context.getBean("helloService");
      12. String result = demoService.sayHello("world");
      13. System.out.println(result);
      14. } catch (Exception e) {
      15. e.printStackTrace();
      16. }
      17. }
      18. }
      19. }
    2. 执行 Consumer 的 main 函数,启动服务。

  5. 验证创建结果。

    1. 启动后,可以看到控制台不断地输出 hello world,表明服务消费成功。
    2. 登录轻量级配置中心控制台 http://127.0.0.1:8080,在左侧导航栏中单击服务列表 ,再在服务列表页面选择调用者列表

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

部署到 EDAS

edas-dubbo-extension 在设计之初就考虑到了从本地迁移到 EDAS 的场景,您可以直接将应用部署到 EDAS 中。

注意:各类型集群(环境)都支持 Spring Cloud 应用(使用 ANS 进行服务注册和发现),详情见下表:

集群(环境)类型 额外配置
ECS 集群
Swarm 集群 需要在应用详情页 > 应用设置 > 配置 JVM 参数时添加 -Dalicloud.deployment.mode=EDAS_MANAGED (Swarm集群将在未来某个时间下线,不推荐用来部署原生 SpringCloud 应用)。
容器服务 Kubernetes 集群 无(按照文档要求制作镜像即可)
Serverless 环境
  1. 分别在 Provider 和 Consumer 的 pom.xml 文件中添加如下配置,然后执行 mvn clean package 将本地的程序打成可执行的 JAR 包。

    • Provider

      1. <build>
      2. <plugins>
      3. <plugin>
      4. <groupId>org.springframework.boot</groupId>
      5. <artifactId>spring-boot-maven-plugin</artifactId>
      6. <executions>
      7. <execution>
      8. <goals>
      9. <goal>repackage</goal>
      10. </goals>
      11. <configuration>
      12. <classifier>spring-boot</classifier>
      13. <mainClass>com.alibaba.edas.Provider</mainClass>
      14. </configuration>
      15. </execution>
      16. </executions>
      17. </plugin>
      18. </plugins>
      19. </build>
    • Consumer

      1. <build>
      2. <plugins>
      3. <plugin>
      4. <groupId>org.springframework.boot</groupId>
      5. <artifactId>spring-boot-maven-plugin</artifactId>
      6. <executions>
      7. <execution>
      8. <goals>
      9. <goal>repackage</goal>
      10. </goals>
      11. <configuration>
      12. <classifier>spring-boot</classifier>
      13. <mainClass>com.alibaba.edas.Consumer</mainClass>
      14. </configuration>
      15. </execution>
      16. </executions>
      17. </plugin>
      18. </plugins>
      19. </build>
  2. 根据您要部署的集群类型,参考对应的文档部署应用。