《從零開始:Spring Cloud Eureka 配置與服務注冊全流程》?

關于Eureka的學習,主要學習如何搭建Eureka,將order-service和product-service都注冊到Eureka。?

1.為什么使用Eureka?

我在實現一個查詢訂單功能時,希望可以根據訂單中productId去獲取對應商品的詳細信息,但是產品服務和訂單服務是分布式的,所以如果要實現根據訂單中的productId去獲取商品的詳細信息,就需要在訂單服務中遠程調用產品服務,如下圖

但是這樣有一個問題,就是遠程調用產品服務時,這里的ip和端口號是寫死的,如果ip地址發生變化,我們就需要修改對應的代碼,而Eureka就是用解決這個問題的。

2.注冊中心?

Eureka是作為一個注冊中心來解決這個問題的,當產品服務發生變更重新啟動時,會先先向Eureka打報告,然后Eureka去記錄服務和對應IP的關系,此時訂單服務如果想遠程調用產品服務,此時產品服務會先去Eureka獲取產品服務的IP,然后再根據從Eureka中獲取的IP去遠程調用產品服務。

2.1 什么是注冊中心?

在Spring Cloud Eureka中,注冊中心是服務發現的核心組件,負責管理微服務的注冊和發現。?

2.2 注冊中心的三種角色?

注冊中心主要有3中角色,分別是服務提供者(Server),服務消費者(Client)和服務注冊中心(Registry)。

服務提供者(Server):一次業務中,被其他微服務調用的服務,也就是給其他微服務提供接口的微服務,如上面提到的產品服務就是服務提供者

服務消費者(Client):一次業務中,調用其他微服務的微服務,也就是調用其他微服務提供的接口的微服務,如上面提到的訂單服務就是服務消費者

服務注冊中心(Registry)?用于保存Server的注冊信息,當Server節點發生更改時,Registry會同步變更。服務與注冊中心使用一定機制通信,如果注冊中心與某服務長時間無法通信,就會注銷該實例。

三者之間的關系和工作內容,可以用兩個概念來解釋。

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

服務發現:?服務消費者1從注冊中心查詢服務提供者的IP地址,并通過該IP地址遠程調用服務提供者的接口。服務發現的一個重要作用就是提供給服務者一個可用的服務列表。

如下圖

2.3 CAP理論

談到注冊中心,就避不開CAP理論,CAP理論是分布式系統設計中最基礎,也是最為關鍵的理論。

?一致性:CAP理論中的一致性,這里指的是強一致性,強一致性的意思是所有節點的對外提供的數據都是一致的。

可用性:保證每個請求都能有響應,響應的數據有可能是舊的數據。

分區容錯性: 當出現網絡分區后后,系統任然能夠對外提供服務。

網絡分區是指在分布式系統中,由于網絡故障,導致分布式系統中部分節點無法進行通信,形成多個獨立的子網絡(即分區)

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

在分布式系統中,由于網絡狀態是不可預測的,我們即使出現網絡分區的情況,我們的系統任然能夠對外提供服務,所以我們一定保證分區容錯性。

正常情況下

網絡出現異常:

而一致性和可用性只能滿足一個。

如果想要保證各個節點數據的強一致性,由于數據的同步更新是有一定時間延遲的,那么此時該節點的服務一定是有一段時間是停止對外提供服務的。?

如果想要保證可用性,由于數據的同步更新是有一定時間延遲的,那么此時一定有一段時間一些節點的數據是來不及更新的,如果此時請求發送到給數據還沒有同步更新的節點,那么得到的響應就是一個舊的數據。?

所以,我們只能實現AP架構或者CP架構

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

AP架構:為了保證分布式系統的可用性,即使該節點數據還沒有關系,依舊會返回一個響應,這個響應中的數據是一個舊的數據。

y3.搭建Eureka Server?

Eureka Server可以是一個單獨的工程,也可以是一個子工程,下面的搭建Eureka Server是以子工程的方式搭建的。

第一步,創建一個子工程

第二步,在eureka-server工程中的pom文件引入eureka-server的依賴

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

第三步,在在eureka-server工程中的pom文件引入項目構建插件

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

第四步,完善啟動類,注意在在啟動類加上@EnableEurekaServer注解

第五步,在配置文件中添加一下配置信息?

# Eureka相關配置
# 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/

第六步,啟動服務

啟動服務后,如果能通過127.0.0.1:10010訪問,說明Eureka搭建成功了,如下圖

4.服務注冊?

將product-service服務注冊到eureka server中

第一步,在product-service的pom文件中引入下面的依賴

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

第二步,完善product-service的配置文件

?添加服務名稱和eureka地址

#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/

第三部,啟動product-service服務,啟動之后,刷新注冊中心界面,會發現注冊中心中注冊了product-service服務

5.服務發現?

接下來我們修改orders-service,在遠程調用時,從eureka-server拉去product-service的服務信息,實現服務發現。

第一步,在orders-service工程的pom文件中引入下面的依賴

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

第二步,完善orders-service的配置文件,添加服務名稱和eureka地址?

添加的eureka地址的配置文件,添加服務名稱根據自己工程的名字自己去添加即可。?

#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/

第三步,實現訂單服務遠程調用產品服務,代碼如下

修改原來的service層代碼?

如果要從Eureka中獲取注冊的服務列表,要用到一個spring中提供的DiscoveryClient,通過getInstances方法來獲取服務列表,getInstances是通過服務的Id來Eureka中獲取對應的服務列表,這里的id其實就是服務的名稱。

由于是一個服務列表,我們要從服務列表中獲取對應的服務,由于我在Eureka中注冊的product-service服務只有一個,所以從服務列表中取第一個服務就行了。

@Slf4j
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectByOrderId(Integer id){OrderInfo orderInfo = orderMapper.selectByOrderId(id);/*String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();*///根據應用名從eureka中獲取對應的服務列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");String uri = instances.get(0).getUri().toString();log.info("遠程調用的uri:{}",uri);String url = uri+"/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}}

第四步,運行訂單服務,啟動orders-service服務,此時刷新Eureka頁面,發現Eureka中也成功注冊orders-service服務

遠程調用product-service也成功了

注意:校驗時,eureka-server,product-service和order-service都要啟動?

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

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

相關文章

鴻蒙開發進階:深入解析ArkTS語言特性與高性能編程實踐

一、前言 在鴻蒙生態蓬勃發展的當下&#xff0c;開發者對于高效、優質的應用開發語言需求愈發迫切。ArkTS 作為鴻蒙應用開發的核心語言&#xff0c;在繼承 TypeScript 優勢的基礎上&#xff0c;進行了諸多優化與擴展&#xff0c;為開發者帶來了全新的編程體驗。本文將深入剖析…

ARM-Linux 完全入門

1.準備部分 1.1 虛擬機安裝 準備VMware軟件、ubuntu系統鏡像安裝過程 VMware安裝 破解&#xff08;自己百度破解碼&#xff0c;多試幾個網址&#xff0c;會有能用的&#xff09;Ubuntu安裝 配置聯網 橋接 虛擬機Ubuntu系統必須能連接到外網&#xff0c;不然不能更新軟件安裝…

深度學習驅動下的目標檢測技術:原理、算法與應用創新(三)

五、基于深度學習的目標檢測代碼實現 5.1 開發環境搭建 開發基于深度學習的目標檢測項目&#xff0c;首先需要搭建合適的開發環境&#xff0c;確保所需的工具和庫能夠正常運行。以下將詳細介紹 Python、PyTorch 等關鍵開發工具和庫的安裝與配置過程。 Python 是一種廣泛應用于…

致敬經典 << KR C >> 之打印輸入單詞水平直方圖和以每行一個單詞打印輸入 (練習1-12和練習1-13)

1. 前言 不知道有多少同學正在自學C/C, 無論你是一個在校學生, 還是已經是上班族. 如果你想從事或即將從事軟件開發這個行業, C/C都是一個幾乎必須要接觸的系統級程序開發語言. 雖然現在有Rust更安全的系統級編程語言作為C/C的替代, 但作為入門, C應該還是要好好學的. C最早由B…

【Leetcode 每日一題】3355. 零數組變換 I

問題背景 給定一個長度為 n n n 的整數數組 n u m s nums nums 和一個二維數組 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li?,ri?]。 對于每個查詢 q u e r i e s [ i ] queries[i] quer…

[java八股文][Java虛擬機面試篇]垃圾回收

什么是Java里的垃圾回收&#xff1f;如何觸發垃圾回收&#xff1f; 垃圾回收&#xff08;Garbage Collection, GC&#xff09;是自動管理內存的一種機制&#xff0c;它負責自動釋放不再被程序引用的對象所占用的內存&#xff0c;這種機制減少了內存泄漏和內存管理錯誤的可能性…

ubuntu服務器版啟動卡在start job is running for wait for...to be Configured

目錄 前言 一、原因分析 二、解決方法 總結 前言 當 Ubuntu 服務器啟動時&#xff0c;系統會顯示類似 “start job is running for wait for Network to be Configured” 或 “start job is running for wait for Plymouth Boot Screen Service” 等提示信息&#xff0c;并且…

Android 手寫簽名功能詳解:從原理到實踐

Android 手寫簽名功能詳解 1. 引言2. 手寫簽名核心實現&#xff1a;SignatureView 類3. 交互層實現&#xff1a;MainActivity 類4. 布局與配置5. 性能優化與擴展方向 1. 引言 在電子政務、金融服務等移動應用場景中&#xff0c;手寫簽名功能已成為提升用戶體驗與業務合規性的關…

【nRF9160 常用prj.conf配置與AT指令介紹】

參考資料&#xff1a; 技術討論&#xff1a;Q群&#xff1a;542294007 nRF91 NCS SDK安裝工具與SDK安裝包等常用軟件下載地址 云盤下載&#xff1a;pan.olib.cn 一、nRF9160 常用prj.conf配置介紹 nRF9160通過prj.conf配置網絡模式為&#xff1a;CAT-M模式 CONFIG_LTE_NETWOR…

小型化邊緣計算設備

以下是關于小型化邊緣計算設備的核心技術與應用特點的綜合分析&#xff1a; 一、核心硬件平臺與算力表現? NVIDIA Jetson Orin系列? Jetson Orin Nano?&#xff1a;配備1024個CUDA核心和32個Tensor核心&#xff0c;支持高達100 TOPS的AI算力&#xff0c;適用于機器人、無…

css使用clip-path屬性切割顯示可見內容

1. 需求 想要實現一個漸變的箭頭Dom&#xff0c;不想使用svg、canvas去畫&#xff0c;可以考慮使用css的clip-path屬性切割顯示內容。 2. 實現 <div class"arrow">箭頭 </div>.arrow{width: 200px;height: 60px;background-image: linear-gradient(45…

Kotlin與物聯網(IoT):Android Things開發探索

在物聯網&#xff08;IoT&#xff09;領域&#xff0c;Kotlin 憑借其簡潔性、安全性和與 Java 生態的無縫兼容性&#xff0c;逐漸成為 Android Things 開發的有力工具。盡管 Google 已于 2022 年宣布停止對 Android Things 的官方支持&#xff0c;但其技術思想仍值得探索&#…

2025年AI搜索引擎發展洞察:技術革新與市場變革

引言&#xff1a;AI搜索的崛起與市場格局重塑 2024-2025年&#xff0c;AI搜索市場迎來了前所未有的變革期。隨著DeepSeek-R1等先進大語言模型的推出&#xff0c;傳統搜索引擎、AI原生搜索平臺以及各類內容平臺紛紛加速智能化轉型&#xff0c;推動搜索技術從基礎信息檢索向深度…

基于 ESP32 與 AWS 全托管服務的 IoT 架構:MQTT + WebSocket 實現設備-云-APP 高效互聯

目錄 一、總體架構圖 二、設備端(ESP32)低功耗設計(適配 AWS IoT) 1.MQTT 設置(ESP32 連接 AWS IoT Core) 2.低功耗策略總結(ESP32) 三、云端架構(基于 AWS Serverless + IoT Core) 1.AWS IoT Core 接入 2.云端 → APP:WebSocket 推送方案 流程: 3.數據存…

【LeetCode 熱題 100】有效的括號 / 最小棧 / 字符串解碼 / 柱狀圖中最大的矩形

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;LeetCode 熱題 100 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 棧有效的括號最小棧字符串解碼每日溫度柱狀圖中最大的矩形 堆數組中的第K個最大元素 棧 有效的括號 有效的括號 cl…

Petalinux

Petalinux 命令 參考《UG 1157 PetaLinux Command Line Reference Guide》 //創建petalinux工程 petalinux-create -t project --template zynq -n <name> //配置工程 cd 上一步的工程 petalinux-config --get-hw-description ../xsa_folder///配置Linux內核 petalinux-…

【Qt】在OrinNX上,使用命令安裝qtmultimedia5-dev時報錯

1、問題描述 在OrinNX+Ubuntu20.04上,使用命令安裝qtmultimedia5-dev時報錯 sudo apt install qtmultimedia5-devThe following packages have unmet dependencies: qtmultimedia5-dev : Depends: libpulse-dev but it is not going to be installed E: Unable to correct p…

上肢康復機器人設計與臨床應用研究

引言 腦卒中、脊髓損傷等神經系統疾病導致的上肢運動功能障礙&#xff0c;嚴重影響了患者的生活質量。傳統康復治療依賴治療師手動輔助訓練&#xff0c;存在效率低、量化難、人力成本高等問題。上肢康復機器人通過精準的運動控制與生物反饋機制&#xff0c;為實現高效、標準化…

mysql不能聚合之數據清洗逗號

有時候因為數據庫不嚴謹導致了出現有些數字很奇怪例如這樣是varchar類型的字符串&#xff0c; 這種數據不能用來運算聚合&#xff0c;那么要怎么辦呢&#xff1f; 這樣就搞定 REPLACE(your_column, ,, )??&#xff1a;將字段中的逗號移除&#xff0c;例如將3,553,850.28轉換…

chrome 瀏覽器插件 myTools, 日常小工具。

1. 起因&#xff0c; 目的: 比如&#xff0c;chatgpt, google&#xff0c; 打開網頁&#xff0c;就能直接輸入文字&#xff0c;然后 grok 就不行&#xff0c;必須用鼠標點一下&#xff0c;才能輸入文字。 對我而言&#xff0c;是個痛點&#xff01;寫個插件&#xff0c;自動點…