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 端不需要改动配置。