前言
前段时间看了一点 Nacos 的源码,决定动手写一个丐中丐版注册中心。
准备动手写的时候,看见冰箱里有一袋绿豆,于是乎取名为 Mung(绿豆)。
丐中丐版注册中心的目标:服务注册、心跳、调用。
总体设计
总体架构设计借鉴 Nacos 的做法:
-
Mung
注册中心,就是一个 Spring Boot 项目。其中保存注册服务的信息。
-
Common
公共包。
-
Server
注册中心主体逻辑。如服务注册、接受心跳等等。
-
Client
客户端包,其中封装了对 Server 访问的便捷方法。
客户端与服务端通信协议选用 HTTP ,方便我们快速实现。
-
-
Mung-starter
Mung 注册中心的 Spring Boot 快速启动包。
其中集成了 Client,Spring Cloud Commons,ribbon。
-
Client
Mung 的客户端包。
-
Spring Cloud Commons
Spring Cloud Commons 定义了一系列 Mung Client 与 Spring 体系融合的接口。
我们需要实现一些接口,来与 Spring 体系接口,它相当于一个中间层。
-
ribbon
远程服务调用时,提供调用实例信息。负载均衡也在这里处理。
-
-
业务系统一、业务系统二
模拟我们开发的服务。依赖 Mung-Starter 与 OpenFeign 来进行远程服务调用。
丐中丐版注册中心的目标有两个:
- 服务注册
- 服务调用
Mung 设计
Mung 需要保存服务信息。如果有可视化页面时,获取页面数据接口也在此提供。
我们先快速搞起一版来,所以直接选择保存在 Map 中即可,不做持久化处理。
Server 功能
-
注册服务实例
-
注销服务实例
-
获取单个服务实例
-
获取服务实例列表
-
接受心跳
要求服务实例定期发送心跳,注册中心接受到心跳时,刷新服务最后通信时间。
-
清除过期服务实例
启动一个延时线程任务,每过 N 秒,扫描一遍 Map 中的服务实例信息。
如果服务最后通信时间超过 M 秒,则清除这个实例信息。
Client 规划
封装对 Server 接口访问的便捷方法即可。
Mung-Starter 设计
Mung-Starter 这块儿稍微麻烦点。
这里要实现 Spring Cloud Commons 和 Ribbon 的部分接口,以达到服务注册\发现、Feign 远程调用的能力。
Spring Cloud Commons
首先,需要实现 org.springframework.cloud.client.serviceregistry.Registration接口,实现其中的方法,此类可认为是服务实例类。
其次,需要实现 org.springframework.cloud.client.serviceregistry.ServiceRegistry接口,其中定义了注册、注销等接口,此类可认为是服务行为类。
最后,我们继承 org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration,此类监听了 WebServerInitializedEvent事件,在服务启动完成时,进行服务注册。
Ribbon
实现 Ribbon 的扩展接口,是为了进行 Fegin 服务调用。
我们需要继承 com.netflix.loadbalancer.Server,此类代表调用远程服务信息。
还需要继承 com.netflix.loadbalancer.AbstractServerList,此类的核心作用是,获取远程服务信息列表。
最后实现实现 com.netflix.loadbalancer.AbstractLoadBalancerRule,此类的核心作用是,从远程服务列表中选择合适的服务实例。