全部产品
云市场

将使用 Dubbo 开发的应用迁移到 HSF (不推荐)

更新时间:2019-08-17 22:28:41

您可以通过更改 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 文件配置服务生产者

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  5. http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  6. <dubbo:application name="edas-dubbo-demo-provider" ></dubbo:application>
  7. <bean id="demoProvider" class="com.alibaba.edas.dubbo.demo.provider.DemoProvider" ></bean>
  8. <dubbo:registry address="zookeeper://127.0.0.1:2181" ></dubbo:registry>
  9. <dubbo:protocol name="dubbo" port="20880" threadpool="cached"
  10. threads="100" ></dubbo:protocol>
  11. <dubbo:service delay="-1" interface="com.alibaba.edas.dubbo.demo.api.DemoApi"
  12. ref="demoProvider" version="1.0.0" group="dubbogroup" retries="3" timeout="3000"></dubbo:service>
  13. </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 文件配置服务消费者

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  5. http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  6. <dubbo:application name="edas-dubbo-consumer" />
  7. <dubbo:registry address="zookeeper://127.0.0.1:2181" />
  8. <dubbo:reference id="demoProviderApi"
  9. interface="com.alibaba.edas.dubbo.demo.api.DemoApi" version="1.0.0" group="dubbogroup" lazy="true" loadbalance="random">
  10. <!-- 指定某个方法不用等待返回值 -->
  11. <dubbo:method name="sayMsg" async="true" return="false" />
  12. </dubbo:reference>
  13. <bean id="demoConsumer" class="com.alibaba.edas.dubbo.demo.consumer.DemoConsumer"
  14. init-method="reviceMsg">
  15. <property name="demoApi" ref="demoProviderApi"></property>
  16. </bean>
  17. </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 依赖。

    1. <dependency>
    2. <groupId>com.alibaba.edas</groupId>
    3. <artifactId>edas-sdk</artifactId>
    4. <version>1.5.1</version>
    5. </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。

    jar-war

  2. 如果没有web.xml,则需要增加一个web.xml文件配置。

    add-webxml

  3. web.xml中配置加载配置文件。

    1. <context-param>
    2. <param-name>contextConfigLocation</param-name>
    3. <param-value>classpath:hsf-provider-beans.xml</param-value>
    4. </context-param>
    5. <listener>
    6. <listener-class>org.springframework.web.context.ContextLoaderListener
    7. </listener-class>
    8. </listener>
    9. <listener>
    10. <listener-class>
    11. org.springframework.web.context.request.RequestContextListener
    12. </listener-class>
    13. </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 不支持