tars的寻址方式

tars

tars是腾讯的分布式框架,可类比于Springcloud,微服务的那一套东西:注册中心、服务调用、负载均衡、容错保护、链路追踪都是有的。这个框架在腾讯内部使用了十多个年头,17年开源,以腾讯的体量,这套框架应该是比较稳定的。目前在学习,记录一下学习心得。

寻址方式

对比spirngcloud中的Zuul网关来理解,tars是基于名字来实现服务的注册与发现的,但是这个名字会有三层,和Java中的包有点像,分别是应用名app、服务名server和服务提供者Servant,通过三层来限定这个名字,条理清楚,有效避免重复,tars的寻址方式有两种:主控寻址直接寻址

主控寻址

主控寻址就是通过Registry的路由,找到服务实际的ip、端口,然后远程调用。
tars中的注册中心是Registry,(路由+管理服务),提供服务节点的地址查询、发布、启停、管理等操作,以及对服务上报心跳的管理,通过它实现服务的注册与发现。所以如果我们通过路由去寻址,那么就是去Registry找到名字所对应服务的ip、端口等

具体的代码:

    // 同步调用
    public static void synchronous() {
        CommunicatorConfig cfg = new CommunicatorConfig();
        //这里的主控要换成实际的主控地址才可以,主控就是tars实际的地址,
        cfg.setLocator("tars.tarsregistry.QueryObj@tcp -h 10.0.23.35 -t 60000 -p 17890");
        //构建通信器
        Communicator communicator = CommunicatorFactory.getInstance().getCommunicator(cfg);
        //通过通信器,生成代理对象,线程安全,不需要多次实例化    TestApp.helloSvr.HelloObj。会根据名字从registry上拉取server的路由信息(如ip、port信息),
        HelloPrx proxy = communicator.stringToProxy(HelloPrx.class, "TestApp.helloSvr.HelloObj");
        String ret = proxy.hello(1000, "HelloWorld");
        System.out.println(ret);
    }

上面的代码是客户端使用主控寻址方式同步调用服务,其中第五行,就是在设置主控的地址,就是tars的安装地址。其实这里我有点不清楚,这个主控地址应该是tars的Registry的地址才对,但实际上,tars自带的服务只有path(发布管理)、config(配置中心)、notify(异常信息)、log(远程日志)、stat(调用统计)、Property(业务属性)这几个,并没有Registry(注册中心)这个服务,那么这里的主控地址是哪一个呢?因为我自己安装tars的web和自带服务这些的时候,没有安装上,所以我用的公司内网里已经搭建好的坏境。他们把tars自带的服务全都放在了一台机器上,并且没有修改端口,所以我的主控地址就是这一台机器的ip,而且端口也是默认的17890。这里我要去确认一下。
(ps:后来我去确认了,Registry这个服务是所有服务的基础,包括自带的那些可见的服务,在最开始安装的时候,就需要先安装Registry,所以主控地址就是Registry的地址)

另外,主控地址的写法:“tars.tarsregistry.QueryObj@tcp -h 10.0.23.35 -t 60000 -p 17890” ,前面部分是固定的,后面的-h是主控地址的ip,-t 是超时时间,-p是主控的端口,如果没有修改默认是17890。

第七行"TestApp.helloSvr.HelloObj",就是设置了我们的服务名字,通过三层限定,然后去寻找对应的ip、端口。当然,如果有多台提供相同的服务,会通过策略实现负载均衡。

直接寻址

直接寻址就是在调用的时候,直接指明服务所在的ip、端口,直接去调用服务。这样在前面设置的主控地址就没用了,因为调用服务没有通过主控地址,直接调用了指定机器上的服务。

    // 同步调用
    public static void synchronous() {
        CommunicatorConfig cfg = new CommunicatorConfig();
        //这里的主控要换成实际的主控地址才可以,主控就是tars实际的地址,
        //cfg.setLocator("tars.tarsregistry.QueryObj@tcp -h 10.0.23.35 -t 60000 -p 17890");
        //构建通信器
        Communicator communicator = CommunicatorFactory.getInstance().getCommunicator(cfg);
        //通过通信器,生成代理对象,线程安全,不需要多次实例化    TestApp.helloSvr.HelloObj。会根据名字从registry上拉取server的路由信息(如ip、port信息),
        HelloPrx proxy = communicator.stringToProxy(HelloPrx.class, "TestApp.helloSvr.HelloObj@tcp -h 10.0.23.109 -t 60000 -p 10007");
        String ret = proxy.hello(1000, "HelloWorld");
        System.out.println(ret);
    }

如此一来,上面的主控地址就可以不用设置了,即便设置了也没用,因为根本就不会经过主控。下面第七行,就是在指定服务的具体位置,直接去调用。

两者比较

主控寻址和直接寻址,都可以完成对服务的调用,但实际上直接寻址是没有多大意义的,因为需要人工记住服务的地址,ip、端口等信息。而且通过直接寻址,就无法实现多个相同服务的负载,因为是直接去调用了指定位置的服务。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值