写点什么

微服务 - 注册中心和配置中心 (Consul)

  • 2023-04-21
    湖南
  • 本文字数:2301 字

    阅读完需:约 8 分钟

上篇说到构建良好的架构,依托于基础设施建设(自动化测试、自动化部署、服务监控,服务发现、配置中心等等),决定成败的往往是基础设施建设,所以从搭建一个注册中心和配置中心开始我们新一阶段的启程。

注册中心

注册中心选型

你有没有思考过这样一个问题,为什么会有这么多的注册中心(etcd/ZooKeeper/Consul),选用那个最适合自己,是不是在选用的时候会眼花缭乱?


我在开始做的时候,自己也有很多困惑,将近 3 年的时候里我都在不停的学习,但是还是有很多不同的框架和产品,后来我明白了其中的原因,他们就像生活中的可乐、果汁、和牛奶一样,你在使用的时候选取你的编程语言(Java、Go、PHP),程序易接入的就好了。


产生注册中心五花八门的原因是因为语言很多,都想打造最适合自己的体系生态,我选择 Consul 为大家讲解,因为它安装和接入都比较方便。


不用被这些假象所困扰,多学习网络和系统的底层原理,万变不离其宗,技术人应该是给出解决方案。

CAP 原理

  • 一致性: 所有节点在同一时间具有相同的数据

  • 可用性:保证每个请求不管成功或者失败都有响应

  • 分区容错:系统中任意信息的丢失或失败不会影响系统的继续运作

Consul 介绍

使用 PHP、和 Go 编写,使用 Consul 作为注册中心和配置中心比较方便,所以我选用的是 Consul。

  • 采用 Raft 算法实现,有服务发现,Key/Value 存储,可以做配置中心使用,有健康检查,并提供了 web 管理页面。


Consul 内部端口说明:

  • TCP/8300:8300 端口用于服务器节点,客户端通过 RPC 协议调用服务端节点。

  • TCP/UDP/8301: 8301 端口用于单个数据中心所有节点之间的互相通信,即对 LAN 池信息的同步,它使得整个数据中心能够自动的发现服务器地址,分布式监测点的故障,事件广播。

  • TCP/UDP/8302: 8302 端口用于单个或多个数据中心之间的服务器节点的信息同步(WAL 池信息的同步),它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。

  • HTTP/8500: 8500 端口基于 Http 服务,用于 Api 接口和 Ui 访问。

  • DNS/8600: 8600 端口作为 DNS 服务器,它使得我们可以通过节点查询节点信息。

Consul Raft 算法

  • 解决了分布式中领导选举和一致性问题

  • Raft 算法是比较出名的共识算法,比如 Redis 的哨兵、Consul


Consul 集群的特点:

  • 任期机制,Raft 是终身任期的,它永远都是领导者

  • 心跳机制,它决定领导者是否能有效的和跟随者通信

  • 随机的选举超时时间,因为是随机的所以决定了不会再同一时间进行选举

  • 先到先得,一届任期内,先收到谁的投票就会给谁,剩下的请求一律拒绝

  • 过半机制,收到一半的投票才会


Consul 集群的角色:

  • Followers 追随者:接受到领导者发送的消息,当心跳超时时,主动推荐自己成为候选人。

  • Candidate 候选人:发送 Rpc 消息,让其它节点投票给自己,当投票超过半数时,成为领导者。

  • Leader 领导者:向其他节点发送心跳,只要心跳不超时,一直为领导者。

Consul 基本使用

注册服务

  1. 注册服务是 Consul 最基础的服务:

PUT 192.168.88.144:8500/v1/agent/service/register{    "Name":"audio",    "Id":"audio",    "Tags":[        "v2",        "primary"    ],    "Address":"192.168.88.144",    "Port":8500,    "Check":{        "HTTP":"http://192.168.88.144:8500",        "Interval":"10s"    }}
复制代码


{  "id": "web",  "name": "web",  "port": 80,  "check": {    "name": "ping check",    "args": ["ping", "-c1", "test.stark.com"],    "interval": "30s",    "status": "passing"  }}
复制代码
  1. 发现服务:

GET http://192.168.88.144:8500/v1/health/service/audio[    {        "Node": {            "ID": "38779dca-bffd-e399-6597-266aff68132c",            "Node": "server01-virtual-machine",            "Address": "127.0.0.1",            "Datacenter": "dc1",            "TaggedAddresses": {                "lan": "127.0.0.1",                "lan_ipv4": "127.0.0.1",                "wan": "127.0.0.1",                "wan_ipv4": "127.0.0.1"            },            "Meta": {                "consul-network-segment": ""            },            "CreateIndex": 13,            "ModifyIndex": 17        },        "Service": {            "ID": "audio",            "Service": "audio",            "Tags": [                "v2",                "primary"            ],            "Address": "192.168.88.144",            "TaggedAddresses": {                "lan_ipv4": {                    "Address": "192.168.88.144",                    "Port": 8500                },                "wan_ipv4": {                    "Address": "192.168.88.144",                    "Port": 8500                }            },            "Meta": null,            "Port": 8500,            // ...}]
复制代码

Service APIService 相关的 API 都在 /v1/agent/service 下:

  • /agent/services:该端点返回在本地代理程序中注册的所有服务;

  • /agent/service/{service_id}:返回在本地代理上注册的单个服务实例的完整服务定义;

  • /agent/health/service/name/{service_name}/

  • /agent/health/service/id/{service_id}:通过名称或 id 检索本地代理上的聚合服务状态;

  • /agent/service/register:注册服务;

  • /agent/service/deregister/{service_id} :注销服务;

  • /agent/service/maintenance/{service_id}:该端点将给定的服务置于“维护模式”,在维护模式下,该服务将被标记为不可用,并且不会出现在 DNS 或 API 查询中。


作者:stark 张宇

链接:https://juejin.cn/post/7224092792824807479

来源:稀土掘金

用户头像

还未添加个人签名 2021-07-28 加入

公众号:该用户快成仙了

评论

发布
暂无评论
微服务 - 注册中心和配置中心(Consul)_Java_做梦都在改BUG_InfoQ写作社区