Eureka-服務注冊,服務發現

在遠程調用的時候,我們寫的url是寫死的。

String url = "<http://127.0.0.1:9090/product/>"+ orderInfo.getProductId();

當換個機器,或者新增個機器,導致ip變換,從而使得 url 發生了變化,接著就需要去通知所有的相關業務也跟著去改變,這就導致后期非常麻煩。

解決思路:

使用注冊中心

什么是注冊中心

注冊中心是分布式系統/微服務架構中的核心基礎設施,它扮演著服務治理的"電話簿"角色,他能維護一個服務列表,哪個機器上線了,哪個機器宕機了,這些信息都會自動更新到服務列表上,客戶端拿到這個列表,直接進行服務調用即可。這個就是注冊中心。 注冊中心主要有三個角色:

  • **服務提供者(Server):**一次業務中,被其他微服務調用的服務,也就是提供接口給其他微服務。
  • **服務消費者(Client):**一次業務中,調用其他微服務的服務,也就是調用其他微服務提供的接口。
  • **服務注冊中心(Register):**用于保存Server的注冊信息,當Server節點發生變更時,Register會同步變更。服務和注冊中心使用一定的通信機制,如果注冊中心與某服務長時間無法通信,就會注銷該實例。

注:服務提供者和服務消費者是相對的。

他們之間的關系及工作內容,可以通過兩個概念來描述:

  • **服務注冊:**服務提供者在啟動時,向Register注冊自身服務,并向Register定期發送心跳匯報存活狀態。
  • **服務發現:**服務消費者從注冊中心查詢服務提供者的地址,并通過該地址調用服務提供者的接口,服務發現的一個重要作用就是提供給消費者一個可用的服務列表。

CAP理論:分布式系統的基石

CAP 理論是分布式系統設計的核心定理,由計算機科學家 Eric Brewer 于 2000 年提出,揭示了分布式系統必然面臨的三元悖論。其核心內容可概括為:

任何分布式系統最多只能同時滿足以下三項中的兩項:

Consistency(一致性)

Availability(可用性)

Partition tolerance(分區容錯性)

注:一致性分為強一致性(主庫和從庫,不論何時,對外提供的服務都是一致的)和弱一致性(隨著時間的推移,最終達到了一致性),這里指的是強一致性。

比如說我有一個數據庫集群,客戶端向數據庫集群發送了一個數據修改的請求,數據庫集群需要向客戶端進行響應,響應的時機分為以下兩種:

  1. 主庫接收到請求,并處理成功,此時數據庫還未完全同步到從庫,隨著時間的推移,主庫和從庫的數據,最終會達到一個一致性。
  2. 主庫接收到請求,并且所有數據庫同步成功時,才返回響應。

CAP三要素:

要素含義典型場景
C:一致性(Consistency)所有節點在同一時刻看到的數據完全相同(強一致性)銀行轉賬系統:A 轉 B 100元后,所有節點必須立即看到更新
A:可用性(Availability)每個請求都能獲得非錯誤響應(系統始終可操作)電商網站:雙十一高峰期間必須保證用戶能正常下單
P:分區容錯性(Partition Tolerance)網絡分區發生時系統仍能繼續運行(容忍網絡故障)跨數據中心部署:當機房之間網絡中斷時,系統仍能提供服務

CAP理論告訴我們:一個分布式系統不可能同時滿足數據一致性,服務可用性和分區容錯性這是三個基本需求,最多只能同時滿足其中的兩個。

在分布式系統中,系統間的網絡不能100%保證健康,服務又必須對外保證服務,因此PartitionTolerance不可避免,那就只能在C和A中選擇一個,也就是CP或者AP架構。

正常情況:

異常情況:

CP架構:為了保證分布式系統對外的數據一致性,于是選擇不返回任何數據。

AP架構:為了保證分布式系統的可用性,節點2返回V0版本的數據(即使這個數據不正確)

更多參考:一文看懂|分布式系統之CAP理論-騰訊云開發者社區-騰訊云

常見的注冊中心有:

  • Zookeeper(CP)
  • nacos(CP或AP,默認是AP)
  • eureka(AP)

Eureka介紹

Eureka是Netflix OSS套件中關于服務注冊和發現的解決?案. Spring Cloud對Eureka進?了集成, 并

作為優先推薦?案進?宣傳, 雖然?前Eureka 2.0已經停?維護, 新的微服務架構設計中, 也不再建議使

?, 但是?前依然有?量公司的微服務系統使?Eureka作為注冊中?。

官方文檔:https://github.com/Netflix/eureka/wiki

Eureka主要分為兩個部分:

  • Eureka Server:作為注冊中心Server端,向微服務應用程序提供服務注冊,發現健康檢查等能力。
  • Eureka Client:服務提供者,服務啟動時,會向Eureka Server 注冊自己的信息(IP,端口,服務信息等),Eureka Server會存儲這些信息。

搭建注冊中心

1.創建項目

2.pom加入Eureka的環境

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

項目構建插件

		<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

3.配置文件,增加Eureka相關的配置

server:port: 10010
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表示是否從Eureka Server獲取注冊信息,默認為true.因為這是一個單點的Eureka Server,不需要同步其他的Eureka Server節點的數據,這里設置為falseregister-with-eureka: false # 表示是否將自己注冊到Eureka Server,默認為true.由于當前應用就是Eureka Server,故而設置為false.service-url:# 設置Eureka Server的地址,查詢服務和注冊服務都需要依賴這個地址defaultZone: <http://$>{eureka.instance.hostname}:${server.port}/eureka/
logging:pattern:console: '%d{MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

4.啟動類,開啟Eureka的功能

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}
}

5.啟動測試

啟動服務,訪問注冊中心:http://127.0.0.1:10010/

可以看到能正常訪問注冊中心了。

服務注冊

我們的需求是訂單查詢訂單信息的時候,根據訂單里的產品ID,獲取產品的詳細信息,也就是需要order-service遠程調用product-service,也就是說product-service是服務提供者,就需要把product-sevrice服務注冊到注冊中心里去。

1.加入Eureka的依賴

				<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2.完善配置信息

#服務名稱
spring:application:name: product-service#eureka地址
eureka:client:service-url:defaultZone: <http://127.0.0.1:10010/eureka/>
#日志
logging:pattern:console: '%d{MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

3.啟動測試

可以看到product-service已經成功注冊到eureka-service上了。

服務發現

order-service是服務消費者,在遠程調用時候,會從eureka-server拉取product-service的服務信息,實現服務發現。

1.加入Eureka依賴

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2.完善配置信息


spring:application:name: order-serviceeureka:client:service-url:defaultZone: <http://127.0.0.1:10010/eureka/>
logging:pattern:console: '%d{MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

3.修改遠程調用的代碼

		public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//String url = "<http://127.0.0.1:9090/product/>" + orderInfo.getProductId();//從Eureka中獲取服務列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");//http://127.0.0.1:9090//instances.get(0):服務可能有多個,這里只獲取第一個String uri = instances.get(0).getUri().toString();String url = uri + "/product/" + orderInfo.getProductId();log.info("遠程調用url:{}",url);ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}

4.啟動測試

可以看到order-service已經注冊到eureka上了。

訪問接口:http://127.0.0.1:8080/order/1

也可以看到,遠程調用成功了。

Eureka 和Zookeeper區別(不發)

Eureka和Zookeeper都是?于服務注冊和發現的?具,區別如下:

  1. Eureka是Netflix開源的項?, ?Zookeeper是Apache開源的項?.
  2. Eureka 基于AP原則, 保證?可?, Zookeeper基于CP原則, 保證數據?致性.
  3. Eureka 每個節點 都是均等的, Zookeeper的節點區分Leader 和Follower 或 Observer, 也正因為這 個原因, 如果Zookeeper的Leader發?故障時, 需要重新選舉, 選舉過程集群會有短暫時間的不可?.

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

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

相關文章

ubuntu24的一些小問題

截圖Keyboard -> Keyboard Shortcus -> View and customize Shortcus如上&#xff0c;可以修改默認的快捷按鍵。比如截圖按鍵可以修改。 ibus輸入法無法&#xff0c;輸入V異常問題 也是困擾了很久&#xff0c;發現是這樣的&#xff1a;https://github.com/libpinyin/ibus…

Python Locust庫詳解:從入門到分布式壓力測試實戰

一、Locust核心優勢 作為一款基于Python的開源負載測試工具&#xff0c;Locust通過協程架構實現了高效資源利用。其獨特優勢體現在&#xff1a; 純Python腳本&#xff1a;用熟悉的語言定義用戶行為&#xff0c;支持條件判斷和復雜邏輯分布式擴展&#xff1a;單節點支持數千并發…

Redis數據類型與內部編碼

在Redis中通常普遍認為&#xff0c;使用redis的能進行查詢&#xff0c;插入&#xff0c;刪除&#xff0c;修改操作都是O(1)是因為他是利用hash表實現的&#xff0c;但是&#xff0c;背后的實現不一定是一個標準的hash表&#xff0c;它內部的數據類型還會有變數&#xff0c;不過…

03-netty基礎-多路復用select、poll、epoll

1 什么是多路復用多路復用&#xff08;Multiplexing&#xff09; 是一種讓單個線程同時處理多個 I/O 通道的技術&#xff0c;核心是通過系統調用將 I/O 狀態查詢的工作交給操作系統內核&#xff0c;應用程序只需等待內核通知哪些通道就緒。多路&#xff1a;指的是多個socket網絡…

網易大模型算法面經總結第一篇

網友一 MHA的原理&#xff0c;是如何進行加速的&#xff0c;用的什么框架推理。 回答&#xff1a; ①先答一下什么是MHA&#xff1a;Multi-Head Attention&#xff08;MHA&#xff09;是 Transformer 的核心機制&#xff0c;并行地關注輸入序列中不同位置的多種信息 ②回答MHA的…

Vue3 面試題及詳細答案120道(91-105 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

SAP-MM-物料進銷存表

ABAP庫存進銷存報表程序摘要 該ABAP程序是一個完整的庫存進銷存報表系統,主要功能包括: 報表類型選擇: 物料庫存進銷存 批次庫存進銷存 寄售庫存進銷存 供應商庫存進銷存 原料庫存進銷存 主要功能: 從歷史數據表(MARDH, MSKAH, MSLBH, MCHBH等)獲取期初庫存 處理物料移動數…

這幾天都是發癲寫的

#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> #include <cmath> // for sqrt// Gen-Sort 實現&#xff08;保持不變&#xff09; void genSort(std::vector<int>& arr) {if (arr.empty()) r…

QT6 源,七章對話框與多窗體(11) 進度對話框 QProgressDialog:屬性,公共成員函數,槽函數,信號函數,與源代碼帶注釋

&#xff08;1&#xff09; 本類的繼承關系 &#xff1a;可見&#xff0c;進度對話框&#xff0c;也是 QDialog 的子類&#xff0c;在其上面又擺放了一些控件&#xff0c;構成了不同用途的對話框。咱們也可以自定義對話框。只是沒有 QT 官方大師們做的好。 人家在定義這 6 個子…

學習游戲制作記錄(技能系統)7.24

1.技能系統概念首先讓我們了解一下游戲的技能本質是什么&#xff0c;以投擲劍為例子&#xff0c;當玩家使用這個技能時&#xff0c;首先會播放玩家的動畫&#xff0c;隨后通過技能腳本創建一個劍的對象&#xff0c;當劍回收時會再次調用腳本&#xff0c;讓它朝向玩家飛來并銷毀…

外部存檔(External Archive)機制

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

MybatisPlus操作方法詳細總結

摘要&#xff1a;本文圍繞 MyBatis-Plus 數據操作展開&#xff0c;涵蓋標準數據層 CRUD 與分頁查詢&#xff1b;以及各種的復雜 SQL 查詢&#xff1b;映射匹配&#xff08;TableField、TableName 注解&#xff09;與 ID 生成策略&#xff08;TableId 五種類型及全局配置&#x…

【C語言進階】動態內存管理的面試題||練習

本節內容專門整理了一些動態內存管理的面試題&#xff0c;配有詳細的解答。 目錄 1. 看代碼說結果 2. 看代碼說結果 3. 看代碼說結果 4.小樂樂與歐幾里得 描述 分析1&#xff1a; 分析2&#xff1a; 代碼&#xff1a; 5. 空心正方形 分析&#xff1a; 1. 看代碼說結…

【圖論】倍增與lca

void dfs(long u,long father){ dep[u]dep[father]1;//只在這里初始化depfor(long i1;(1<<i)<dep[u];i)fa[u][i]fa[fa[u][i-1]][i-1];//只這里用的倍增for(long ihead[u];~i;iedge[i].next){long vedge[i].to;if(vfather)continue;fa[v][0]u;dfs(v,u); }} long lca(lo…

VS Code 美化插件

目錄1. Better Comments 更好的注釋2. indent-rainbow 彩虹的縮進3. Trailing Spaces 尾隨的空格4. Gruvbox Material 護眼的材質5. Md Editor 博客編輯器6. 待補充推薦筆記&#xff1a;VS Code寫代碼必備的五款代碼美化插件 1. Better Comments 更好的注釋 Better Comments Be…

火語言 RPA 在日常運維中的實踐

在系統運維和技術支持工作中&#xff0c;總有一些操作像 “固定程序” 一樣循環往復&#xff1a;定期檢查服務器狀態、批量處理用戶權限申請、手動清理系統日志…… 這些工作步驟固定、邏輯簡單&#xff0c;卻占用了大量本可用于故障排查和系統優化的時間。近期在優化運維團隊的…

FOUPK3system5XOS系統 NTX V2.0發布通知

FOUPK3system5XOS系統NTX V2.0發布通知更新1.系統安全&#xff1a;使用FOUPK3system5XOS NOS X9新內核與FOUPK3system5XOS系統19.63正式版一樣提供更好的安全性2.原生應用&#xff1a;啟用FOUPK3system5XOS ONS X9 API 72服務FOUPK3system5XOS系統 NTX V2.0用戶支持使用FOUPK3…

爬蟲算法原理解析

文章目錄 核心算法原理 1. 圖遍歷算法 廣度優先搜索(BFS) 深度優先搜索(DFS) 2. URL調度算法 優先級隊列調度 3. 頁面去重算法 基于哈希的去重 基于布隆過濾器的去重 4. 鏈接提取與規范化 5. 抓取頻率控制算法 6. 增量爬取算法 高級算法策略 1. PageRank算法在爬蟲中的應用 2. …

探索雙鏈表:C語言中的鏈式結構魔法

目錄 引言 一、雙鏈表基礎 1.1、什么是雙鏈表&#xff1f; 1.2、雙鏈表節點的結構定義 二、雙鏈表的基本操作 2.1、雙鏈表的初始化 2.2、尾插法 2.3、頭插 2.4、判斷雙鏈表是否為空 2.5、尾刪法 2.6、頭刪法 2.7、查找 2.8、雙鏈表在指定位置之前插入 2.9、雙鏈表…

HTML5 + CSS3模擬西門慶、武大郎和潘金蓮的精彩520微信聊天,看完我又相信愛情了

今天520了&#xff0c;我用HTML5 CSS3模擬了西門慶、武大郎和潘金蓮的精彩微信聊天&#xff0c;希望你看完以后可以在緊張的工作中&#xff0c;放松一下&#xff0c;開心一下&#xff0c;同時祝你在這個520可以過得開心快樂。 目錄 1 實現思路 1.1 聊天實現素材 1.2 HTML布…