SpringBoot微服務(wù)注冊(cè)分布式Consul的詳細(xì)過(guò)程
Consul是什么
Consul是一個(gè)基于HTTP的服務(wù)發(fā)現(xiàn)工具,用于配置和管理系統(tǒng)和服務(wù)之間的依賴關(guān)系。它提供了一個(gè)簡(jiǎn)單的方式來(lái)注冊(cè)、發(fā)現(xiàn)和配置服務(wù),并包括健康檢查、負(fù)載均衡和故障轉(zhuǎn)移等功能。
Consul是一種分布式系統(tǒng),用于在大型分布式系統(tǒng)中實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和配置共享。它使用Raft協(xié)議來(lái)實(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通過(guò)HTTP API公開(kāi)其服務(wù)發(fā)現(xiàn)和配置共享功能,這使得使用Consul與其他系統(tǒng)相當(dāng)容易,如Kubernetes等容器編排工具。
總之,Consul的分布式注冊(cè)原理是通過(guò)服務(wù)端和客戶端之間的交互來(lái)實(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)行訪問(wèn)。
Consul原理

Consul采用的是集中式的注冊(cè)中心架構(gòu),其中包含一個(gè)服務(wù)發(fā)現(xiàn)組件和一個(gè)KV存儲(chǔ)組件。
服務(wù)發(fā)現(xiàn)組件:Consul中的服務(wù)發(fā)現(xiàn)是通過(guò)一組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)者可以通過(guò)向Agent發(fā)送服務(wù)發(fā)現(xiàn)請(qǐng)求來(lái)獲取服務(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è)注銷(xiāo)請(qǐng)求告訴Consul將服務(wù)從KV存儲(chǔ)中刪除。
服務(wù)消費(fèi)者可以從Consul的KV存儲(chǔ)中獲取服務(wù)的元數(shù)據(jù)信息,然后使用這些信息來(lái)調(diào)用服務(wù)。同時(shí),服務(wù)消費(fèi)者也可以監(jiān)聽(tīng)KV存儲(chǔ)中元數(shù)據(jù)信息的變化,當(dāng)服務(wù)的元數(shù)據(jù)信息發(fā)生變化時(shí),它會(huì)自動(dòng)更新本地緩存。
總體來(lái)說(shuō),Consul的服務(wù)注冊(cè)和發(fā)現(xiàn)過(guò)程如下:
- 服務(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ù)信息來(lái)調(diào)用服務(wù)。
- 當(dāng)服務(wù)終止時(shí),它會(huì)發(fā)送一個(gè)注銷(xiāo)請(qǐng)求告訴Consul將服務(wù)從KV存儲(chǔ)中刪除。
啟動(dòng) Consul 集群
#啟動(dòng)第1個(gè)Server節(jié)點(diǎn),集群要求要有3個(gè)Server,將容器8500端口映射到主機(jī)8900端口,同時(shí)開(kāi)啟管理界面 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ì)排著來(lái):172.17.0.3、172.17.0.4、172.17.0.5。
這些 Consul 節(jié)點(diǎn)在 Docker 的容器內(nèi)是互通的,他們通過(guò)橋接的模式通信。但是如果主機(jī)要訪問(wèn)容器內(nèi)的網(wǎng)絡(luò),需要做端口映射。
在啟動(dòng)第一個(gè)容器時(shí),將 Consul 的 8500 端口映射到了主機(jī)的 8900 端口,這樣就可以方便的通過(guò)主機(jī)的瀏覽器查看集群信息。

kubernetes集成Consul

Kubernetes中的一個(gè)Pod中可以包含多個(gè)容器,這些容器可以協(xié)同工作,形成一個(gè)完整的服務(wù)。在這個(gè)例子中,一個(gè)Pod中包含了三個(gè)容器:Consul客戶端容器、Java應(yīng)用容器和Filebeat容器。
Consul客戶端容器是用來(lái)向Kubernetes集群外的Consul服務(wù)器注冊(cè)服務(wù)的。Consul客戶端可以通過(guò)API或DNS接口與Consul服務(wù)器進(jìn)行通信,將服務(wù)注冊(cè)信息發(fā)送給Consul服務(wù)器,包括服務(wù)的名稱、IP地址、端口號(hào)等元數(shù)據(jù)信息。
Java應(yīng)用容器是用來(lái)運(yùn)行業(yè)務(wù)應(yīng)用程序的。它會(huì)通過(guò)Consul客戶端容器中的API或DNS接口查詢服務(wù)的信息,包括IP地址和端口號(hào),以便能夠與其它服務(wù)通信。
Filebeat容器則是用來(lái)收集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客戶端容器通過(guò)HTTP/DNS API進(jìn)行通信。Java應(yīng)用容器使用Consul客戶端容器提供的服務(wù)注冊(cè)信息與其它服務(wù)進(jìn)行通信,F(xiàn)ilebeat容器則通過(guò)HTTP API將收集的日志文件發(fā)送到指定的日志服務(wù)器。Consul客戶端容器通過(guò)HTTP API將服務(wù)注冊(cè)信息發(fā)送給Kubernetes集群外的Consul服務(wù)器,以便其它服務(wù)可以發(fā)現(xiàn)和使用它們。
以下是 Java 應(yīng)用通過(guò) 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)用通過(guò)調(diào)用 Consul 客戶端提供的 API,獲取所需服務(wù)的 IP 地址和端口號(hào),并通過(guò)這些信息與目標(biāo)服務(wù)建立連接。
- 如果需要對(duì)該服務(wù)進(jìn)行修改或注銷(xiāo),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)用則通過(guò) Consul 客戶端獲取所需服務(wù)的信息。同時(shí),F(xiàn)ilebeat 用于收集應(yīng)用的日志數(shù)據(jù),并將其發(fā)送至目標(biāo)日志存儲(chǔ)系統(tǒng)。
SpringBoot注冊(cè)Consul
SpringBoot可以通過(guò)使用Consul的Java客戶端庫(kù)來(lái)實(shí)現(xiàn)與Consul的集成,該庫(kù)提供了豐富的API,包括服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、KV存儲(chǔ)等功能。下面是SpringBoot注冊(cè)Consul的大致步驟和原理:
1.引入Consul客戶端庫(kù)
在SpringBoot項(xiàng)目的pom.xml中引入Consul客戶端庫(kù)的依賴,例如:
<?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就配置,沒(méi)有就不配
health-check-interval: 15s # 每隔15s做一次健康檢查
register: true
register-health-check: true
service-name: ${spring.application.name}
# 放開(kāi)端口
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always3、實(shí)現(xiàn)服務(wù)注冊(cè)
啟動(dòng)類(lèi)
@EnableDiscoveryClient
@SpringBootApplication
public class WebDemoApplication {
public static void main(String[] args) {
SpringApplication.run(WebDemoApplication.class, args);
}
}控制類(lèi)
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)用可以通過(guò)向Consul注冊(cè)自身來(lái)實(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)文章
application.yaml與bootstrap.yaml的使用
這篇文章主要介紹了application.yaml與bootstrap.yaml的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringBoot整合Security安全框架實(shí)現(xiàn)控制權(quán)限
本文主要介紹了SpringBoot整合Security安全框架實(shí)現(xiàn)控制權(quán)限,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
mybatis 如何判斷l(xiāng)ist集合是否包含指定數(shù)據(jù)
這篇文章主要介紹了mybatis 判斷l(xiāng)ist集合是否包含指定數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之二叉樹(shù)
今天給大家?guī)?lái)的是關(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),文章圍繞著Java二叉樹(shù)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
如何在maven本地倉(cāng)庫(kù)中添加oracle的jdbc驅(qū)動(dòng)
文章介紹了在Maven項(xiàng)目中添加Oracle數(shù)據(jù)庫(kù)驅(qū)動(dòng)ojdbc5時(shí)遇到的問(wèn)題以及解決問(wèn)題的兩種方法,方法一為簡(jiǎn)單粗暴,但沒(méi)有體現(xiàn)Maven倉(cāng)庫(kù)的作用,需要手動(dòng)管理jar包,方法二為在Maven本地倉(cāng)庫(kù)中添加Oracle的JDBC驅(qū)動(dòng),過(guò)程較為繁瑣,但配置一次后可以多次使用2024-11-11
SpringBoot 如何使用RestTemplate來(lái)調(diào)用接口
這篇文章主要介紹了SpringBoot 如何使用RestTemplate來(lái)調(diào)用接口方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
基于傳遞list類(lèi)型的參數(shù)的問(wèn)題
這篇文章主要介紹了基于傳遞list類(lèi)型的參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
SpringMVC實(shí)現(xiàn)文件上傳下載的全過(guò)程
對(duì)于上傳功能,我們?cè)陧?xiàng)目中是經(jīng)常會(huì)用到的,比如用戶注冊(cè)的時(shí)候,上傳用戶頭像,這個(gè)時(shí)候就會(huì)使用到上傳的功能,而對(duì)于下載使用場(chǎng)景也很常見(jiàn),下面這篇文章主要給大家介紹了關(guān)于SpringMVC實(shí)現(xiàn)文件上傳下載的相關(guān)資料,需要的朋友可以參考下2022-01-01

