SpringCloud組件—Eureka

一.背景

1.問題提出

我們在一個父項目下寫了兩個子項目,需要兩個子項目之間相互調用。我們可以發送HTTP請求來獲取我們想要的資源,具體實現的方法有很多,可以用HttpURLConnectionHttpClientOkhttpRestTemplate等。

舉個例子,我們想要通過訂單表中的商品Id來查詢商品的詳細信息,我們需要向商品所在的模塊發送HTTP請求,通過請求獲取商品的詳細信息:

@Resource
RestTemplate restTemplate;@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);String url="http://127.0.0.1:9090/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;
}

上面的實現有一個問題:如果機器發生變故,url會跟著變更。url變來變去,我們寫的代碼就要進行修改,因此我們要想辦法解決這個問題。

2.解決思路

注冊中心可以解決這個問題。

服務啟動或變更的時候,向注冊中心報道,注冊中心就存儲著應用和IP的關系。

當我們想要調用方法的時候,只需要向注冊中心去獲取服務方的IP就行了。

那什么是注冊中心?

注冊中心(Service Registry)?是分布式系統(尤其是微服務架構)中的核心組件,主要用于解決服務實例的?自動發現、動態管理和路由調度?問題。它就像一個 “電話簿”,記錄著所有服務實例的網絡地址(IP、端口等信息),并實時更新這些信息,確保服務之間可以快速、可靠地通信。

注冊中心有三種角色:服務提供者(Server)服務消費者(Client)服務注冊中心(Registry)

它們之間的關系可以通過兩個概念來描述:

服務注冊服務提供者在啟動的時候向服務注冊中心(Registry)注冊自身服務,并向服務注冊中心(Registry)定期發送心跳匯報存好情況。

服務發現服務消費者注冊中心查詢服務提供者的地址,并通過該地址調用服務提供者的接口。

3.CAP理論

Consistency,一致性:這里的一致性指的是強一致性,所有結點在同一時間具有相同的數據;

Availability,可用性:保證每個請求都有響應;

Partition Tolerance,分區容錯性:分布式系統中的節點之間出現網絡分區(即部分節點無法通信)時,系統仍能繼續運行。

這個CAP是一個“不可能三角”,即這三個要求不能同時實現,要想實現CA就不能實現P,要實現AP就不能實現C。

在微服務系統中,P這一點是必須保證的,所有A和C只能實現一個。

二.Eureka

Eureka(尤里卡)曾是SpringCloud官方默認的注冊中心,其符合CAP理論中的AP,即保證分布式系統的可用性。

1.搭建服務中心

1)創建項目;

2)pom加入Eureka的依賴:

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

3)配置文件,加入相關配置:

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的功能:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}
}

此時我們啟動項目,在瀏覽器上輸入:127.0.0.1:10010,如果出現以下頁面說明成功了:

2.服務注冊

1)加入Eureka依賴:

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

2)修改配置信息:

配置服務的名稱和eureka地址

spring:application:name: product-service
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka

3)啟動程序

啟動程序后出現下面的界面說明注冊成功了:

注意紅線圈出的部分,這個Application的名字與剛剛配置的名字是一樣的:product-service。

3.服務發現

1)加入Eureka依賴:

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

2)修改配置信息:

spring:application:name: order-service
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka

3)修改遠程調用的代碼

修改本篇文章一開始提出的問題代碼:

@Resource
RestTemplate restTemplate;@Resource
DiscoveryClient discoveryClient;@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);//從eureka中獲取服務列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");//寫法一:EurekaServiceInstance instance=(EurekaServiceInstance)instances.get(0);String url=instance.getUri()+"/product/"+orderInfo.getProductId();//寫法二://String uri = instances.get(0).getUri().toString();//String url=uri+"/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;
}

兩種寫法都可以。?

4)啟動程序

如果出現下面界面就說明成功了:

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

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

相關文章

無需花錢購買域名服務器!使用 VuePress + Github 30分鐘搭建屬于自己的博客網站(保姆級教程)

前言 GitHub Pages 提供免費全球加速的服務器資源&#xff0c;VuePress 將 Markdown 變成藝術品級的網頁&#xff0c;僅需 30 分鐘&#xff0c;你便可以像提交代碼一樣發布文章&#xff0c;過程完全免費。 博客搭建好的效果如下&#xff1a;https://honorsong.github.io/exam…

提交到Gitee倉庫

文章目錄 注冊配置公鑰創建空白的碼云倉庫把本地項目上傳到碼云對應的空白倉庫中 注冊 注冊并激活碼云賬號&#xff08; 注冊頁面地址&#xff1a;https://gitee.com/signup &#xff09; 可以在自己C盤/用戶/用戶名/.ssh 可以看到 有id_rsa.pub 以前在GitHub注冊時搞過&…

如何在 Java 中從 PDF 文件中刪除頁面(教程)

由于 PDF 文件格式不是 Java 原生支持的&#xff0c;因此要從 PDF 中刪除頁面&#xff0c;你需要使用外部庫。 本教程介紹如何使用 JPedal 來實現這一功能。 開始使用 ? 將 JPedal 添加到你的類路徑或模塊路徑中&#xff08;可從官網下載安裝試用版 JAR 文件&#xff09; ?…

機器學習第二篇 多變量線性回歸

數據集&#xff1a;世界幸福指數數據集中的變量有幸福指數排名、國家/地區、幸福指數得分、人均國內生產總值、健康預期壽命、自由權、社會支持、慷慨程度、清廉指數。我們選擇GDP per Capita和Freedom&#xff0c;來預測幸福指數得分。 文件一&#xff1a;linear&#xff0c;…

位運算,狀態壓縮dp(算法競賽進階指南學習筆記)

目錄 移位運算一些位運算的操作最短 Hamilton 路徑&#xff08;狀態壓縮dp模板&#xff0c;位運算&#xff09; 0x是十六進制常數的開頭&#xff1b;本身是聲明進制&#xff0c;后面是對應具體的數&#xff1b; 數組初始化最大值時用0x3f賦值&#xff1b; 移位運算 左移 把二…

Java高頻面試之并發編程-05

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天來報道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面試官&#xff1a;線程有哪些調度方法&#xff1f; 在Java中&#xff0c;線程的調用方法主要包括以下幾種方式&#xff0c;每種方式適用于…

進程的同步和互斥

進程同步&#xff08;synchronous&#xff09; ?通俗理解&#xff1a; 就像在排隊買飯&#xff0c;一個一個來&#xff0c;前面的人不走&#xff0c;后面的人就不能干事。 進程同步就是&#xff1a;多個進程之間需要協調&#xff0c;有先后順序&#xff0c;一個進程要等另一…

PDF處理控件Aspose.PDF指南:使用 Python 將 EPUB 轉換為 PDF

EPUB是一種流行的電子書格式&#xff0c;用于可重排內容&#xff0c;而PDF則廣泛用于固定版式文檔&#xff0c;非常適合共享和打印。如果您想使用 Python 將 EPUB 轉換為 PDF&#xff0c;Aspose.PDF for Python 提供了一個簡單可靠的解決方案。在本教程中&#xff0c;我們將向您…

day4-小白學習JAVA---開發軟件_Scanner鍵盤錄入_Random隨機數_流程控制語句

開發軟件_Scanner鍵盤錄入_Random隨機數_流程控制語句 一、開發軟件idea&#xff08;MAC版&#xff09;1、軟件安裝-安裝社區版2、中英文設置3、保存時格式化配置4、注釋和代碼對不齊5、idea快捷鍵 二、鍵盤錄入--Scanner1、next和nextInt2、next和nextLine區別 三、Random隨機…

MySQL基本查詢與數據操作全面解析

目錄 1. CRUD操作概述 2. Create操作詳解 2.1 表的創建 2.2 單行數據插入 2.3 多行數據插入 2.4 插入沖突處理 3. Retrieve操作詳解 3.1 基礎查詢 全列查詢&#xff08;慎用&#xff09; 指定列查詢 表達式查詢 結果去重 3.2 條件查詢&#xff08;WHERE子句&#…

01.Python代碼Pandas是什么?pandas的簡介

01.Python代碼Pandas是什么&#xff1f;pandas的簡介 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是pandas的使用語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性&#xff0c;希望對您有用~ pyth…

(8)ECMAScript語法詳解

本系列教程目錄&#xff1a;Vue3Element Plus全套學習筆記-目錄大綱 文章目錄 第2章 ECMAScript2.1 ECMAScript 的發展歷史2.2 什么是ES62.3 ES6語法新特性2.3.1 變量聲明let2.3.2 常量聲明2.3.3 模板字符串2.3.4 函數默認參數2.3.5 箭頭函數2.3.6 對象初始化簡寫2.3.7 解構2.3…

Android JNI開發中頭文件引入的常見問題與解決方案?,提示:file not found

Android JNI開發中頭文件引入的常見問題與解決方案 問題場景&#xff08;新手易犯錯誤&#xff09; 假設你在開發一個JNI項目&#xff0c;想要實現一個線程安全的隊列&#xff08;SafeQueue&#xff09;&#xff0c;于是直接在cpp目錄下創建了safe_queue.h文件&#xff0c;并開…

C++靜態與動態聯編區別解析

在 C++ 中,靜態聯編(Static Binding)和動態聯編(Dynamic Binding)是兩種不同的函數調用綁定機制,核心區別在于確定函數調用的時機和多態性的支持。以下是詳細解釋: 1. 靜態聯編(Static Binding) 定義:在編譯階段確定函數調用與具體實現的關系。特點: 由編譯器直接確…

如何批量為多個 Word 文檔添加水印保護

在日常辦公中&#xff0c;Word文檔添加水印是一項重要的操作&#xff0c;特別是在需要保護文件內容的安全性和版權時。雖然Office自帶了添加水印的功能&#xff0c;但當需要一次性給多個Word文檔添加水印時&#xff0c;手動操作顯得非常繁瑣且低效。為了提高效率&#xff0c;可…

【愚公系列】《Python網絡爬蟲從入門到精通》057-分布式爬取中文日報新聞數據

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

Linux系統編程 day9 SIGCHLD and 線程

SIGCHLD信號 只要子進程信號發生改變&#xff0c;就會產生SIGCHLD信號。 借助SIGCHLD信號回收子進程 回收子進程只跟父進程有關。如果不使用循環回收多個子進程&#xff0c;會產生多個僵尸進程&#xff0c;原因是因為這個信號不會循環等待。 #include<stdio.h> #incl…

微信小程序拖拽排序有效果圖

效果圖 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…

hadoop三大組件的結構及各自的作用

1 HDFS 1.1功能 HDFS 是 Hadoop 的分布式文件系統&#xff0c;用于存儲和管理海量數據。它具有高容錯性、高吞吐量和可擴展性&#xff0c;能夠在多個節點上存儲和管理大規模數據 1.2架構&#xff1a;采用主從架構&#xff0c;由一個 NameNode 和多個 DataNode 組成。NameNode…

解決jupyter notebook修改路徑下沒有c.NotebookApp.notebook_dir【建議收藏】

文章目錄 一、檢查并解決問題二、重新設置默認路徑創作不易&#xff0c;感謝未來首富們的支持與關注&#xff01; 最近在用jupyter notebook編寫代碼時&#xff0c;更新了一下Scikit-learn的版本&#xff0c;然后重新打開jupyter notebook的時候&#xff0c;我傻眼了&#xff0…