locator
- 如果需要通过名字来获取客户端调用代理,则必须设置locator参数;locator为registry服务的地址,必须是有ip port的,如果不需要registry来定位服务,则不需要配置;
- 通讯器Communicator是如何通过objServerName获取ip:port的?
- 1.创建代理,并不会请求主控获取ip列表,而是调用代理的接口时才会触发请求主控ip列表
- 2.如果obj后面有ip列表信息,相当于直连,这个是不会请求主控registry的
- 3.如果obj后面没有ip列表信息,相当于是间接方式,会请求主控registry
- 4.请求主控registry的策略时,如果本地缓存有请求obj的ip列表,用本地缓存的,同时去异步请求一下主控registry获取最新的ip列表
- 5.请求主控registry的策略时,如果本地缓存没有请求obj的ip列表,业务的请求会先缓存到队列里,同时异步去请求主控获取ip列表,获取到ip列表后,再从队列里把业务的请求拿出来,发送这个请求
- 6.不是每次都刷新,定时刷新的(默认60s),定时刷新的触发是靠业务请求
寻址方式简介
-
Tars服务的寻址方式:通常可以分为如下两种方式,即服务名在主控注册和不在主控注册,主控是指专用于注册服务节点信息的名字服务(路由服务)。名字服务中的服务名添加则是通过操作管理平台实现的。
-
直接寻址: 对于没有在主控注册的服务,可以归为直接寻址方式,即在服务的obj后面指定要访问的ip地址。客户端在调用的时候需要指定HelloObj对象的具体地址:
即:Test.HelloServer.HelloObj@tcp -h 127.0.0.1 -p 9985
Test.HelloServer.HelloObj:对象名称
tcp:tcp协议
-h:指定主机地址,这里是127.0.0.1
-p:端口地址,这里是9985
如果HelloServer在两台服务器上运行,则HelloPrx初始化方式如下:
HelloPrx pPrx = c->stringToProxy<HelloPrx>("Test.HelloServer.HelloObj@tcp -h 127.0.0.1 -p 9985:tcp -h 192.168.1.1 -p 9983");
即,HelloObj的地址设置为两台服务器的地址。此时请求会分发到两台服务器上(分发方式可以指定,这里不做介绍),如果一台服务器down,则自动将请求分到另外一台,并定时重试开始down的那一台服务器。
- 主控寻址: 对于在主控中注册的服务,服务的寻址方式是基于服务名进行的,客户端在请求服务端的时候则不需要指定HelloServer的具体地址,但是需要在生成通信器或初始化通信器的时候指定registry(主控中心)的地址。
这里指定registry的地址通过设置通信器的参数实现,如下:
CommunicatorPtr c = new Communicator();
c->setProperty("locator", "tars.tarsregistry.QueryObj@tcp -h .. -p ..")
由于依赖registry的地址,因此registry必须也能够容错,这里registry的容错方式与上面中一样,指定两个registry的地址即可。