Services

Zeze内建服务。都是独立进程。

ServiceManager

  • 管理服务器信息的注册和订阅。
  • 当新增服务器或者服务器关闭时,会给订阅者发送新的服务器列表。
  • 服务用名字区分,每个服务可能有多个提供者,也可能有多个订阅者。
  • 主要数据结构:Map<ServiceName, List<ServiceInfo>>
  • 服务器列表List按 ServiceInfo.ServiceIdentity排序。
名词 说明
ServiceName 服务名字,用来表示一个服务。
ServiceInfo 服务包含的信息,包含ServiceName, ServiceIdentity,Ip,Port,ExtraInfo
ServiceIdentity 服务器编号,用来区分不同的服务器,具体含义由应用自己决定。
Ip,Port 服务器地址和端口,当服务作为Acceptor时一般需要提供。可选。
ExtraInfo 应用自定义数据,使用Binary存储。可选。

订阅模式

  • Simple

某个ServiceName下的服务器信息列表发生改变的时候,给所有订阅者发送通知。 当第一次订阅的时候会得到当前已经存在的服务器列表信息。 通知和第一次获得订阅列表有多线程保护,保证相关操作系列化,不会出现信息丢失。

  • ReadyCommit 订阅者收到的服务器列表的时间有先后,还需要进行准备,如建立连接并登录等。这个过程 不会很快,造成每个订阅者真正可使用的服务器列表不会一致。当订阅者使用hash方式选 择服务器时,这种不一致会导致选中的服务器不一样。为了降低这种不一致,引入这种订阅 模式。步骤如下:
    	某个ServiceName下的服务器信息列表发生改变的时候,给所有订阅者发送通知
    	开始收集订阅者的Ready回复。
    	所有订阅者都Ready了以后,再通知一次准备好的服务器列表。
    
  • ServiceManager.Agent

ServiceManager客户端,主要接口如下:

接口 说明
RegisterService 注册服务信息
UnRegisterService 撤销注册服务信息
UpdateService 更新服务信息
SubscribeService 订阅
UnSubscribeService 撤销订阅
SetLoad 设置负载信息,信息键值为”Ip:Port”。订阅服务信息时,如果信
  息中包含Ip,port,那么就自动订阅该服务器的负载。任何服务器
  都可以发送SetLoad。负载会被广播给关注这个ip:port的订阅者。
  目前没有撤销订阅的接口,只有当ServiceManager广播发现网
  络断开,才自动撤销负载订阅。

Arch是怎么使用ServiceManager的

  • Server内的每个模块是一个服务;Linkd以模块为单位派发客户端请求。
  • Server的模块服务名字编码方式是:ServerServiceNamePrefix#ModuleId。
  • ServerServiceNamePrefix是应用名字,作为这个应用的标识。构造Arch.ProviderApp时由用 户传入,当多个ProviderApp共享一个ServiceManager时,每个ProviderApp的
  • ServerServiceNamePrefix必须能区分开,否则服务订阅会错乱。
  • Server服务的ServiceIdentity编码:String.valueOf(ServerId)。
  • Linkd服务的ServiceIdentity编码:”@” + ProviderIp + “:” + ProviderPort。 这里ProviderIp,ProviderPort是Linkd的Tcp.Acceptor,Server会发现Linkd时主动连接。 “@“开头的ServiceIdentity目前由Zeze.Arch保留,其他第三方的ServiceManager使用者不 能使用。

GlobalCacheManager

一致性缓存锁管理服务器。

GlobalCacheManagerWithRaft

Raft版本的一致性缓存锁管理服务器。