微服务浅谈(1)——nacos注册中心

336 阅读5分钟

服务注册中心

注册中心基本原理

在使用注册中心时,一共有三种角色:服务提供者(Service Provider)、服务消费者(Service Consumer)、注册中心(Registry)。

服务发现原理:服务发现机制就是通过一个中间件去记录服务提供者的ip地址服务名以及心跳等数据(比如用mysql去存储这些信息),然后服务消费者会去这个中间平台去查询相关信息,然后再去访问对应的地址,这就是服务注册和服务发现。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

服务提供者:向注册中心注册为一个服务实例,并且向外部暴露调用接口。

服务消费者:向注册中心订阅需要调用的服务,并缓存服务的实例列表再内存中。后续,Consumer 向对应服务的 Provider 发起调用时,从内存中的该服务的实例列表选择一个,进行远程调用。

注册中心:当注册的实例超过一定时间未心跳(nacos默认30s心跳一次,若下一次未收到,将不再路由请求至该实例),则注册中心判断这个服务已下线,将从服务实例列表移除。

不同的注册中心可能在实现原理上会略有差异。例如说,Eureka 注册中心,并不提供通知功能,而是 Eureka Client 自己定期轮询,实现本地缓存的更新。

当然,一个服务消费者,也可以是一个服务提供者。

nacos

  • 作为注册中心时,Namespace + Group + Service
  • 作为配置中心时,Namespace + Group + DataId

7695ce09d29a4f4fac9038c00cd12959tplv-k3u1fbpfcp-watermark.jpg 元数据:

Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签(label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。

负载均衡

服务器端负载均衡:

由中间件Ng进行路由

6a0ccdda06b0429faaef93d0f6879a62tplv-k3u1fbpfcp-watermark.jpg

客户端负载均衡:

根据负载均衡规则,自行请求。

e39dbc0a7c424572b94493b4420f6bf0tplv-k3u1fbpfcp-watermark-16457160901771.jpg

Ribbon:提供丰富的负载均衡算法。

手写一个客户端侧负载均衡器

  • 手写负载均衡器部分代码如图:

    这段代码的意思就是在实例列表中随机进行请求。这段代码只是粗略展示负载均衡的其中一个算法。

9a445f7291504cd48d2d5de6a19c672dtplv-k3u1fbpfcp-watermark.jpg

手写负载均衡器主要原理就是获取到此服务的所有url,然后以轮询、随机等方式进行调用指定的url

Ribbon与Nginx的区别

既然提到了负载均衡,怎么能少得了Nginx呢,Ribbon和Nginx之间的不同在于,Nginx是集中式的对接收的请求进行负载均衡,而Ribbon是在消费者端进行负载均衡,形象一点就是如下图。

Nginx

Nginx的工作模型如下图:

image.png

Ribbon

Ribbon的工作模型如下图

image.png

Ribbon的负载均衡与Ng的负载均衡之不同就是,Ng是被动负载均衡,Ribbon是主动负载均衡。

Ribbon会在收到Http请求后,去拉取注册中心中的服务实例List,获取到List以后,会使用负载均衡策略,在List中挑选一个服务实例进行请求。

image-20220308222825571.png Ribbon默认是懒加载,懒加载会使项目启动速度加快,但是同时在第一次请求时,会去拉取注册中心的服务实例,以及初始化负载均衡容器,导致请求响应速度相对较慢。同时可选定服务进行配置饥饿加载。

同时Ribbon有多种负载均衡的策略模式可供选择,默认的就是同区域轮训模式:ZoneAwareLoadBalancer 是一个根据区域(Zone) 来进行负载均衡器,因为如果不同机房跨区域部署服务列表,跨区域的方式访问会产生更高的延迟,ZoneAwareLoadBalancer 就是为了解决此类问题,不过默认都是同一区域

Ribbon负载均衡策略:

策略类  命名描述
RandomRule随机策略随机选择server
RoundRobinRule轮询策略轮询选择, 轮询index,选择index对应位置的Server;
RetryRule重试策略对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server;
BestAvailableRule最低并发策略逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
AvailabilityFilteringRule可用过滤策略过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态;
ResponseTimeWeightedRule响应时间加权重策略根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
ZoneAvoidanceRule区域权重策略综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server