微服務ETCD服務注冊和發現

1.什么是注冊中心

注冊中心主要有三種角色:

  • 服務提供者(RPC Server):在啟動時,向 Registry 注冊自身服務,并向 Registry 定期發送心跳匯報存活狀態。

  • 服務消費者(RPC Client):在啟動時,向 Registry 訂閱服務,把 Registry 返回的服務節點列表緩存在本地內存中,并與 RPC Sever 建立連接。

  • 服務注冊中心(Registry):用于保存 RPC Server 的注冊信息,當 RPC Server 節點發生變更時,Registry 會同步變更,RPC Client 感知后會刷新本地 內存中緩存的服務節點列表。

2.框架版本

spring boot:2.7.13

spring cloud:2021.0.1

3.xxx-discovery-etcd

支持etcd作為服務的注冊中心,在微服務中使用

3.1.使用

pom.xml中引入依賴

<dependency><groupId>x.xx.xxx</groupId><artifactId>xxx-discovery-etcd</artifactId>
</dependency>

application.yml中配置

spring:application:name: etcd-provider-examplexxx:discovery:etcd:server-addr: http://192.168.184.133:2379instance-name: provider1 ? ? ? ? ? ? ? ?

啟動主類增加注解@EnableDiscoveryClient

4.Spring Cloud和xxx-etcd-discovery的結合

4.1.etcd-provider-demo

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
?<groupId>org.example</groupId><artifactId>etcd-provider-demo</artifactId><version>1.0-SNAPSHOT</version>
?<dependencies><dependency><groupId>x.xx.xxx</groupId><artifactId>xxx-discovery-etcd</artifactId></dependency>
?<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
?<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
?</dependencies>
?
</project>

bootstrap.yml

server:port: 18082
spring:application:name: etcd-provider-example
?
xxx:discovery:etcd:server-addr: http://192.168.184.133:2379instance-name: provider1
?
logging:level:root: DEBUGio:grpc:netty:NettyClientHandler: INFO
?org:springframework:boot:autoconfigure: INFO

EtcdProviderExampleApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
?
@SpringBootApplication
@EnableDiscoveryClient
public class EtcdProviderExampleApplication {
?public static void main(String[] args) {SpringApplication.run(EtcdProviderExampleApplication.class, args);}
}

EchoController

package x.xx.xxx.etcd.demo;
?
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
?
@RestController
public class EchoController {@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)public String echo(@PathVariable String string) {return System.currentTimeMillis() + "--Hello Etcd Discovery " + string;}
}

4.2.etcd-consumer-demo

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
?<groupId>org.example</groupId><artifactId>etcd-consumer-demo</artifactId><version>1.0-SNAPSHOT</version>
?<dependencies><dependency><groupId>x.xx.xxx</groupId><artifactId>xxx-discovery-etcd</artifactId></dependency>
?<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
?<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
?<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>
?</dependencies>
?
</project>

bootstrap.yml

server:port: 18081
?
spring:application:name: etcd-consumer-example
?
xxx:discovery:etcd:server-addr: http://192.168.184.133:2379instance-name: consumer1logging:level:root: DEBUGio:grpc:netty:NettyClientHandler: INFO
?org:springframework:boot:autoconfigure: INFO

EtcdConsumerExampleApplication

package x.xx.xxx.etcd.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.reactive.function.client.WebClient;@SpringBootApplication
@EnableDiscoveryClient
public class EtcdConsumerExampleApplication {public static void main(String[] args) {SpringApplication.run(EtcdConsumerExampleApplication.class, args);}@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}@Bean@LoadBalancedpublic WebClient.Builder loadBalancedWebClientBuilder() {return WebClient.builder();}
}

TestController

package x.xx.xxx.etcd.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.reactive.function.client.WebClient;@RestController
public class TestController {private final RestTemplate restTemplate;@Autowiredpublic TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)public String echo(@PathVariable String str) {return restTemplate.getForObject("http://etcd-provider-example/echo/" + str, String.class);}@Autowiredprivate WebClient.Builder webClientBuilder;@RequestMapping(value = "/echo/webClient/{str}", method = RequestMethod.GET)public String echoWebClient(@PathVariable String str) {WebClient webClient = webClientBuilder.build();webClient.get().uri("http://etcd-provider-example/echo/" + str).retrieve().bodyToMono(String.class).subscribe(response -> {System.err.println("控制臺響應結果:" + response);});return System.currentTimeMillis() + "--echoWebClient--" + str + "--請查看控制臺是否執行成功!";}}

4.3.啟動主程序

EtcdProviderExampleApplication

EtcdConsumerExampleApplication

通過ETCD Manager查看,如下表示注冊成功

請求etcd-consumer-demo中接口,查看服務發現功能,更改測試接口,可查看TestController

http://localhost:18081/echo/6666

瀏覽器返回如下信息表示服務發現成功

1705978409084--Hello Etcd Discovery 6666

5.xxx-etcd-discovery詳解

5.1.可配置屬性

5.2.存儲到etcd的格式

5.3.監控ectd服務端事件,并發送事件

5.4.啟動全量查所有服務列表并緩存

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92765.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡---默認網關(Default Gateway)

一、默認網關的定義 默認網關&#xff08;Default Gateway&#xff09;是一個網絡設備&#xff08;通常是路由器、防火墻或三層交換機&#xff09;的IP地址&#xff0c;它是本地網絡中的設備訪問其他網絡&#xff08;如外網、其他子網&#xff09;時&#xff0c;數據報文的“第…

OpenBMC中libgpio架構與驅動交互全解析:從硬件映射到應用控制

1. libgpio概述與核心定位 libgpio作為OpenBMC中GPIO管理的核心庫&#xff0c;扮演著連接硬件驅動與上層應用的橋梁角色。它通過標準化的接口抽象了不同硬件平臺的GPIO操作細節&#xff0c;使得電源控制、傳感器監控等關鍵功能能夠以統一的方式訪問GPIO資源。 1.1 libgpio在Ope…

開放原子開源生態大會:麒麟信安加入openEuler社區AI聯合工作組,聚焦操作系統開源實踐與行業賦能

7月23日&#xff0c;由開放原子開源基金會主辦的2025開放原子開源生態大會在京開幕&#xff0c;大會以“開源賦能產業&#xff0c;生態共筑未來”為主題。工業和信息化部副部長熊繼軍、北京市人民政府副秘書長許心超出席大會并致辭。作為開放原子開源基金會黃金捐贈人和開源重要…

Lyapunov與SAC算法的數學結構對比:從二次漂移到TD損失

一、李雅普諾夫優化中二次漂移函數的推導 李雅普諾夫優化的核心是通過設計 “李雅普諾夫函數” 和 “漂移項”&#xff0c;保證系統狀態收斂到穩定點。以下以線性時不變系統為例&#xff08;非線性系統推導邏輯類似&#xff0c;僅動力學方程更復雜&#xff09;&#xff0c;推導…

WireShark:非常好用的網絡抓包工具

文章目錄一、寫在前面二、安裝三、使用1、入門使用&#xff08;1&#xff09;打開軟件&#xff08;2&#xff09;右鍵網卡&#xff0c;Start Capture(開始捕獲)2、界面詳細介紹3、過濾器設置一、寫在前面 Wireshark是使用最廣泛的一款「開源抓包軟件」&#xff0c;常用來檢測網…

WEB技術演進史:從C/S到微服務架構

WEB技術 HTTP協議和B/S 結構 操作系統有進程子系統&#xff0c;使用多進程就可以充分利用硬件資源。進程中可以多個線程&#xff0c;每一個線程可以被CPU調度執行&#xff0c;這樣就可以讓程序并行的執行。這樣一臺主機就可以作為一個服務器為多個客戶端提供計算服務。 客戶端…

win11中Qt5.14.0+msvc2019+opencv4.9配置

本文主要研究由msvc編譯的opencv在QT中的配置&#xff0c;opencv可以是官網直接下載的版本&#xff0c;也可以是msvc(例如vs2019)通過cmake編譯 contrib功能的opencv版本&#xff0c;這2種版本對qt版本沒有嚴格要求&#xff0c;但是若在cmake中選擇了with_qt功能&#xff0c;那…

【listlist模擬】

list&list模擬1.list使用2、list模擬附錄1.list使用 list常見接口不做介紹&#xff0c;跟前面vector有相似之處&#xff0c;跟數據結構list基本一樣。 ?因為list使用帶頭的雙向循環鏈表實現的&#xff0c;不能用小標訪問&#xff0c;只能用迭代器或范圍for訪問 list有成…

在CentOS 7上將PostgreSQL數據庫從默認路徑遷移到自定義目錄

在CentOS 7上將PostgreSQL數據庫從默認路徑遷移到自定義目錄&#xff0c;需遵循以下步驟。假設原數據目錄為“/var/lib/pgsql/12/data”&#xff0c;目標目錄為“/new/path/pgdata”。 1、步驟概覽 停止PostgreSQL服務創建新目錄并設置權限復制數據文件&#xff08;保留權限&am…

C語言基礎06——結構體(struct)

一、結構體的概念結構體&#xff08;struct&#xff09;是 C 語言中一種自定義數據類型&#xff0c;它允許你將不同類型的數據項組合在一起&#xff0c;形成一個新的復合數據類型。想象一下&#xff1a;如果要表示一個 "學生"&#xff0c;需要包含姓名&#xff08;字…

小白入門指南:Edge SCDN 輕松上手

在互聯網飛速發展的當下&#xff0c;網站性能與安全至關重要。對于小白而言&#xff0c;Edge SCDN 可能是個陌生概念&#xff0c;但它卻能極大助力網站運營。本文將用簡單易懂的語言&#xff0c;帶大家了解 Edge SCDN&#xff0c;探討其運用方法。?一、Edge SCDN 是什么&#…

探秘酵母單雜交技術:解鎖基因調控的密碼

在生命科學研究領域&#xff0c;基因的表達調控機制一直是科學家們關注的焦點。為了深入探究這一復雜過程&#xff0c;眾多先進技術應運而生&#xff0c;酵母單雜交技術便是其中極具價值的一項&#xff0c;它為研究 DNA 與蛋白質之間的相互作用提供了獨特視角與有效手段。酵母單…

大模型備案要點一次過【附材料清單詳解】

最近&#xff0c;廣東省公布了最新一批的大模型備案&#xff08;登記&#xff09;名單&#xff0c;很多準備要做大模型備案的企業都在紛紛咨詢&#xff1a;“大模型備案的周期是多久&#xff1f;”“做大模型備案有什么要求&#xff1f;”“做大模型備案一共需要準備多少材料&a…

啟保停-----------單相照明燈的接法

一.單相照明燈-K21使用的器材,單相電能表,空開,插座,開關,燈泡二.啟 保 停1.需要用到的器材1.空開2.三相電機3.接觸器4.熔斷器5.按鈕2.電路的作用按按鈕 運轉 在按按鈕 停止運轉3.電動4.加上輔助觸點 控制電路5.在加上按鈕 停止電路

TF-IDF:信息檢索與文本挖掘的統計權重基石

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1. 背景與定義 TF-IDF 是一種統計加權方法&#xff0c;用于衡量詞語在…

[論文閱讀] (41)JISA24 物聯網環境下基于少樣本學習的攻擊流量分類

《娜璋帶你讀論文》系列主要是督促自己閱讀優秀論文及聽取學術講座&#xff0c;并分享給大家&#xff0c;希望您喜歡。由于作者的英文水平和學術能力不高&#xff0c;需要不斷提升&#xff0c;所以還請大家批評指正&#xff0c;非常歡迎大家給我留言評論&#xff0c;學術路上期…

react中父子數據流動和事件互相調用(和vue做比較)

前言&#xff1a;react中父子數據流動和事件互相調用&#xff0c;父組件給子組件數據&#xff0c;父組件調用子組件的事件&#xff0c;同理&#xff0c;子也可以調用父的數據和傳值。react是單向數據流&#xff0c;具體使用跟vue是不同的。1、父組件的數據傳給子組件&#xff0…

杰理手表-增加提示音-提示音音量調整--使用提示音

本章節非常詳細的介紹這個提示音的增加-調整-使用&#xff0c;其余耳機包之類的也是差不多的&#xff01;&#xff01; 目錄 1.添加自己需要用的提示音 2.根據添加的提示音-代碼中配置 1.在tone_player.h中枚舉里添加本次提示音的名稱 2.把定義好的提示音放到tone_player.…

數據庫的基本操作(視圖,存儲,觸發器)

1、視圖&#xff08;1&#xff09;什么是視圖視圖是虛擬表&#xff0c;是基于查詢結果的可視化表&#xff0c;視圖的作用有&#xff1a;①簡化復雜查詢 ②限制數據訪問 ③提供數據獨立性 ④匯總數據&#xff08;2&#xff09;怎么創建視圖創建視圖 CREATE OR REPLACE VIEW 視圖…

Pytest項目_day13(usefixture方法、params、ids)

usefixture 我們還可以使用mark.usefixtures來調用fixture 這樣相比在傳入參數處調用fixture&#xff0c;會更加直接 但是如果我們在一個測試用例中使用了多個usefixtures&#xff0c;那么測試用例會先調用離他最近的那個fixtureparams fixture中還可以帶參數 當我們用request.…