分布式系统架构特别是进入微服务架构后,服务治理的重要性愈发变得不可缺少而且处于重要地位。缺乏服务治理的的分布式系统架构,很难正式投入生产。那么服务治理包括哪些方面呢?主要包括服务发现,服务注册,负载均衡,限流,熔断,超时,重试,服务跟踪等。
服务发现
服务发现是指使用一个注册中心来记录分布式系统中全部服务的信息,以便让其他服务能够快速找到这些已注册的服务。服务发现需要服务注册,服务查找,服务健康检查及服务变更通知等关键功能。
有两种主要的服务发现模式:客户端服务发现, 服务端服务发现。
客户端服务发现
上图展示了客户端发现模式的架构,简单来说:
Service Registry 类似企业黄页,保存了所有服务的信息, client通过注册表找到对应的企业电话(是一个list), 然后客户端使用自身提供的负载均衡算法,选择需要的电话。
当然client可以保存查找过的地址(缓存)而不需要每次都去Service Registry 获取;因为服务的实例(企业信息,电话)可能终止(从Registry删除), 或者新的服务实例加入(新的企业),使得本地缓存和Registry可能有差异,(从分布式CAP的角度,对于服务发现,可用性比数据一致性更加重要,AP胜过CP), 需要服务实例的注册表通过心跳机制进行更新。
服务端服务发现
本质上就是负载均衡从客户端解耦了出来, 常见的服务发现Eureka, etcd, Consul,Zookkeeper,nacos等。
对两者进行对比的话,他们的优劣也十分的明显
可以看到关于服务发现,关键是要有一个服务注册中心。具体的服务发现机制
1.服务提供者启动时需要注册。
2.注册中心与服务提供者无法保持心跳时需要剔除服务。
3.服务消费者可以从注册中心获取服务提供者的最新信息,可以采取定期拉和事件通知的两种方式。
服务注册
就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。
你可以理解为:
//服务注册
NameServer->register(newServer);
//服务发现
NameServer->getAllServer();
服务注册又分为自注册和第三方注册两种方式。
服务注册最重要的就是将服务注册到哪里,在注册中心服务端,肯定有一个用来管理服务的容器,他保存着所有服务的实例。
服务发现
服务注册到注册中心后,服务的消费者就可以进行服务发现的流程了,消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况。另一种方法就是服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的。
负载均衡
负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能。
负载均衡方式
(1)软件负载均衡
常见的负载均衡软件有Nginx、LVS、HAProxy。
(2)硬件负载均衡
常见的负载均衡硬件有Array、F5。
负载均衡算法
常见的负载均衡算法有:随机算法、加权轮询、一致性hash、最小活跃数算法。
一致性哈希算法-ConsistentHashLoadBalance
服务器集群接收到一次请求调用时,可以根据根据请求的信息,比如客户端的ip地址,或请求路径与请求参数等信息进行哈希,可以得出一个哈希值,特点是对于相同的ip地址,或请求路径和请求参数哈希出来的值是一样的,只要能再增加一个算法,能够把这个哈希值映射成一个服务端ip地址,就可以使相同的请求(相同的ip地址,或请求路径和请求参数)落到同一服务器上。
因为客户端发起的请求情况是无穷无尽的(客户端地址不同,请求参数不同等等),所以对于的哈希值也是无穷大的,所以我们不可能把所有的哈希值都进行映射到服务端ip上,所以这里需要用到哈希环。如下图
(1)哈希值如果需要ip1和ip2之间的,则应该选择ip2作为结果;
(2)哈希值如果需要ip2和ip3之间的,则应该选择ip3作为结果;
(3)哈希值如果需要ip3和ip4之间的,则应该选择ip4作为结果;
(4)哈希值如果需要ip4和ip1之间的,则应该选择ip1作为结果;
上面这情况是比较均匀情况,如果出现ip4服务器不存在,那就是这样了:
会发现,ip3和ip1直接的范围是比较大的,会有更多的请求落在ip1上,这是不“公平的”,解决这个问题需要加入虚拟节点,比如:
其中ip2-1, ip3-1就是虚拟结点,并不能处理节点,而是等同于对应的ip2和ip3服务器。
实际上,这只是处理这种不均衡性的一种思路,实际上就算哈希环本身是均衡的,你也可以增加更多的虚拟节点来使这个环更加平滑,比如:
这个彩环也是“公平的”,并且只有ip1,2,3,4是实际的服务器ip,其他的都是虚拟ip。
那么我们怎么来实现呢?
对于我们的服务端ip地址,我们肯定知道总共有多少个,需要多少个虚拟节点也有我们自己控制,虚拟节点越多则流量越均衡,另外哈希算法也是很关键的,哈希算法越散列流量也将越均衡。
Nacos 服务注册与订阅的完整流程
Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。
Nacos 客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务。
限流、熔断、超时
了解sentinel
三丰,公众号:soft张三丰Sentinel你了解多少
服务跟踪
服务跟踪
三丰,公众号:soft张三丰APM 原理与框架
Prometheus监控(1)
三丰,公众号:soft张三丰Prometheus监控(1)
Prometheus监控(2)
三丰,公众号:soft张三丰Prometheus监控(2)
Prometheus监控(3)
三丰,公众号:soft张三丰Prometheus监控(3)
Prometheus监控(4)
三丰,公众号:soft张三丰Prometheus监控(4)
Prometheus监控(5)
三丰,公众号:soft张三丰Prometheus监控(5)