Tars是腾讯开源的高性能RPC开发框架,详细介绍见Tars框架介绍。跨环境Tars调用的需求(两个不同系统,或两个不同环境系统的打通)时有发生,本文提供的是一种在不同Tars环境间,让服务可以通过registry互相调用的思路。既满足跨环境Tars调用的需求,又不失去Tars框架自带的服务发现、服务路由、负载均衡功能,并尽可能减少对业务代码的侵入。
这里我简单的总结概述一下服务的交互流程如下:

web管理平台上发布服务,上传发布包至patch服务,并通过registry服务下发发布命令至具体节点的node服务上,node服务负责拉起server并定期将server的心跳转发给registry服务,由registry服务来统一维护服务的路由和管理client调用server时,client通过obj名字到registry服务拉取server的可用ip端口信息,然后根据ip端口信息以tcp或udp的方式访问serverclient通过在obj名字后@ip端口信息来调用server,此时client会忽略obj名字也不会去registry服务查询,直接通过写死的ip端口来进行服务调用要实现跨环境Tars调用,容易想到以下两种思路:
这两种思路分别存在一些问题:
registry服务路由的能力,设想一下被调方的server迁移了节点ip端口发生了变化,而调用方不知道,就会发生调用异常影响服务的使用这里我们的方案是将上述两种思路结合起来,如图:

server_obj@proxy_client的ip端口,这样会走直连模式请求到proxy_client代理服务,这里client和proxy_client都是调用方自己部署的服务,走直连也是相对可控的proxy_client通过https的方式访问proxy_server的域名,同时带上client请求时的obj名等信息,这里被调方只要保持域名接口不变,内部服务可自由迁移proxy_server在收到请求后,通过obj名字查询环境2的registry服务,然后进行服务调用,这时无论server如何迁移都可以通过registry服务来进行路由client和server都无须改动一行代码,只需要在client端配置调用obj名字时@上代理的地址即可本文中的方案最初是在笔者所在腾讯某内部服务上云时使用,来满足IDC机房和云机房间不同环境间的服务调用。当前实现的初衷是满足不同环境Tars服务间的调用,但我想无论是什么框架思路是相通的,希望能在你遇到类似场景时,给你提供一些灵感😊。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。