您可以通过更改 Dubbo 应用配置、配置多注册中心和将 JAR 转换成 WAR 等步骤将使用 Dubbo 开发的应用迁移到 HSF。不过,由于 EDAS 已经支持原生 Dubbo 框架的应用,所以新用户不推荐使用这种开发方式。

背景信息

原生 Dubbo 框架下的应用开发请参见使用 Spring Boot 开发 Dubbo 微服务应用

更改 Dubbo 应用配置

目前 Dubbo 应用(包括服务提供者和服务消费者)在 EDAS 中支持两种配置的方式:XML 文件配置和注解配置。本文提供这两种方式的配置示例。

注意 将使用 Dubbo 开发的应用迁移到 HSF,其中的 Dubbo 版本需在 2.5.3 ~ 2.6.0 之间。

XML 文件配置方式

以下是 Dubbo XML 配置示例,设置正确则不需要做修改即可直接放入 EDAS 中运行。

通过 XML 文件配置服务生产者

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="edas-dubbo-demo-provider" ></dubbo:application>
<bean id="demoProvider" class="com.alibaba.edas.dubbo.demo.provider.DemoProvider" ></bean>
<dubbo:registry address="zookeeper://127.0.0.1:2181" ></dubbo:registry>

<dubbo:protocol name="dubbo" port="20880" threadpool="cached"
threads="100" ></dubbo:protocol>

<dubbo:service delay="-1" interface="com.alibaba.edas.dubbo.demo.api.DemoApi"
ref="demoProvider" version="1.0.0" group="dubbogroup" retries="3" timeout="3000"></dubbo:service>

</beans>
			
注意
  • 可选配置包括 threadpool、threads、delay、version、retries、timeout,其他均为必选配置。配置项可以任意调换位置。
  • Dubbo 的 RPC 协议支持多种方式,如 RMI, hessian 等,但是目前 EDAS 的适配方案只支持了 Dubbo 协议,如:<dubbo:protocol name="dubbo" port=“20880”>,否则会引起类似于:”com.alibaba.dubbo.config.ServiceConfig service [xx.xx.xxx] contain xx protocal,HSF not supportted” 的错误发生。

通过 XML 文件配置服务消费者

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="edas-dubbo-consumer" />
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<dubbo:reference id="demoProviderApi"
interface="com.alibaba.edas.dubbo.demo.api.DemoApi" version="1.0.0" group="dubbogroup" lazy="true" loadbalance="random">
<!-- 指定某个方法不用等待返回值 -->
<dubbo:method name="sayMsg" async="true" return="false" />
</dubbo:reference>
<bean id="demoConsumer" class="com.alibaba.edas.dubbo.demo.consumer.DemoConsumer"
init-method="reviceMsg">
<property name="demoApi" ref="demoProviderApi"></property>
</bean>
</beans>
			
注意
  • 可选配置包括 version、group、lazy、loadbalance、async、return,其他选项为必须。配置项可以任意调换位置。
  • 注册中心在 EDAS 中是不生效的,所有 Dubbo 的服务会自动注册到 EDAS 的配置中心,您无需关心。
  • 由于 Dubbo 配置文件消费者可以指定多个分组,而 EDAS 目前只能通过 group 属性配置一个分组,无法指定多个分组。
  • 当有业务需要在程序启动过程中加载服务,则需要设置 lazy=true,进行延迟加载

注解配置方式

从 EDAS-Container 3.0 版本开始,EDAS 已经支持 Dubbo 原生注解,您无需进行注解转换 XML 即可使用 EDAS 服务。

兼容说明:

  • 服务发布注解: @Service
  • 服务订阅注解: @Reference

支持属性:group、version、timeout

使用方式:在创建容器的时候,选择最新 EDAS-Container 版本即可。

配置多注册中心

有时候需要的服务不在同一个 EDAS、ZooKeeper 注册中心上,则需要在 Dubbo 配置文件中配置多个注册中心。例如:有些服务来不及在北京部署,只在上海部署,而北京的其他应用需要引用此服务,就可以将服务同时注册到两个注册中心。

多订阅指 Dubbo/HSF 应用去消费一个服务时,可以同时订阅 EDAS、ZooKeeper 注册中心中的服务。


  1. 在应用中加入 1.5.1 及后续版本的 edas-sdk 依赖。

    <dependency>
        <groupId>com.alibaba.edas</groupId>
        <artifactId>edas-sdk</artifactId>
        <version>1.5.1</version>
    </dependency>
    						

  2. 指定 ZooKeeper 注册/订阅中心地址。

    指定方式主要包含以下两种:

    • 环境变量指定(支持 HSF 、Dubbo 应用):

      -Dhsf.registry.address=zookeeper://IP 地址:端口

    • XML 指定方式(只支持 HSF 应用):

      <hsf:registry address="zookeeper://IP 地址:端口" />

    指定 ZooKeeper 地址后,Dubbo 应用默认会启动双注册和订阅。HSF 应用若需要启用双注册/订阅,还需要设置调用参数 invokeType 。


  3. 设置 HSF 应用多注册中心的调用参数。

    • 只注册/订阅 ConfigServer 中的服务:invokeType="hsf"
    • 只注册/订阅 ZooKeeper 中的服务: invokeType="dubbo"
    • 双订阅/注册:invokeType="hsf,dubbo"

  4. 创建应用时,需要选择不低于 3.0 版本的 EDAS-Container,然后上传启动即可。

说明
  • 分组问题:Dubbo 服务分组默认为空,EDAS 里服务分组默认是 HSF。因此务必修改 Dubbo 服务分组。
  • 版本问题:Dubbo 服务版本默认是0.0.0,EDAS 里面服务版本默认是1.0.0,因此务必修改 Dubbo 服务版本。
  • 订阅成功,调用不成功:EDAS 里面存在鉴权,故若要让 Dubbo 调用成功,则需关闭 EDAS 里面服务鉴权,参数为-DneedAuth=false,需要在 JVM 参数中设置,重启即可。

将应用程序从 JAR 转换为 WAR

HSF 只支持 WAR 形式的 Web 项目,所以如果你的应用程序是以 JAR 包发布的,需要先转换为 WAR。下面以 Maven 项目为例说明。

  1. pom.xml文件中将 packaging 由 JAR 改为 WAR。图片01
  2. 如果没有web.xml,则需要增加一个web.xml文件配置。图片02
  3. web.xml中配置加载配置文件。
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:hsf-provider-beans.xml</param-value>
    </context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>
    						

检查 Dubbo 和 HSF 的配置兼容性

对照下表,检查 Dubbo 配置文件中的服务属性与 HSF 的兼容情况。检查完配置兼容性之后,即可按照前面文档介绍的内容进行应用的调试与发布。

功能特性 Dubbo 配置参数 兼容情况说明 错误提示 EDAS 是否支持
超时 timeout 支持
延迟暴露 delay 支持
线程模型 dispatcher= "all" threadpool= "fixed" threads= "100" 支持
回声测试 支持
延迟 lazy= "true" 默认开启 支持
连接
本地调用 protocol= "injvm" 支持
隐式传参 支持
并发控制 actives=“10” executes=“10” 已经实现 EDAS 控制台可视化配置,限流降级-限流规则-限流粒度 支持
连接控制 accepts=“10” connections="2" 已经实现 EDAS 控制台可视化配置,限流降级-限流规则-限流粒度 支持
服务降级 已经实现 EDAS 控制台可视化配置,限流降级-降级规则 支持
集群容错 retries/cluster 支持 retries 无报错 部分支持
负载均衡 loadbalance 默认 random 无报错 部分支持
服务分组 group 不支持 * 配置 java.lang.IllegalStateException: hsf2 不支持同时消费多个分组! 部分支持
多版本 version 不支持 * 配置 [HSF-Consumer] 未找到需要调用的服务的目标地址 部分支持
异步调用 async=“true" return="false" return 参数无效 无报错 部分支持
启动时检查 check EDAS 默认是启动不检查 无报错 默认支持启动不检查
多协议 只支持 Dubbo 协议 com.alibaba.dubbo.config.ServiceConfig 服务[com.alibaba.demo.api.DemoApi] 配置了 RMI 协议, HSF2 不支持 部分支持
路由规则 已经实现 EDAS 控制台可视化配置,无需配置 支持
配置规则 已经实现 EDAS 控制台可视化配置,无需配置 支持
多注册中心 不支持
分组聚合 group= "aaa,bbb" merger= "true" 报错 java.lang.IllegalStateException: hsf2 不支持同时消费多个分组! 不支持
上下文信息 报错 Caused by: java.lang.UnsupportedOperationException: not support getInvocation method in hsf2 不支持