dubbo-http 协议小探和修改尝试

2020-06-17 10:34:20 浏览数 (1)

1. Dubbo-http 底层探究


最近在研究如何让用户的 dubbo 代码最小改动的迁移到 http 协议上,看了很多实现都要做很多改动,用户不友好。于是看了下 github 发现最新的 dubbo 已支持了 dubbo-http rpc。开始以为用的是 HttpClient 做的封装,实际上是采用了 jsonrpc4j 这个库。

jsonrpc4j 有个核心类 JsonRpcHttpClient 负责执行远程调用,类似HttpClient。dubbo-consumer 在初始化时,生成 Invoker 时,在 JsonProxyFactoryBean 的 afterPropertiesSet 方法中生成 JsonRpcHttpClient 实例。

上面截图是临时撸码写的 dubbo-bookinfo-demo,运行demo中的 ProviderApplication 和 ConsumerApplication,抓包检查确实是 http 方式,而且 application 标注的是 json-rpc。

2. 使用服务名发送 http 请求


虽然 dubbo-http 让 dubbo 支持了 http 协议,但请求的 url 中使用的任然是 provider 实例的 ip,并不是服务名。这点显然满足不了 envoy 的要求。为此试着修改 dubbo sdk,尝试让 dubbo 发出的请求 url 使用服务名(provider 的 application name)。

具体修改方式见上图,在 protocolBindingRefer 方法中改写 url,将 host 字段设置为 provider 的 application name。然后重新打包运行,抓包查看果然发出的请求中使用了服务名。

Note: 需要在 hosts 文件中加个配置,才能将 bookinfo-provider 解析成真正的 IP,否则服务是跑步起来的。

3. 项目转成 dubbo-http 涉及的改动


虽然 dubbo-bookinfo-demo 代码很简单,但跑起来还是遇到不少坑,maven 依赖确实很烦,而且官方这方面的文档也不健全。现在回过头来看,一个采用dubbo默认协议,或者非 dubbo-http 方式的项目转到 dubbo-http rpc 协议需要做如下几方面改动:

  • 不需要改动 java 代码
  • 依赖包需要添加

下面罗列的依赖,除了 tomcat 其它都是必须的。tomcat 可以 换成 jetty。完整的依赖,请见项目的 parent pom, provider pom 和 consumer pom

代码语言:txt复制
    dubbo-rpc-http
    dubbo-remoting-http
    javax.servlet-api
    tomcat-embed-core
    spring-web
    jsonrpc4j
  • dubbo-spring 配置

provider 有两点需要改动,一个是协议,一个服务暴露出配置下 http 协议,见下图。consumer 端不需要改动配置。

0 人点赞