如何给注册中心锦上添花?

捉虫大师
• 阅读 715

hello,大家好,我是小楼。

在上一篇文章《如何组装一个注册中心》中,我们看到了如何利用一些现有的技术方案来组装出一个生产可用的注册中心最小集。

有的同学看完表示学到了,也有同学直呼不过瘾,能不能手写一个注册中心?能不能继续展开说说?

由于精力有限,手写一个注册中心暂时还不行,展开说说倒是可以满足。

于是本期打算以注册中心的周边能力展开说说,这些能力属于锦上添花,没有它们注册中心可以正常运行,有了它们也不一定变得更强,但一定会更加花里胡哨。

那可能有读者会问,花里胡哨的有什么用呢?我觉得主要是了解一些新的、奇怪的知识,说不定哪天能用上呢,是吧?

控制台

如果想让注册中心变得花里胡哨,首先肯定是开发一个控制台,控制台的基本功能就是展示服务的消费者与提供者,展示的用处有查找服务,排查问题等等,下图是Nacos的控制台

如何给注册中心锦上添花?

除了基本的展示功能,我们还可以在控制台上搞些别的事情,比如下面这些。

服务配置

配置本不是注册中心必备的功能,配置一般由配置中心管理,但配置中心似乎又和注册中心脱不了干系,Nacos就是一个集注册中心和配置中心于一体的组件。

注册中心也可以做一点和服务相关配置的事情,比如服务的超时时间、熔断降级等等元数据,不过要注意的是注册中心本身只能保存、修改,至于这些配置真正起作用的还是得和RPC框架配合。

可能你会问,为什么注册中心要去做配置中心的事儿呢?这不是职责不清?

可以这么理解,服务发现基本是个服务都要接入,但配置中心可不一定要接,如果只想做点简单的服务相关的动态配置,引入一个配置中心是有点重。

如果是公司生产级的服务配置,最好再附带上一个灰度的能力,如果一次下发配置到全部机器,可能会出现故障,所以需要一种灰度下发的机制,分批下发,控制风险。

事件追踪

说到问题排查,光展示提供者、消费者可能还不够,有时候启动一个提供者,消费者就是没感知到,或者很久之后才感知到,这时有点摸不着头脑,如果我们拿出这个事件的时间线,哪个环节出问题便一目了然。

在Nacos的企业版中就支持了类似的推送轨迹功能,当然这么好的功能,肯定是收费项。

拓扑关系

可能我们忽略了注册中心的绘制服务之间的拓扑关系的能力,开源注册中心基本没提到这个,一般来说拓扑关系是链路追踪的活。

如何给注册中心锦上添花?

注册中心其实也大致可以干这个活,不过注册中心是按照服务的订阅关系绘制出来,并不是按照真实的调用关系,但这几乎也近似调用关系了,有了这个,我们就可以去做一些服务治理相关的事了,比如循环依赖、依赖层级太深等问题都可以看出来。

流量控制

流量控制也不一定非要在注册中心上做,比如Dubbo就是在RPC框架上做了很多流量相关的事情,像集群的选择、路由、负载均衡等。

如果RPC框架没这么强大的能力,或者RPC框架是多语言的实现,能力尚未打平,那么在注册中心上实现也是一个不错的选择。

路由偏好

路由偏好简单来说,如果提供者有多个集群,挑选一个更适合的集群来提供服务,这就叫路由偏好

举个例子,例如消费者在杭州,提供者有两个集群,一个在上海,一个在北京,这两个机房提供的服务完全对等,这时消费者更适合调用本地的集群,这样时延更小。

如何给注册中心锦上添花?

当然我们还可以根据服务器的性能、甚至自定义的规则来做路由偏好。

动态切流

有了上面路由偏好的铺垫,相必你也能想到一个场景,万一有一天上海的提供者不可用了,我们可以通过对注册中心的干预,手动把北京的提供者下发给消费者,实现一个客户端无侵入的动态切流

流量劫持

流量劫持和动态切流的原理一样,实现也基本差不多,只不过下发的数据不太一样,原先的提供者列表,被注册中心偷天换日,换成了本地的一个端口127.0.0.1:8001

这样替换有什么作用呢?比如用agent来承接流量,像service mesh都有这种需求,注册中心就可以完成流量劫持。

其实劫持还有其他作用,如果服务的提供方压力太大,想降级,但消费者和提供者都没有降级能力,眼看着服务快挂了,千钧一发之际,你想到了注册中心,手动下发一个不存在的提供者地址,让消费者请求报错,以保护其他服务正常运行,这些奇奇怪怪的想法说不定都可以在注册中心上实现。

探活

探活算是注册中心的一个小功能,我们看看在这个小功能上还能玩出什么花样。

探活扩展

最简单的探活是端口探活,即注册中心向提供者注册的端口发起TCP连接请求,如果能成功建立连接说明服务正常。但有时又不是这样,比如服务僵死,端口还能连接,但服务没法提供了,这时我们需要语义级的探活。

根据提供者提供的服务和配置发起一个请求,如果返回和预期相符合,则判定为服务存活。

我们通常将这个探活留出扩展点,一般可以扩展出HTTP、MySQL、Redis、Thrift等协议的语义探活,以HTTP为例,服务提供方配置探活的URI,注册中心把提供方的ip、port与URI进行拼接、发起请求,如果响应符合预期(如返回码为2xx),则这次探活成功,同理,也可扩展出其他协议的语义级探活。

探活兜底

探活虽好,但有时候又很危险,如果注册中心与提供者的网络闪断,则可能将提供者全部摘除,这是个非常危险的操作,为了防止这种情况,探活兜底是很有必要的一种行为,比如同一个服务集群不能摘除超过1/3,当然这个比例是个经验值,也最好可以配置化。

生态建设

优雅发布

优雅发布包括优雅退出和优雅上线,优雅是指在应用退出和上线过程中没有报错。

注册中心结合发布系统来做优雅发布是最好的搭配。发布系统在停止应用前,向注册中心发起禁用请求(停止接流),注销后再停止应用,服务上线后启动完成后,再将服务开启,接受流量。

框架适配

一个注册中心如果想要更多的人来使用,则需要适配各种主流开发语言如Go/Java/Cpp等,适配一些主流框架如Dubbo/SpringCloud/gRPC等,这样用户用起来才更加方便,缺点是维护成本变高。

DNS 服务发现

对于无法接入服务发现SDK的用户,如果也想享受服务发现能力,怎么做呢?

业界有一种做法是自定义一个DNS拦截器,将DNS请求拦截,通过域名(对应到服务名)去注册中心找提供者。但这样做有一个缺点是DNS只能发现ip,端口没法自动发现。

一般这种拦截器可通过中心的DNS服务器或者本地的DNS agent代理来实现,也可以自定义编程语言的DNS解析插件来实现,像Go/Java都可以自定义DNS解析插件,但这种就属于入侵比较强了。

最后

本文信息点有点多,但深度不够,很多地方只是一笔带过,一方面本文的宗旨就是点到即可,这也正好符合 后端启示录 的特点,另一方面每个点都可以展开独立成一篇甚至多篇文章,如果读者朋友对其中某些点感兴趣,我们可以私下交流。


  • 搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。
点赞
收藏
评论区
推荐文章
捉虫大师 捉虫大师
2年前
这个Dubbo注册中心扩展,有点意思!
今天想和大家聊聊Dubbo源码中实现的一个注册中心扩展。它很特殊,也帮我解决了一个困扰已久的问题,刚刚在生产中用了,效果很好,迫不及待想分享给大家。Dubbo的扩展性非常灵活,可以无侵入源码加载自定义扩展。能扩展协议、序列化方式、注册中心、线程池、过滤器、负载均衡策略、路由策略、动态代理等等,甚至「扩展本身」也可以扩展。在介绍今天的这个注册中心扩展之前,先抛
捉虫大师 捉虫大师
2年前
如何组装一个注册中心
hello,大家好呀,我是小楼。今天不写BUG,来聊一聊注册中心。标题本来想叫《如何设计一个注册中心》,但网上已经有好多类似标题的文章了。所以打算另辟蹊径,换个角度,如何组装一个注册中心。组装意味着不必从0开始造轮子,这也比较符合许多公司对待自研基础组件的态度。知道如何组装一个注册中心有什么用呢?第一可以更深入理解注册中心。以我个人经历来说,注册中心的第一印
捉虫大师 捉虫大师
3年前
当我们谈注册中心时我们谈什么
本文已收录https://github.com/lkxiaolou/lkxiaolou欢迎star。最近工作重心转向了注册中心,于是想来写一篇关于注册中心的文章概念什么是注册中心,以大多数人熟悉的RPC框架来说,通常RPC中有三种角色:provider服务提供者consumer服务消费者,即调用方registry注册中心,让consumer
Easter79 Easter79
3年前
springCloud 集群
5.1注册中心集群 1.复制注册中心项目   2.修改yml配置文件      注册中心1中引入注册中心2的url地址       2.1server1的application.yml配置           server:             port:7000           注
一个线上问题的思考:Eureka注册中心集群如何实现客户端请求负载及故障转移?
前言先抛一个问题给我聪明的读者,如果你们使用微服务SpringCloudNetflix进行业务开发,那么线上注册中心肯定也是用了集群部署,问题来了:你了解Eureka注册中心集群如何实现客户端请求负载及故障转移吗?可以先思考一分钟,我希望你能够带着问题来阅读此篇文章,也希望你看完文章后会有所收获!背景前段时间线上Sentry平台报警,
捉虫大师 捉虫大师
3年前
Nacos注册中心之概要设计
前言在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的创建、读取、推送。注册中心的核心比配置中心多一个服务探活模块,他俩的相似度非常高,甚至阿里内部的注册中心就叫ConfigServer。Nacos注册中心打算分成几个模块来分析,本文重点在于概要设计,基于2.0.0版本。环境搭建用Nacos的源码来搭建源码阅读和调试环境,可参考Nacos调试
Easter79 Easter79
3年前
SpringCloud注册中心高可用搭建
SpringCloud的注册中心可以由Eureka、Consul、Zookeeper、ETCD等来实现,这里推荐使用SpringCloudEureka来实现注册中心,它基于Netfilix的Eureka做了二次封装,完成分布式服务中服务治理的功能,微服务系统中的服务注册与发现都通过这个注册中心来进行管理。引入EurekaServer依赖
Stella981 Stella981
3年前
Dubbo HA 高可用
一、zookeeper宕机现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务健壮性监控中心宕掉不影响使用,只是丢失部分采样数据数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务注册中心对等集群,任意一台宕掉后,将
Easter79 Easter79
3年前
SpringCloud 微服务 (十三) 服务网关 Zuul 路由
壹本篇延续上篇Zuul基础学习,做一个实践测试在之前学习的篇章中,一直积累学习,所以这边已经存在注册中心,product服务,order服务,config配置中心等等服务,每次写demo,注册中心和配置中心都是一直先启动,本次学习Zuul也不例外贰新建一个服务,第一步利用IDEA创建!(https://oscimg.osch
Easter79 Easter79
3年前
Springboot2.x整合SpringCloud之Eureka服务注册中心
一、 什么是服务注册中心服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者url串、路由信息等。服务注册中心是SOA架构中最基础的设施之一。1 服务注册中心的作用1,服务的注册2,服务的发现2. 常见