SpringBoot微服務注冊分布式Consul的詳細過程
Consul是什么
Consul是一個基于HTTP的服務發(fā)現工具,用于配置和管理系統和服務之間的依賴關系。它提供了一個簡單的方式來注冊、發(fā)現和配置服務,并包括健康檢查、負載均衡和故障轉移等功能。
Consul是一種分布式系統,用于在大型分布式系統中實現服務發(fā)現和配置共享。它使用Raft協議來實現強一致性,保證了在多個節(jié)點之間進行的數據更新的原子性。
Consul客戶端可以將它們自己的服務信息注冊到Consul服務器。這樣,Consul服務器將自動成為所有服務的服務目錄。此外,Consul還提供了一個健康檢查機制,以確保已注冊的服務仍然可以正常工作。
當一個客戶端想要調用一個服務時,它可以從Consul服務器獲取服務的網絡位置信息。然后,客戶端將使用此信息建立與服務的網絡連接。
Consul通過HTTP API公開其服務發(fā)現和配置共享功能,這使得使用Consul與其他系統相當容易,如Kubernetes等容器編排工具。
總之,Consul的分布式注冊原理是通過服務端和客戶端之間的交互來實現服務發(fā)現和健康檢查??蛻舳藢⒎招畔⒆缘紺onsul服務器,然后從Consul服務器獲取服務信息并建立網絡連接。Consul使用Raft協議確保強一致性,并提供HTTP API進行訪問。
Consul原理
Consul采用的是集中式的注冊中心架構,其中包含一個服務發(fā)現組件和一個KV存儲組件。
服務發(fā)現組件:Consul中的服務發(fā)現是通過一組Agent和Server實現的。Agent是每個主機上運行的代理,用于與服務交互并報告本地運行狀況。Server是負責在Consul集群中運行Raft算法的節(jié)點,以實現高可用性。
當服務啟動時,它會向本地的Consul Agent發(fā)送一個服務注冊請求,Agent會將服務的元數據信息(服務名、地址、端口等)注冊到Consul的KV存儲中。服務消費者可以通過向Agent發(fā)送服務發(fā)現請求來獲取服務的地址和端口信息,然后向該地址發(fā)送請求以調用服務。
KV存儲組件:Consul中的KV存儲組件用于存儲鍵值對信息,可以用于存儲任何數據。在服務注冊和發(fā)現中,服務元數據信息就是存儲在KV存儲中的。
當服務啟動時,它會將自己的元數據信息存儲到Consul的KV存儲中,同時也會定期發(fā)送心跳請求告訴Consul服務還在運行。當服務終止時,它會發(fā)送一個注銷請求告訴Consul將服務從KV存儲中刪除。
服務消費者可以從Consul的KV存儲中獲取服務的元數據信息,然后使用這些信息來調用服務。同時,服務消費者也可以監(jiān)聽KV存儲中元數據信息的變化,當服務的元數據信息發(fā)生變化時,它會自動更新本地緩存。
總體來說,Consul的服務注冊和發(fā)現過程如下:
- 服務啟動時,將自己的元數據信息注冊到Consul的KV存儲中,同時向本地的Consul Agent發(fā)送心跳請求告訴Consul服務還在運行。
- 服務消費者向Consul Agent發(fā)送服務發(fā)現請求,Agent從KV存儲中獲取服務的元數據信息并返回給服務消費者。
- 服務消費者使用獲取到的服務元數據信息來調用服務。
- 當服務終止時,它會發(fā)送一個注銷請求告訴Consul將服務從KV存儲中刪除。
啟動 Consul 集群
#啟動第1個Server節(jié)點,集群要求要有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節(jié)點,并加入集群 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節(jié)點,并加入集群 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節(jié)點,并加入集群 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 節(jié)點在 Docker 的容器內是互通的,他們通過橋接的模式通信。但是如果主機要訪問容器內的網絡,需要做端口映射。
在啟動第一個容器時,將 Consul 的 8500 端口映射到了主機的 8900 端口,這樣就可以方便的通過主機的瀏覽器查看集群信息。
kubernetes集成Consul
Kubernetes中的一個Pod中可以包含多個容器,這些容器可以協同工作,形成一個完整的服務。在這個例子中,一個Pod中包含了三個容器:Consul客戶端容器、Java應用容器和Filebeat容器。
Consul客戶端容器是用來向Kubernetes集群外的Consul服務器注冊服務的。Consul客戶端可以通過API或DNS接口與Consul服務器進行通信,將服務注冊信息發(fā)送給Consul服務器,包括服務的名稱、IP地址、端口號等元數據信息。
Java應用容器是用來運行業(yè)務應用程序的。它會通過Consul客戶端容器中的API或DNS接口查詢服務的信息,包括IP地址和端口號,以便能夠與其它服務通信。
Filebeat容器則是用來收集Java應用程序的日志文件,并將其發(fā)送到指定的日志服務器進行處理和存儲。
下面是大致的架構圖:
+---------------------+ | 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將收集的日志文件發(fā)送到指定的日志服務器。Consul客戶端容器通過HTTP API將服務注冊信息發(fā)送給Kubernetes集群外的Consul服務器,以便其它服務可以發(fā)現和使用它們。
以下是 Java 應用通過 Consul 客戶端注冊到 Consul 服務端的詳細步驟流程:
- Pod 中的 Consul 客戶端啟動,并向 Consul 集群發(fā)現服務請求。
- Consul 客戶端會向 Consul 服務端的任一節(jié)點發(fā)出注冊請求,告知它所在的服務名稱、IP 地址、端口號、標簽等信息,以及該服務的健康檢查規(guī)則。
- Consul 服務端接收到注冊請求后,會將該服務信息存儲在本地的 KV 存儲中,并將該服務的狀態(tài)標記為“不健康”。
- Consul 客戶端會根據所注冊的健康檢查規(guī)則,定期向 Consul 服務端發(fā)送健康檢查請求,并根據響應結果更新本地的服務狀態(tài)。
- 當該服務的狀態(tài)為“健康”時,Consul 客戶端會將該服務的狀態(tài)信息存儲在本地的緩存中,并向本地的 Java 應用提供服務發(fā)現和負載均衡功能。
- Java 應用通過調用 Consul 客戶端提供的 API,獲取所需服務的 IP 地址和端口號,并通過這些信息與目標服務建立連接。
- 如果需要對該服務進行修改或注銷,Java 應用可以向 Consul 客戶端發(fā)送對應的請求。
- Consul 客戶端接收到請求后,會將請求轉發(fā)給 Consul 服務端,并更新本地的緩存。
- Consul 服務端接收到請求后,會更新該服務在本地 KV 存儲中的信息,并將該服務的狀態(tài)標記為“不健康”。
- Consul 客戶端會根據所注冊的健康檢查規(guī)則,定期向 Consul 服務端發(fā)送健康檢查請求,并根據響應結果更新本地的服務狀態(tài)。
總體架構圖如下:
在該架構中,Consul 客戶端和 Java 應用都運行在 Pod 中,其中 Consul 客戶端負責服務注冊和服務發(fā)現,Java 應用則通過 Consul 客戶端獲取所需服務的信息。同時,Filebeat 用于收集應用的日志數據,并將其發(fā)送至目標日志存儲系統。
SpringBoot注冊Consul
SpringBoot可以通過使用Consul的Java客戶端庫來實現與Consul的集成,該庫提供了豐富的API,包括服務注冊、服務發(fā)現、KV存儲等功能。下面是SpringBoot注冊Consul的大致步驟和原理:
1.引入Consul客戶端庫
在SpringBoot項目的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項目的application.yml文件中配置Consul的連接信息,例如:
server: port: 1000 spring: application: name: heian cloud: consul: enabled: true host: 192.168.102.20 # 注冊中心地址 port: 8500 # 注冊中心地址的端口 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: 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 { @GetMapping public HashMap<String, String> index(){ HashMap<String, String> hashmap = new HashMap<String, String>(); hashmap.put("姓名", "王二"); hashmap.put("年齡", "27"); hashmap.put("工齡", "6"); return hashmap; } }
總結
Spring Boot應用可以通過向Consul注冊自身來實現服務發(fā)現和治理,使得其他服務可以在Consul中發(fā)現并調用它。
文檔:
https://www.cnblogs.com/qingyunye/p/12932493.html
一篇文章了解Consul服務發(fā)現實現原理 | Harries Blog™
到此這篇關于SpringBoot(微服務)注冊分布式Consul的文章就介紹到這了,更多相關SpringBoot注冊分布式Consul內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot啟動流程入口參數創(chuàng)建對象源碼分析
這篇文章主要為大家介紹了SpringBoot啟動流程入口參數研究及創(chuàng)建對象源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04