[apache/dubbo]dubbo协议升级,协议头扩展新字段,用于7层负载

2024-07-02 635 views
8
背景

非常感谢dubbo这个项目给我们带来的便利,但是现在有个问题,我们的dubbo服务运行在云端k8s里,在本地开发需要访问k8s里的dubbo提供者服务,目前我们的做法是每一个服务都暴露一个NodePort,因为NodePort的端口不能重复,每个服务需要定义一个端口,然后部署的时候指定对应的外网SLB IP+端口上报到注册中心用于本地开发,这样服务多起来管理起来非常麻烦,,于是我就想做一个七层负载然后复用一个ip,通过不同的application.name来实现,但是我看了下目前dubbo协议请求header里并没有传递目标提供者的application.name,所以无法实现。

需求

在请求的时候,header中带上目标提供者的application.name,当然这个应该是通过选项来开启,就类似于http协议的host请求头,在实现此基础之上,我们就可以实现dubbo负载网关和k8s dubbo ingress,根据不同的提供者application.name反向代理到对应的提供者服务上,从而复用同一个ip,在部署到k8s的时候只需要统一配置一个外网ip和端口就可以了。

回答

3

可以用下 Triple 协议,直接用 http2 的 header 就可以拿到了

9

@AlbumenJ 好的,我先试试

0

可以用下 Triple 协议,直接用 http2 的 header 就可以拿到了

我测试了下,Triple协议下请求头中没有携带提供者application.name,只是带了消费者的application.name,如图: image

另外还有个很奇怪的事请教下,通过wireshark抓包抓不到http2协议的包,难道不是标准的http2吗?

5

你可以自己实现一个 Filter 加一下

8

@AlbumenJ 有示例代码参考吗

5

使用 SPI 定义一个 Consumer Filter,在 invoke 方法向 invocation 添加参数,invoker.getUrl().getRemoteApplication() 可以获取远端应用名

1

Triple协议下获取metadata的请求仍然是dubbo协议,我还是先基于dubbo协议做吧,通过你上面说的那个filter也可以实现,就是报文解析效率有点低了,需要把body解码出来才行。