SpringBoot微服務(wù)注冊(cè)分布式Consul的詳細(xì)過程
Consul是什么
Consul是一個(gè)基于HTTP的服務(wù)發(fā)現(xiàn)工具,用于配置和管理系統(tǒng)和服務(wù)之間的依賴關(guān)系。它提供了一個(gè)簡(jiǎn)單的方式來注冊(cè)、發(fā)現(xiàn)和配置服務(wù),并包括健康檢查、負(fù)載均衡和故障轉(zhuǎn)移等功能。
Consul是一種分布式系統(tǒng),用于在大型分布式系統(tǒng)中實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和配置共享。它使用Raft協(xié)議來實(shí)現(xiàn)強(qiáng)一致性,保證了在多個(gè)節(jié)點(diǎn)之間進(jìn)行的數(shù)據(jù)更新的原子性。
Consul客戶端可以將它們自己的服務(wù)信息注冊(cè)到Consul服務(wù)器。這樣,Consul服務(wù)器將自動(dòng)成為所有服務(wù)的服務(wù)目錄。此外,Consul還提供了一個(gè)健康檢查機(jī)制,以確保已注冊(cè)的服務(wù)仍然可以正常工作。
當(dāng)一個(gè)客戶端想要調(diào)用一個(gè)服務(wù)時(shí),它可以從Consul服務(wù)器獲取服務(wù)的網(wǎng)絡(luò)位置信息。然后,客戶端將使用此信息建立與服務(wù)的網(wǎng)絡(luò)連接。
Consul通過HTTP API公開其服務(wù)發(fā)現(xiàn)和配置共享功能,這使得使用Consul與其他系統(tǒng)相當(dāng)容易,如Kubernetes等容器編排工具。
總之,Consul的分布式注冊(cè)原理是通過服務(wù)端和客戶端之間的交互來實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和健康檢查??蛻舳藢⒎?wù)信息注冊(cè)到Consul服務(wù)器,然后從Consul服務(wù)器獲取服務(wù)信息并建立網(wǎng)絡(luò)連接。Consul使用Raft協(xié)議確保強(qiáng)一致性,并提供HTTP API進(jìn)行訪問。
Consul原理

Consul采用的是集中式的注冊(cè)中心架構(gòu),其中包含一個(gè)服務(wù)發(fā)現(xiàn)組件和一個(gè)KV存儲(chǔ)組件。
服務(wù)發(fā)現(xiàn)組件:Consul中的服務(wù)發(fā)現(xiàn)是通過一組Agent和Server實(shí)現(xiàn)的。Agent是每個(gè)主機(jī)上運(yùn)行的代理,用于與服務(wù)交互并報(bào)告本地運(yùn)行狀況。Server是負(fù)責(zé)在Consul集群中運(yùn)行Raft算法的節(jié)點(diǎn),以實(shí)現(xiàn)高可用性。
當(dāng)服務(wù)啟動(dòng)時(shí),它會(huì)向本地的Consul Agent發(fā)送一個(gè)服務(wù)注冊(cè)請(qǐng)求,Agent會(huì)將服務(wù)的元數(shù)據(jù)信息(服務(wù)名、地址、端口等)注冊(cè)到Consul的KV存儲(chǔ)中。服務(wù)消費(fèi)者可以通過向Agent發(fā)送服務(wù)發(fā)現(xiàn)請(qǐng)求來獲取服務(wù)的地址和端口信息,然后向該地址發(fā)送請(qǐng)求以調(diào)用服務(wù)。
KV存儲(chǔ)組件:Consul中的KV存儲(chǔ)組件用于存儲(chǔ)鍵值對(duì)信息,可以用于存儲(chǔ)任何數(shù)據(jù)。在服務(wù)注冊(cè)和發(fā)現(xiàn)中,服務(wù)元數(shù)據(jù)信息就是存儲(chǔ)在KV存儲(chǔ)中的。
當(dāng)服務(wù)啟動(dòng)時(shí),它會(huì)將自己的元數(shù)據(jù)信息存儲(chǔ)到Consul的KV存儲(chǔ)中,同時(shí)也會(huì)定期發(fā)送心跳請(qǐng)求告訴Consul服務(wù)還在運(yùn)行。當(dāng)服務(wù)終止時(shí),它會(huì)發(fā)送一個(gè)注銷請(qǐng)求告訴Consul將服務(wù)從KV存儲(chǔ)中刪除。
服務(wù)消費(fèi)者可以從Consul的KV存儲(chǔ)中獲取服務(wù)的元數(shù)據(jù)信息,然后使用這些信息來調(diào)用服務(wù)。同時(shí),服務(wù)消費(fèi)者也可以監(jiān)聽KV存儲(chǔ)中元數(shù)據(jù)信息的變化,當(dāng)服務(wù)的元數(shù)據(jù)信息發(fā)生變化時(shí),它會(huì)自動(dòng)更新本地緩存。
總體來說,Consul的服務(wù)注冊(cè)和發(fā)現(xiàn)過程如下:
- 服務(wù)啟動(dòng)時(shí),將自己的元數(shù)據(jù)信息注冊(cè)到Consul的KV存儲(chǔ)中,同時(shí)向本地的Consul Agent發(fā)送心跳請(qǐng)求告訴Consul服務(wù)還在運(yùn)行。
- 服務(wù)消費(fèi)者向Consul Agent發(fā)送服務(wù)發(fā)現(xiàn)請(qǐng)求,Agent從KV存儲(chǔ)中獲取服務(wù)的元數(shù)據(jù)信息并返回給服務(wù)消費(fèi)者。
- 服務(wù)消費(fèi)者使用獲取到的服務(wù)元數(shù)據(jù)信息來調(diào)用服務(wù)。
- 當(dāng)服務(wù)終止時(shí),它會(huì)發(fā)送一個(gè)注銷請(qǐng)求告訴Consul將服務(wù)從KV存儲(chǔ)中刪除。
啟動(dòng) Consul 集群
#啟動(dòng)第1個(gè)Server節(jié)點(diǎn),集群要求要有3個(gè)Server,將容器8500端口映射到主機(jī)8900端口,同時(shí)開啟管理界面 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 #啟動(dòng)第2個(gè)Server節(jié)點(diǎn),并加入集群 docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2 #啟動(dòng)第3個(gè)Server節(jié)點(diǎn),并加入集群 docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2 #啟動(dòng)第4個(gè)Client節(jié)點(diǎn),并加入集群 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 個(gè)啟動(dòng)容器的 IP 一般是 172.17.0.2,后邊啟動(dòng)的幾個(gè)容器 IP 會(huì)排著來:172.17.0.3、172.17.0.4、172.17.0.5。
這些 Consul 節(jié)點(diǎn)在 Docker 的容器內(nèi)是互通的,他們通過橋接的模式通信。但是如果主機(jī)要訪問容器內(nèi)的網(wǎng)絡(luò),需要做端口映射。
在啟動(dòng)第一個(gè)容器時(shí),將 Consul 的 8500 端口映射到了主機(jī)的 8900 端口,這樣就可以方便的通過主機(jī)的瀏覽器查看集群信息。

kubernetes集成Consul

Kubernetes中的一個(gè)Pod中可以包含多個(gè)容器,這些容器可以協(xié)同工作,形成一個(gè)完整的服務(wù)。在這個(gè)例子中,一個(gè)Pod中包含了三個(gè)容器:Consul客戶端容器、Java應(yīng)用容器和Filebeat容器。
Consul客戶端容器是用來向Kubernetes集群外的Consul服務(wù)器注冊(cè)服務(wù)的。Consul客戶端可以通過API或DNS接口與Consul服務(wù)器進(jìn)行通信,將服務(wù)注冊(cè)信息發(fā)送給Consul服務(wù)器,包括服務(wù)的名稱、IP地址、端口號(hào)等元數(shù)據(jù)信息。
Java應(yīng)用容器是用來運(yùn)行業(yè)務(wù)應(yīng)用程序的。它會(huì)通過Consul客戶端容器中的API或DNS接口查詢服務(wù)的信息,包括IP地址和端口號(hào),以便能夠與其它服務(wù)通信。
Filebeat容器則是用來收集Java應(yīng)用程序的日志文件,并將其發(fā)送到指定的日志服務(wù)器進(jìn)行處理和存儲(chǔ)。
下面是大致的架構(gòu)圖:
+---------------------+
| Consul Server |
| (集群外的Consul服務(wù)器) |
+---------------------+
|
| HTTP/DNS API
|
+---------------------+
| Consul Client |
| (Pod中的容器) |
+---------------------+
/ \
/ \
/ \
HTTP/DNS API | HTTP API
+-------+ | +--------+
| Java | | | File- |
| App |<------+------>| beat |
| | | |
+-------+ +--------+在這個(gè)架構(gòu)圖中,Java應(yīng)用容器和Filebeat容器都與Consul客戶端容器通過HTTP/DNS API進(jìn)行通信。Java應(yīng)用容器使用Consul客戶端容器提供的服務(wù)注冊(cè)信息與其它服務(wù)進(jìn)行通信,F(xiàn)ilebeat容器則通過HTTP API將收集的日志文件發(fā)送到指定的日志服務(wù)器。Consul客戶端容器通過HTTP API將服務(wù)注冊(cè)信息發(fā)送給Kubernetes集群外的Consul服務(wù)器,以便其它服務(wù)可以發(fā)現(xiàn)和使用它們。
以下是 Java 應(yīng)用通過 Consul 客戶端注冊(cè)到 Consul 服務(wù)端的詳細(xì)步驟流程:
- Pod 中的 Consul 客戶端啟動(dòng),并向 Consul 集群發(fā)現(xiàn)服務(wù)請(qǐng)求。
- Consul 客戶端會(huì)向 Consul 服務(wù)端的任一節(jié)點(diǎn)發(fā)出注冊(cè)請(qǐng)求,告知它所在的服務(wù)名稱、IP 地址、端口號(hào)、標(biāo)簽等信息,以及該服務(wù)的健康檢查規(guī)則。
- Consul 服務(wù)端接收到注冊(cè)請(qǐng)求后,會(huì)將該服務(wù)信息存儲(chǔ)在本地的 KV 存儲(chǔ)中,并將該服務(wù)的狀態(tài)標(biāo)記為“不健康”。
- Consul 客戶端會(huì)根據(jù)所注冊(cè)的健康檢查規(guī)則,定期向 Consul 服務(wù)端發(fā)送健康檢查請(qǐng)求,并根據(jù)響應(yīng)結(jié)果更新本地的服務(wù)狀態(tài)。
- 當(dāng)該服務(wù)的狀態(tài)為“健康”時(shí),Consul 客戶端會(huì)將該服務(wù)的狀態(tài)信息存儲(chǔ)在本地的緩存中,并向本地的 Java 應(yīng)用提供服務(wù)發(fā)現(xiàn)和負(fù)載均衡功能。
- Java 應(yīng)用通過調(diào)用 Consul 客戶端提供的 API,獲取所需服務(wù)的 IP 地址和端口號(hào),并通過這些信息與目標(biāo)服務(wù)建立連接。
- 如果需要對(duì)該服務(wù)進(jìn)行修改或注銷,Java 應(yīng)用可以向 Consul 客戶端發(fā)送對(duì)應(yīng)的請(qǐng)求。
- Consul 客戶端接收到請(qǐng)求后,會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給 Consul 服務(wù)端,并更新本地的緩存。
- Consul 服務(wù)端接收到請(qǐng)求后,會(huì)更新該服務(wù)在本地 KV 存儲(chǔ)中的信息,并將該服務(wù)的狀態(tài)標(biāo)記為“不健康”。
- Consul 客戶端會(huì)根據(jù)所注冊(cè)的健康檢查規(guī)則,定期向 Consul 服務(wù)端發(fā)送健康檢查請(qǐng)求,并根據(jù)響應(yīng)結(jié)果更新本地的服務(wù)狀態(tài)。
總體架構(gòu)圖如下:

在該架構(gòu)中,Consul 客戶端和 Java 應(yīng)用都運(yùn)行在 Pod 中,其中 Consul 客戶端負(fù)責(zé)服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn),Java 應(yīng)用則通過 Consul 客戶端獲取所需服務(wù)的信息。同時(shí),F(xiàn)ilebeat 用于收集應(yīng)用的日志數(shù)據(jù),并將其發(fā)送至目標(biāo)日志存儲(chǔ)系統(tǒng)。
SpringBoot注冊(cè)Consul
SpringBoot可以通過使用Consul的Java客戶端庫來實(shí)現(xiàn)與Consul的集成,該庫提供了豐富的API,包括服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、KV存儲(chǔ)等功能。下面是SpringBoot注冊(cè)Consul的大致步驟和原理:
1.引入Consul客戶端庫
在SpringBoot項(xiàng)目的pom.xml中引入Consul客戶端庫的依賴,例如:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/>
</parent>
<groupId>com.springboot.demo</groupId>
<artifactId>web-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>web-demo</name>
<description>web-demo</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2、配置Consul連接信息
在SpringBoot項(xiàng)目的application.yml文件中配置Consul的連接信息,例如:
server:
port: 1000
spring:
application:
name: heian
cloud:
consul:
enabled: true
host: 192.168.102.20 # 注冊(cè)中心地址
port: 8500 # 注冊(cè)中心地址的端口
discovery:
hostname: 192.168.96.19 # 本地ip
instance-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: true
register-health-check: true
service-name: ${spring.application.name}
# 放開端口
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always3、實(shí)現(xiàn)服務(wù)注冊(cè)
啟動(dòng)類
@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 {
@GetMapping
public HashMap<String, String> index(){
HashMap<String, String> hashmap = new HashMap<String, String>();
hashmap.put("姓名", "王二");
hashmap.put("年齡", "27");
hashmap.put("工齡", "6");
return hashmap;
}
}




總結(jié)
Spring Boot應(yīng)用可以通過向Consul注冊(cè)自身來實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和治理,使得其他服務(wù)可以在Consul中發(fā)現(xiàn)并調(diào)用它。
文檔:
https://www.cnblogs.com/qingyunye/p/12932493.html
一篇文章了解Consul服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)原理 | Harries Blog™
到此這篇關(guān)于SpringBoot(微服務(wù))注冊(cè)分布式Consul的文章就介紹到這了,更多相關(guān)SpringBoot注冊(cè)分布式Consul內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot中validator數(shù)據(jù)校驗(yàn)功能的實(shí)現(xiàn)
這篇文章主要介紹了springboot中validator數(shù)據(jù)校驗(yàn)功能,校驗(yàn)分為普通校驗(yàn)和分組校驗(yàn),每種校驗(yàn)方式通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析
這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程入口參數(shù)研究及創(chuàng)建對(duì)象源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
springboot實(shí)現(xiàn)分段上傳功能的示例代碼
這篇文章主要介紹了springboot實(shí)現(xiàn)分段上傳,包括文件上傳下載,斷點(diǎn)續(xù)傳,增量上傳功能,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
在java List中進(jìn)行模糊查詢的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄趈ava List中進(jìn)行模糊查詢的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
Spring Security 表單登錄功能的實(shí)現(xiàn)方法
這篇文章主要介紹了Spring Security 表單登錄,本文將構(gòu)建在之前簡(jiǎn)單的 Spring MVC示例 之上,因?yàn)檫@是設(shè)置Web應(yīng)用程序和登錄機(jī)制的必不可少的。需要的朋友可以參考下2019-06-06
spring+mybatis實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了spring+mybatis實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06

