最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot微服務注冊分布式Consul的詳細過程

 更新時間:2023年04月14日 11:03:37   作者:南宮乘風  
這篇文章主要介紹了SpringBoot(微服務)注冊分布式Consul,Spring Boot應用可以通過向Consul注冊自身來實現服務發(fā)現和治理,使得其他服務可以在Consul中發(fā)現并調用它,需要的朋友可以參考下

Consul是什么

Consul是一個基于HTTP的服務發(fā)現工具,用于配置和管理系統(tǒng)和服務之間的依賴關系。它提供了一個簡單的方式來注冊、發(fā)現和配置服務,并包括健康檢查、負載均衡和故障轉移等功能。

Consul是一種分布式系統(tǒng),用于在大型分布式系統(tǒng)中實現服務發(fā)現和配置共享。它使用Raft協(xié)議來實現強一致性,保證了在多個節(jié)點之間進行的數據更新的原子性。

Consul客戶端可以將它們自己的服務信息注冊到Consul服務器。這樣,Consul服務器將自動成為所有服務的服務目錄。此外,Consul還提供了一個健康檢查機制,以確保已注冊的服務仍然可以正常工作。

當一個客戶端想要調用一個服務時,它可以從Consul服務器獲取服務的網絡位置信息。然后,客戶端將使用此信息建立與服務的網絡連接。

Consul通過HTTP API公開其服務發(fā)現和配置共享功能,這使得使用Consul與其他系統(tǒng)相當容易,如Kubernetes等容器編排工具。

總之,Consul的分布式注冊原理是通過服務端和客戶端之間的交互來實現服務發(fā)現和健康檢查??蛻舳藢⒎招畔⒆缘紺onsul服務器,然后從Consul服務器獲取服務信息并建立網絡連接。Consul使用Raft協(xié)議確保強一致性,并提供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中可以包含多個容器,這些容器可以協(xié)同工作,形成一個完整的服務。在這個例子中,一個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ā)送至目標日志存儲系統(tǒng)。

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • application.yaml與bootstrap.yaml的使用

    application.yaml與bootstrap.yaml的使用

    這篇文章主要介紹了application.yaml與bootstrap.yaml的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • SpringBoot整合Security安全框架實現控制權限

    SpringBoot整合Security安全框架實現控制權限

    本文主要介紹了SpringBoot整合Security安全框架實現控制權限,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java?Collection?接口和常用方法綜合詳解

    Java?Collection?接口和常用方法綜合詳解

    Collection派生出三個子接口,Set代表不可重復的無序集合、List代表可重復的有序集合、Queue是java提供的隊列實現,通過它們不斷的擴展出很多的集合類,接下來我們詳細介紹一下
    2021-11-11
  • Springboot2整合knife4j過程解析

    Springboot2整合knife4j過程解析

    這篇文章主要介紹了Springboot2整合knife4j過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • mybatis 如何判斷l(xiāng)ist集合是否包含指定數據

    mybatis 如何判斷l(xiāng)ist集合是否包含指定數據

    這篇文章主要介紹了mybatis 判斷l(xiāng)ist集合是否包含指定數據的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java數據結構學習之二叉樹

    Java數據結構學習之二叉樹

    今天給大家?guī)淼氖顷P于Java數據結構的相關知識,文章圍繞著Java二叉樹展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 如何在maven本地倉庫中添加oracle的jdbc驅動

    如何在maven本地倉庫中添加oracle的jdbc驅動

    文章介紹了在Maven項目中添加Oracle數據庫驅動ojdbc5時遇到的問題以及解決問題的兩種方法,方法一為簡單粗暴,但沒有體現Maven倉庫的作用,需要手動管理jar包,方法二為在Maven本地倉庫中添加Oracle的JDBC驅動,過程較為繁瑣,但配置一次后可以多次使用
    2024-11-11
  • SpringBoot 如何使用RestTemplate來調用接口

    SpringBoot 如何使用RestTemplate來調用接口

    這篇文章主要介紹了SpringBoot 如何使用RestTemplate來調用接口方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于傳遞list類型的參數的問題

    基于傳遞list類型的參數的問題

    這篇文章主要介紹了基于傳遞list類型的參數的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringMVC實現文件上傳下載的全過程

    SpringMVC實現文件上傳下載的全過程

    對于上傳功能,我們在項目中是經常會用到的,比如用戶注冊的時候,上傳用戶頭像,這個時候就會使用到上傳的功能,而對于下載使用場景也很常見,下面這篇文章主要給大家介紹了關于SpringMVC實現文件上傳下載的相關資料,需要的朋友可以參考下
    2022-01-01

最新評論

成安县| 凭祥市| 新丰县| 阿巴嘎旗| 达拉特旗| 芦溪县| 扶绥县| 五家渠市| 泽州县| 井研县| 什邡市| 咸阳市| 宜川县| 景泰县| 五大连池市| 鄂伦春自治旗| 海城市| 体育| 罗源县| 辛集市| 惠安县| 冀州市| 宁化县| 沿河| 民和| 浮山县| 沙田区| 扎鲁特旗| 岳普湖县| 会同县| 莱芜市| 瑞昌市| 怀安县| 祁连县| 如皋市| 宽城| 诸暨市| 壤塘县| 垣曲县| 鲁山县| 鹰潭市|