SpringBoot(微服务)注册分布式Consul
创始人
2025-05-28 18:07:30
0次

Consul是什么

Consul是一个基于HTTP的服务发现工具,用于配置和管理系统和服务之间的依赖关系。它提供了一个简单的方式来注册、发现和配置服务,并包括健康检查、负载均衡和故障转移等功能。

Consul是一种分布式系统,用于在大型分布式系统中实现服务发现和配置共享。它使用Raft协议来实现强一致性,保证了在多个节点之间进行的数据更新的原子性。

Consul客户端可以将它们自己的服务信息注册到Consul服务器。这样,Consul服务器将自动成为所有服务的服务目录。此外,Consul还提供了一个健康检查机制,以确保已注册的服务仍然可以正常工作。

当一个客户端想要调用一个服务时,它可以从Consul服务器获取服务的网络位置信息。然后,客户端将使用此信息建立与服务的网络连接。

Consul通过HTTP API公开其服务发现和配置共享功能,这使得使用Consul与其他系统相当容易,如Kubernetes等容器编排工具。

总之,Consul的分布式注册原理是通过服务端和客户端之间的交互来实现服务发现和健康检查。客户端将服务信息注册到Consul服务器,然后从Consul服务器获取服务信息并建立网络连接。Consul使用Raft协议确保强一致性,并提供HTTP API进行访问。

Consul原理

Consul采用的是集中式的注册中心架构,其中包含一个服务发现组件和一个KV存储组件。

服务发现组件:Consul中的服务发现是通过一组Agent和Server实现的。Agent是每个主机上运行的代理,用于与服务交互并报告本地运行状况。Server是负责在Consul集群中运行Raft算法的节点,以实现高可用性。

当服务启动时,它会向本地的Consul Agent发送一个服务注册请求,Agent会将服务的元数据信息(服务名、地址、端口等)注册到Consul的KV存储中。服务消费者可以通过向Agent发送服务发现请求来获取服务的地址和端口信息,然后向该地址发送请求以调用服务。

KV存储组件:Consul中的KV存储组件用于存储键值对信息,可以用于存储任何数据。在服务注册和发现中,服务元数据信息就是存储在KV存储中的。

当服务启动时,它会将自己的元数据信息存储到Consul的KV存储中,同时也会定期发送心跳请求告诉Consul服务还在运行。当服务终止时,它会发送一个注销请求告诉Consul将服务从KV存储中删除。

服务消费者可以从Consul的KV存储中获取服务的元数据信息,然后使用这些信息来调用服务。同时,服务消费者也可以监听KV存储中元数据信息的变化,当服务的元数据信息发生变化时,它会自动更新本地缓存。

总体来说,Consul的服务注册和发现过程如下:

  1. 服务启动时,将自己的元数据信息注册到Consul的KV存储中,同时向本地的Consul Agent发送心跳请求告诉Consul服务还在运行。
  2. 服务消费者向Consul Agent发送服务发现请求,Agent从KV存储中获取服务的元数据信息并返回给服务消费者。
  3. 服务消费者使用获取到的服务元数据信息来调用服务。
  4. 当服务终止时,它会发送一个注销请求告诉Consul将服务从KV存储中删除。

启动 Consul 集群

#启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8900端口,同时开启管理界面 
docker run -d --name=consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui #启动第2个Server节点,并加入集群 
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2 #启动第3个Server节点,并加入集群 
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2 #启动第4个Client节点,并加入集群 
docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.2 

第 1 个启动容器的 IP 一般是 172.17.0.2,后边启动的几个容器 IP 会排着来:172.17.0.3、172.17.0.4、172.17.0.5。

这些 Consul 节点在 Docker 的容器内是互通的,他们通过桥接的模式通信。但是如果主机要访问容器内的网络,需要做端口映射。

在启动第一个容器时,将 Consul 的 8500 端口映射到了主机的 8900 端口,这样就可以方便的通过主机的浏览器查看集群信息。

kubernetes集成Consul

 

Kubernetes中的一个Pod中可以包含多个容器,这些容器可以协同工作,形成一个完整的服务。在这个例子中,一个Pod中包含了三个容器:Consul客户端容器、Java应用容器和Filebeat容器。

Consul客户端容器是用来向Kubernetes集群外的Consul服务器注册服务的。Consul客户端可以通过API或DNS接口与Consul服务器进行通信,将服务注册信息发送给Consul服务器,包括服务的名称、IP地址、端口号等元数据信息。

Java应用容器是用来运行业务应用程序的。它会通过Consul客户端容器中的API或DNS接口查询服务的信息,包括IP地址和端口号,以便能够与其它服务通信。

Filebeat容器则是用来收集Java应用程序的日志文件,并将其发送到指定的日志服务器进行处理和存储。

下面是大致的架构图:

                            +---------------------+| Consul Server       || (集群外的Consul服务器) |+---------------------+|| HTTP/DNS API|+---------------------+| Consul Client       || (Pod中的容器)       |+---------------------+/  \/    \/      \HTTP/DNS API       |       HTTP API+-------+       |       +--------+| Java  |       |       | File-  || App   |<------+------>| beat   ||       |               |        |+-------+               +--------+

在这个架构图中,Java应用容器和Filebeat容器都与Consul客户端容器通过HTTP/DNS API进行通信。Java应用容器使用Consul客户端容器提供的服务注册信息与其它服务进行通信,Filebeat容器则通过HTTP API将收集的日志文件发送到指定的日志服务器。Consul客户端容器通过HTTP API将服务注册信息发送给Kubernetes集群外的Consul服务器,以便其它服务可以发现和使用它们。

以下是 Java 应用通过 Consul 客户端注册到 Consul 服务端的详细步骤流程:

  1. Pod 中的 Consul 客户端启动,并向 Consul 集群发现服务请求。

  2. Consul 客户端会向 Consul 服务端的任一节点发出注册请求,告知它所在的服务名称、IP 地址、端口号、标签等信息,以及该服务的健康检查规则。

  3. Consul 服务端接收到注册请求后,会将该服务信息存储在本地的 KV 存储中,并将该服务的状态标记为“不健康”。

  4. Consul 客户端会根据所注册的健康检查规则,定期向 Consul 服务端发送健康检查请求,并根据响应结果更新本地的服务状态。

  5. 当该服务的状态为“健康”时,Consul 客户端会将该服务的状态信息存储在本地的缓存中,并向本地的 Java 应用提供服务发现和负载均衡功能。

  6. Java 应用通过调用 Consul 客户端提供的 API,获取所需服务的 IP 地址和端口号,并通过这些信息与目标服务建立连接。

  7. 如果需要对该服务进行修改或注销,Java 应用可以向 Consul 客户端发送对应的请求。

  8. Consul 客户端接收到请求后,会将请求转发给 Consul 服务端,并更新本地的缓存。

  9. Consul 服务端接收到请求后,会更新该服务在本地 KV 存储中的信息,并将该服务的状态标记为“不健康”。

  10. Consul 客户端会根据所注册的健康检查规则,定期向 Consul 服务端发送健康检查请求,并根据响应结果更新本地的服务状态。

总体架构图如下:

 

在该架构中,Consul 客户端和 Java 应用都运行在 Pod 中,其中 Consul 客户端负责服务注册和服务发现,Java 应用则通过 Consul 客户端获取所需服务的信息。同时,Filebeat 用于收集应用的日志数据,并将其发送至目标日志存储系统。

SpringBoot注册Consul

SpringBoot可以通过使用Consul的Java客户端库来实现与Consul的集成,该库提供了丰富的API,包括服务注册、服务发现、KV存储等功能。下面是SpringBoot注册Consul的大致步骤和原理:

  1. 引入Consul客户端库

在SpringBoot项目的pom.xml中引入Consul客户端库的依赖,例如:


4.0.0org.springframework.bootspring-boot-starter-parent2.5.4com.springboot.demoweb-demo0.0.1-SNAPSHOTweb-demoweb-demo1.8Finchley.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-consul-discoveryorg.springframework.bootspring-boot-starter-actuatororg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-pluginorg.springframework.cloudspring-cloud-dependencies2020.0.3pomimport

      2、配置Consul连接信息

在SpringBoot项目的application.yml文件中配置Consul的连接信息,例如:

server:port: 1000
spring:application:name: heiancloud:consul:enabled: truehost: 192.168.102.20  # 注册中心地址port: 8500  # 注册中心地址的端口discovery:hostname: 192.168.96.19 # 本地ipinstance-id: ${spring.application.name}:${spring.cloud.consul.discovery.hostname}:${server.port}#health-check-path: ${server.servlet.context-path}/actuator/health # 如果配置了context-path就配置,没有就不配health-check-interval: 15s # 每隔15s做一次健康检查register: trueregister-health-check: trueservice-name: ${spring.application.name}# 放开端口
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: always

 3、实现服务注册

启动类

@EnableDiscoveryClient
@SpringBootApplication
public class WebDemoApplication {public static void main(String[] args) {SpringApplication.run(WebDemoApplication.class, args);}}

控制类

package com.springboot.demo.webdemo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;@RestController
@RequestMapping("/employee")
public class EmployeeController {@GetMappingpublic HashMap index(){HashMap hashmap = new HashMap();hashmap.put("姓名", "王二");hashmap.put("年龄", "27");hashmap.put("工龄", "6");return hashmap;}
}

 

 

 

总结 

Spring Boot应用可以通过向Consul注册自身来实现服务发现和治理,使得其他服务可以在Consul中发现并调用它。

 

文档:

https://www.cnblogs.com/qingyunye/p/12932493.html

一篇文章了解Consul服务发现实现原理 | Harries Blog™

相关内容

热门资讯

在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...