首页 > 其他分享 >微服务架构之服务注册与发现(Consul+gliderlabs/registrator示例)

微服务架构之服务注册与发现(Consul+gliderlabs/registrator示例)

时间:2022-08-26 21:13:53浏览次数:77  
标签:registrator 服务 示例 -- 0.0 Consul 节点 注册 consul

  在微服务架构中,由于系统的拆分,通常会有很多的服务,而每个服务又可能因为横向扩展而部署在多台服务器上,当服务A需要调用服务B的接口时,服务A该如何知道服务B的主机地址就成了一个问题,如果将B服务地址写死在配置文件中,那么当服务B扩展、下线或主机迁移时,服务A都需要改动配置文件以保证接口的正常调用,如果只有服务A需要调用服务B还好,手动修改也不是十分麻烦,但是在复杂的微服务架构中,一个服务往往会被多个服务调用,如果全部以手动的形式修改,那么无论在便捷性、安全性还有准确性方面都是负面的。而服务注册发现系统就是为了帮助我们解决微服务中服务寻址的问题。

注册中心原理

  在微服务架构下,主要有三种角色:服务提供者(RPC Server)、服务消费者(RPC Client)和服务注册中心(Registry)。

  • RPC Server 提供服务,在启动时,根据服务发布文件 server.xml 中的配置的信息,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。
  • RPC Client 调用服务,在启动时,根据服务引用文件 client.xml 中配置的信息,向 Registry 订阅服务,把 Registry 返回的服务节点列表缓存在本地内存中,并与 RPC Sever 建立连接。
  • 当 RPC Server 节点发生变更时,Registry 会同步变更,RPC Client 感知后会刷新本地内存中缓存的服务节点列表。
  • RPC Client 从本地缓存的服务节点列表中,基于负载均衡算法选择一台 RPC Sever 发起调用。

注册中心实现方式

  1. 注册中心 API:根据注册中心原理的描述,注册中心必须提供以下最基本的 api,服务注册接口,服务反注册接口,心跳汇报接口,服务订阅接口,服务变更查询接口。
  2. 集群部署:注册中心作为服务提供者和服务消费者之间沟通的桥梁,它的重要性不言而喻。所以注册中心一般都是采用集群部署来保证高可用性,并通过分布式一致性协议来确保集群中不同节点之间的数据保持一致。
  3. 服务健康状态检测:注册中心除了要支持最基本的服务注册和服务订阅功能以外,还必须具备对服务提供者节点的健康状态检测功能,这样才能保证注册中心里保存的服务节点都是可用的。
  4. 服务状态变更通知:一旦注册中心探测到有服务提供者节点新加入或者被剔除,就必须立刻通知所有订阅该服务的服务消费者,刷新本地缓存的服务节点信息,确保服务调用不会请求不可用的服务提供者节点。

开源服务注册中心对比

名称

优点

缺点

接口

一致性算法

zookeeper

1.功能强大,不仅仅只是服务发现2.提供watcher机制能实时获取服务提供者的状态3.dubbo等框架支持

1.没有健康检查2.需在服务中集成sdk,复杂度高3.不支持多数据中心

sdk

Paxos

consul

1.简单易用,不需要集成sdk2.自带健康检查3.支持多数据中心4.提供web管理界面

1.不能实时获取服务信息的变化通知

http/dns

Raft

etcd

1.简单易用,不需要集成sdk2.可配置性强

1.没有健康检查2.需配合第三方工具一起完成服务发现3.不支持多数据中心

http

Raft

使用Docker部署单节点Consul

  不启用acl时,可直接执行下面的命令,创建一个只有一个节点的consul集群
sudo docker run -id -expose=[8300,8301,8302,8500,8600] --restart always -p 18300:8300 -p 18301:8301 -p 18302:8302 -p 18500:8500 -p 18600:8600 --name server1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -bootstrap-expect=1 -node=server1 -bind=0.0.0.0 -client=0.0.0.0 -ui -datacenter dc1
  启用acl是,只需要修改上面-e参数,如下面的命令,其中token_value可自行设置
sudo docker run -id -expose=[8300,8301,8302,8500,8600] --restart always -p 18300:8300 -p 18301:8301 -p 18302:8302 -p 18500:8500 -p 18600:8600 --name server1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true,"acl": {"enabled": true,"default_policy": "deny","down_policy": "extend-cache","tokens": {"master": "token_value"}}}' consul agent -server -bootstrap-expect=1 -node=server1 -bind=0.0.0.0 -client=0.0.0.0 -ui -datacenter dc1
  配置参考:consul官方网站
-expose:暴露出出来的端口,即consul启动所需的端口:8300,8301,8302,8500,8600
--restart:always表示容器挂了就自动重启
-p:建立宿主机与容器的端口映射
--name:容器名称
-e:环境变量,这里用于对consul进行配置
consul:这是consul镜像名,不是consul命令
agent:容器中执行的命令,各参数含义:
-server:表示节点是server类型
-bootstrap-expect:表示集群中有几个server节点后开始选举leader,既然是单节点集群,那自然就是1了
-node:节点名称
-bind:集群内部通信地址,默认是0.0.0.0
-client:客户端地址,默认是127.0.0.1
-ui:启用consul的web页面管理
-datacenter:数据中心

  访问服务器的18500端口,即可进入consul的管理页面:

   集成gliderlabs/registrator实现服务自动注册

  Registrator监控新建的Docker容器,并且检查判定这些容器提供的服务。从我们的目的出发,任何监听在某个端口的程序都是服务。Registrator发现在容器内发现的任务服务,都将被添加到一个服务注册端,比如Consul或etcd。

  详细配置说明可以参考:官方docker镜像地址 , Registrator中文文档

1 docker run -d \
2 --name=registrator \
3 --net=host \
4 --volume=/var/run/docker.sock:/tmp/docker.sock \
5 gliderlabs/registrator:latest \
6 -ip 192.168.0.8 \
7 consul://192.168.0.8:18500
主机ip+端口
1 docker run -d \
2 --name=registrator \
3 --net=host \
4 --volume=/var/run/docker.sock:/tmp/docker.sock \
5 gliderlabs/registrator:latest \
6 -internal \
7 consul://localhost:18500
容器ip+端口

  

标签:registrator,服务,示例,--,0.0,Consul,节点,注册,consul
From: https://www.cnblogs.com/jasonbourne3/p/16629275.html

相关文章

  • stream() 简单示例
    publicstaticvoidmain(String[]args){List<Integer>list=newArrayList<>();list.add(1);list.add(2);list.add(3);......
  • consul上注册的服务出现红叉的解决方案
    问题描述解决方案:打开心跳机制###consul服务端口号server:port:8006spring:application:name:consul-provider-payment####consul注册中心地......
  • consul的安装和配置
    中文参考文档1.安装下载安装包链接查看系统的架构dpkg--print-architecture下载安装包使用lrzsz工具将安装包上传到Linux系统解压缩xxx.zip文件给......
  • jansson 示例
    安装jansson步骤:http://blog.csdn.net/lz909/article/details/46042979jansson手册:https://jansson.readthedocs.io/en/latest/index.htmlAPI介绍: http://jansson......
  • golang运行grpc示例项目报错:exec: "C:\\Users\\User\\AppData\\Local\\Temp
    golang运行grpc示例项目报错:exec:"C:\Users\User\AppData\Local\Temp\go-build4227870276\b001\exe\server":filedoesnotexist文件找不到,经过排查,发现是编译的文件......
  • 随机函数变换示例
    随机函数变换示例作者:Grey原文地址:随机函数变换示例说明本示例中基于Java,其他语言也有类似的API解决的问题问题1Java中Math.random()函数是等概率返回区间[0......
  • PHP代码示例 - 创建、读取、增加、删除、修改 xml
    这篇文章我们将讨论如何使用php对xml进行CRUD(创建、读取、更新、删除)操作,CRUD操作通常是数据库的基本数据操作。这里,我们将创建一个简单的PHP应用程序,在XML而不是数据库上......
  • [prometheus]基于consul的服务发现
    前言prometheus默认使用静态配置文件监控服务,每次添加服务都要重载,比较麻烦。好在官方提供多种动态服务发现的方法,常用的一般有基于文件服务发现、基于consul服务发现和基......
  • JavaScript实现数字前补“0”的五种方法示例
    来自:https://www.jb51.net/article/153945.htm侵删<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-trans......
  • 第十章 对象的示例化内存布局与访问定位
    遍地都是月光,可月亮只有一个1.对象的实例化创建对象的方式new:最常见的方式、单例类中调用getInstance的静态方法、XXXFactory的静态方法。Class的newInstance方......