『Naocs 2.x』(五) 写一个丐中丐版注册中心-设计篇

400 阅读3分钟

前言

前段时间看了一点 Nacos 的源码,决定动手写一个丐中丐版注册中心。

准备动手写的时候,看见冰箱里有一袋绿豆,于是乎取名为 Mung(绿豆)。

丐中丐版注册中心的目标:服务注册、心跳、调用。

总体设计

总体架构设计借鉴 Nacos 的做法:

image-20210914193811269

  • 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 中即可,不做持久化处理。

image-20210914200446721

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,此类的核心作用是,从远程服务列表中选择合适的服务实例。