简单介绍—服务发现

一、何为服务发现?

服务发现是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。

意思就是,所有服务器(无论是同一种APP的多个服务器,还是不同APP的多个服务器)在启动时,都需要在“注册中心”进行注册;客户端发送“请求”的时候,需要从“注册中心”获取它所属APP的服务器(有可能是多个服务器,即获取到某个服务的服务器列表)的地址信息。

从客户端角度来看,注册中心起到的作用包含两个:

1、可以知道是否存在某个APP的服务器;
2、在客户端发送请求时,需要从注册中心获取相关服务器的地址信息。
从客户端角度来看,这是一种“服务发现”的机制。

简单介绍—服务发现
注:注册中心如果宕机,不影响已注册服务器和客户端的APP业务。简单来说,注册中心最大程度上起到的是一个联系的作用,并不对服务器和客户端之间的具体交互做任何的干扰。

二、服务发现的妙用

(1)服务器热插拔

如果新增了一个APP服务器,在“注册中心”完成注册(注册中心和服务器之间长连接,以便可以随时感知服务器的状态),注册中心就可以告知客户端有新的服务器加入,之后客户端再进发送服务请求时,就会把新加入的服务器也包含进去(但是如果要告知客户端就需要注册中心也和客户端长连接),类似,一个服务器如果宕机了,注册中心就将信息告知给客户端,之后不再给宕机的服务器发送请求。

但是,要仔细思考一个问题?客户端的数量本来就是大量存在的,随时都有可能上线和下线,让注册中心和客户端之间保持长连接是否合理?我觉得是不合理的,也是没有这个必要。

综上考虑,注册中心可以和客户端之间进行“逻辑”上的长连接,也就是当客户端在注册中心获取服务器时,把客户端的ip地址以及需要的服务器类型存放到一个表格中。而当选择一个合适的服务器分配给客户端的时候,再将该服务器工作的客户端加到一个对应的列表中。当某个服务器宕机了,就给噶服务器工作过的客户端列表中的所有客户端告知该服务器已经不工作了,下次再有请求就找别的服务器服务。

两种情况:第一、客户端每隔一段时间,向注册中心请求一次服务器(刷新);第二、客户端直接向上一次发送过请求的服务器继续发送请求,发送失败的话,就像注册中心重新申请新的服务器。

(2)服务器在线升级

举个例子,在打王者或吃鸡的时候,会出现服务器升级成功的提示,但是我们的游戏界面好像并没有受到什么影响,这就是典型的服务发现的一个应用——服务器在线升级,内部原理也涉及到了上面第一点说过的“服务器热插拔”。

(3)容错机制

“容错机制”的意思是在客户端向服务器发送请求的过程中,该服务器突然宕机,就立刻切换到另一个服务器继续请求,不会影响请求的正常发送,是所谓的“容错”。

(4)负载均衡

1、注册中心还起到统计的作用,记录所有服务器的状态(服务器收到的请求次数,做出的响应次数,以及响应速度等等),以便给客户端推荐最合适的服务器。

2、服务器每隔一段时间给注册中心报告自身的状况,注册中心面对得到的数据和当前所有情况甚至之前的得到情况进行比较,还是推荐给客户端最合适的服务器。

3、软负载均衡:注册中心不统计服务器的状况,不参与客户端对服务器的选择,真正的负载均衡由客户端实现,设定每一次可供选择的服务器,或者直接用随机选择的方法匹配到服务器。但是存在的问题是,多个客户端有可能同时随机到相同的服务器(也可以通过函数随机来设置它的随机优先级)。(当然这并不是绝对均衡),还可以另外开辟一个线程,每隔一段时间客户端向服务器随便发送一条消息,计算出该服务器的响应效率,这样客户端可以实时的掌握服务器的效率高低,在发送真正的请求时就向那个效率高的服务器发送。