您可以通过更改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注册中心中的服务。

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

将应用程序从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 不支持