第01篇:分布式注册中心

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 什么是`注册中心`,`注册中心` 往往是在分布式的应用体系下才会遇到的。对于分布式体系应用都是横向进行扩展。如下图`User App`这个服务,具有2台服务器但是当用户从网关进来访问, 网关是如何知道这个 `User App`有几台服务及每台服务的网络地址是什么呢? 所以就需要有一个地方能收集到每台应用的地址及命名。往往这个地方就被叫做 `注册中心`。分布式环境下的应用在启动时候都会向这个地方来注册自己的网络地址,及命名。

一、什么是注册中心

什么是注册中心注册中心 往往是在分布式的应用体系下才会遇到的。对于分布式体系应用都是横向进行扩展。如下图User App这个服务,具有2台服务器
但是当用户从网关进来访问, 网关是如何知道这个 User App有几台服务及每台服务的网络地址是什么呢? 所以就需要有一个地方能收集到每台应用的地址及命名。
往往这个地方就被叫做 注册中心。分布式环境下的应用在启动时候都会向这个地方来注册自己的网络地址,及命名。

二、注册中心的职责

但是注册中心只能注册服务吗? 当然不是,如果仅仅只做这个事情,那么岂不是浪费了自己的资源呢? 注册中心要做到

好了,我们看下再分布式的环境下,注册中心的位置有多重要了,如果没有了注册中心,网络上的服务都是瞎子了。所以这个系统
的设计我们要重新考虑到他的可用性,以及就算注册中心挂了,各服务之间不要里面就瞎。最起码要留给注册中心一个重启的时间

好了,知道这么多,我们直接开始设计吧。

三、设计注册中心

3.1 ip地址获取

这里要注意的点是不要拿到了127.0.0.1这个本地回环地址。类似工具网络很多,这不是重点。看下就行。

public class HostUtils {
    private static String ip;
    private static String hostName;
    private static void resolveHost() throws Exception {
        InetAddress localHost = InetAddress.getLocalHost();
        hostName = localHost.getHostName();
        ip = localHost.getHostAddress();
        if (localHost.isLoopbackAddress()) {
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = networkInterfaces.nextElement();
                Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
                while (inetAddresses.hasMoreElements()) {
                    InetAddress inetAddress = inetAddresses.nextElement();
                    if (!inetAddress.isLoopbackAddress() && (inetAddress instanceof Inet4Address)) {
                        ip = inetAddress.getHostAddress();
                    }
                }
            }
        }
    }
    public static String getIp() {
        return ip;
    }
    public static String getHostName() {
        return hostName;
    }
    static {
        try {
            resolveHost();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.2 通信协议 & 技术选型

通信协议一般为了兼容多语言环境, 最好使用的http协议。因为应用比较广泛。当然你也可以自定义协议。这里推荐一个
小编基于Netty封装的通信框架 mojito 这里我们主要考虑通用性,使用
http协议。因为现在微服务使用 ==Spring Cloud== 的较多,所以我们的注册中心的框架选型使用 ==Spring Boot==

这里我们可以使用SpringBoot的Endpoint 实现自己的扩展点,同时也可以使用服务自带的健康检查能力,进行状态监控。

下面描述下实现思路

3.3 交互流程

3.3.1 服务端能力

  • 提供服务注册接口

    • 数据可以落到数据库, 同时记录内存缓存,服务量大可以考虑使用redis
    • 同时要落到文件中, 避免数据库挂了能从文件中恢复到缓存中
  • 提供服务下线接口

    • 当服务下线,主动调用注册中心下线接口,注册中心要提供被动接受下线能力
    • 当轮训到服务状态不好,主动将服务标记为下线,当服务状态恢复重新标记为正常
  • 提供服务健康检查能力

    • 轮训已注册的机器的健康检查接口,动态更新节点状态
    • 启动定时任务,定时发送状态检查,检查客户端服务状态
  • 提供服务发现接口

    • 通过传递服务名,返回服务名对应的服务列表
  • 提供应用配置能力

    • 做到服务隔离,不要把某个服务的配置,推送到全部服务器,只需要推动到这个服务对应的节点即可
    • 能主动发起配置变更消息

3.3.2 客户端能力

  • 服务注册能力

    • 实现 ApplicationContextInitializer 应用启动时候读取应用配置,然后将自己注册到注册中心
    • 将注册中心的配置,同时拉下来,放到Spring配置环境
  • 服务重新或者宕机主动下线

    • 利用@PreDestroy销毁方法,或者注册Jvm Hooks程序
  • 服务发现能力

    • 根据服务名获取服务列表接口,同时缓存到本地一份
    • 如果注册中心无响应,要能使用本地缓存, 给注册中心留一个重启的时间
  • 监听服务器配置信息

    • 将监听到的配置变更刷新到Spring容器动态绑定配置方案参考
  • 打开健康检查

四、常见的注册中心

注册中心对比

4.1 Zookeeper

什么是ZooKeeper?

可以用ZooKeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。

ZooKeeper的数据结构,跟Unix文件系统非常类似,可以看做是一颗树,每个节点叫做ZNode。每一个节点可以通过路径来标识,结构图如下:

那ZooKeeper这颗"树"有什么特点呢??ZooKeeper的节点我们称之为Znode,Znode分为两种类型:

短暂/临时(Ephemeral):当客户端和服务端断开连接后,所创建的Znode(节点)会自动删除
持久(Persistent):当客户端和服务端断开连接后,所创建的Znode(节点)不会删除

另外Zookeeper提供了节点监听的能力,当节点发生变化会发起通知事件。我们可以根据这个特性做一些事情,比如节点被删除就移除注册在这个节点上的服务。

4.2 Eureka

Eureka是干什么的?
Eureka是SpringBoot默认的注册中心组件。没有配置的能力

4.3 Consul

Consul是用于服务发现和配置的工具。Consul是分布式的,高度可用的,并且具有极高的可伸缩性,而且开发使用都很简便。它提供了一个功能齐全的控制面板,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心、ServiceMesh。Consul在设计上把很多分布式服务治理上要用到的功能都包含在内了。

4.4 Nacos

Nacos致力于发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。Nacos更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。Nacos支持作为RPC注册中心,例如:支持Dubbo框架;也具备微服务注册中心的能力,例如:SpringCloud框架。

五、总结

市面上的注册中心有以上这些,核心逻辑思路都大差不差。其中Consul和Nacos是支持配置的。如果我们开发注册中心的话,没必要研究其源码。
只有当我们要做注册中心,这个时候我们可以去研究下源码。对于一般开发使用,只要知道他是做什么的就好了。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
分布式计算 Java Hadoop
05分布式电商项目 - 注册中心 Zookeeper
05分布式电商项目 - 注册中心 Zookeeper
71 0
|
4月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
345 0
|
Java Maven Spring
94分布式电商项目 - Maven Profile切换注册中心连接配置
94分布式电商项目 - Maven Profile切换注册中心连接配置
56 0
|
Cloud Native Java 中间件
分布式组件:Spring Cloud Alibaba——Nacos注册中心
分布式组件:Spring Cloud Alibaba——Nacos注册中心
188 0
分布式组件:Spring Cloud Alibaba——Nacos注册中心
分布式学习十四:etcd实现服务注册/发现
分布式学习十四:etcd实现服务注册/发现
103 0
分布式学习十四:etcd实现服务注册/发现
|
负载均衡 Dubbo Java
分布式注册的中心的实现原理|学习笔记
快速学习分布式注册的中心的实现原理
224 0
分布式注册的中心的实现原理|学习笔记
|
Kubernetes 监控 Java
SpringCloud链路追踪实时流量最佳解决方案:Pinpoint分布式链路追踪、链路监控平台详细搭建步骤,SpringBoot/SpringCloud微服务注册到Pinpoint(2022年最新)
SpringCloud链路追踪实时流量最佳解决方案:Pinpoint分布式链路追踪、链路监控平台详细搭建步骤,SpringBoot/SpringCloud微服务注册到Pinpoint(2022年最新)
1751 0
SpringCloud链路追踪实时流量最佳解决方案:Pinpoint分布式链路追踪、链路监控平台详细搭建步骤,SpringBoot/SpringCloud微服务注册到Pinpoint(2022年最新)
|
缓存 负载均衡 Dubbo
分布式面试题:服务注册中心如何选型?
服务注册中心,当前用得比较多的就是 Eureka 跟 Zookeeper 了。 Eureka 是 SpringCloud 自带的组件,而 Zookeeper 则是 Dubbo 一般会选择的。我们以前在做服务这块其实是基于 Spring Cloud 技术栈来做的,没有选择Dubbo。所以,Eureka 也就作为了我们的服务注册中心首选。
分布式面试题:服务注册中心如何选型?
|
缓存 算法 API
分布式(一) 搞定服务注册与发现(下)
我的业务比较简单,只是需要知道现在有哪些服务实例可供使用就可以了(并不是做远程调用,只需要拿到信息即可)。 要实现这一功能最简单的方式可以在应用中配置所有的服务节点,这样每次在使用时只需要通过某种算法从配置列表中选择一个就可以了。
|
缓存 NoSQL Dubbo
分布式(一) 搞定服务注册与发现(上)
我的业务比较简单,只是需要知道现在有哪些服务实例可供使用就可以了(并不是做远程调用,只需要拿到信息即可)。 要实现这一功能最简单的方式可以在应用中配置所有的服务节点,这样每次在使用时只需要通过某种算法从配置列表中选择一个就可以了。