欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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中validator數據校驗功能的實現

    springboot中validator數據校驗功能的實現

    這篇文章主要介紹了springboot中validator數據校驗功能,校驗分為普通校驗和分組校驗,每種校驗方式通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • Java消息隊列Kafka的簡單概述

    Java消息隊列Kafka的簡單概述

    這篇文章主要介紹了Java消息隊列Kafka的簡單概述,消息系統負責將數據從一個應用程序傳輸到另一個應用程序,應用程序可以專注于數據,不擔心如何共享它,需要的朋友可以參考下
    2023-07-07
  • SpringBoot啟動流程入口參數創(chuàng)建對象源碼分析

    SpringBoot啟動流程入口參數創(chuàng)建對象源碼分析

    這篇文章主要為大家介紹了SpringBoot啟動流程入口參數研究及創(chuàng)建對象源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • springboot實現分段上傳功能的示例代碼

    springboot實現分段上傳功能的示例代碼

    這篇文章主要介紹了springboot實現分段上傳,包括文件上傳下載,斷點續(xù)傳,增量上傳功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 在java List中進行模糊查詢的實現方法

    在java List中進行模糊查詢的實現方法

    下面小編就為大家?guī)硪黄趈ava List中進行模糊查詢的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java流程控制語句最全匯總(中篇)

    Java流程控制語句最全匯總(中篇)

    這篇文章主要介紹了Java流程控制語句最全匯總(中篇),本文章內容詳細,通過案例可以更好的理解數組的相關知識,本模塊分為了三部分,本次為中篇,需要的朋友可以參考下
    2023-01-01
  • Spring Security 表單登錄功能的實現方法

    Spring Security 表單登錄功能的實現方法

    這篇文章主要介紹了Spring Security 表單登錄,本文將構建在之前簡單的 Spring MVC示例 之上,因為這是設置Web應用程序和登錄機制的必不可少的。需要的朋友可以參考下
    2019-06-06
  • Spring IOC源碼之bean的注冊過程講解

    Spring IOC源碼之bean的注冊過程講解

    這篇文章主要介紹了Spring IOC源碼之bean的注冊過程講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • spring+mybatis實現圖書管理系統

    spring+mybatis實現圖書管理系統

    這篇文章主要為大家詳細介紹了spring+mybatis實現圖書管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Jmeter訪問需要登錄的接口如何處理問題

    Jmeter訪問需要登錄的接口如何處理問題

    這篇文章主要介紹了Jmeter訪問需要登錄的接口如何處理問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論