专栏首页泛互云原生dubbo-http 协议小探和修改尝试
原创

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

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 pomconsumer pom

    dubbo-rpc-http
    dubbo-remoting-http
    javax.servlet-api
    tomcat-embed-core
    spring-web
    jsonrpc4j
  • dubbo-spring 配置

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Dubbo on Istio 改造方案的思考

    虽然 Dubbo 是个很优秀的 SOA 框架,在国内也是非常流行,但在 service mesh 的大风下,有些跟不上时代了。一方面官方还没有给出权威的 mes...

    鲍远林
  • Dubbo on Istio 改造方案的思考

    虽然 Dubbo 是个很优秀的 SOA 框架,在国内也是非常流行,但在 service mesh 的大风下,有些跟不上时代了。一方面官方还没有给出权威的 mes...

    鲍远林
  • Grafana + InfluxDB 实现 Jmeter 压测的图形化监控

    本方案采用 Grafana + InfluxDB 实时展示 Jmeter 的压测数据,下面为本文实验的压测指标数据流向图。

    鲍远林
  • SpringBoot开发案例之整合Dubbo消费者

    有人卖就有人买,显然是亘古不变的真理,前两篇讲解了SpringBoot+Dubbo的提供者的几种暴露方式,这篇跟大家分享一下消费者如何去订阅属于自己的服务。 相...

    小柒2012
  • Dubbo服务注册与发现

    本文链接:https://blog.csdn.net/u014427391/article/details/96754952

    SmileNicky
  • go语言实现http服务端与客户端

    go语言的net/http包的使用非常的简单优雅 (1)服务端 [plain] view plain copy package main import ...

    李海彬
  • python笔记42-http请求命令行工具(httpie)

    通常我们需要快速的测试某个接口通不通,一般linux上用curl去发http请求,但是这个命令行工具语法有点复杂了,不够直观。 python有一个给人类使用的r...

    上海-悠悠
  • dubbo服务接口设计的几个建议

    那如何解决呢?其实很简单。服务接口的参数类型最好是封装类,增加参数的话只是在这个类增加一个字段。示例如下:

    用户7634691
  • Nodejs创建http客户端及代理服务器

    nodejs除了可以通过http模块创建服务器,还能创建客户端,类似于浏览器那样很轻松的去向别的服务器发送请求并获取响应数据。

    前端_AWhile
  • 使用JWT做RESTful API的身份验证-Go语言实现

    在 使用Golang和MongoDB构建 RESTful API已经实现了一个简单的 RESTful API应用,但是对于有些API接口需要授权之后才能访问,在...

    李海彬

扫码关注云+社区

领取腾讯云代金券