微服務架構中的精妙設計:服務注冊/服務發現-Eureka

一.使用注冊中心背景?

1.1服務遠程調用問題

服務之間遠程調?時, 我們的URL是寫死的?

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

缺點:

當更換機器, 或者新增機器時, 這個URL就需要跟著變更, 就需要去通知所有的相關服務去修改. 隨之?來的就是各個項?的配置?件反復更新, 各個項?的頻繁部署. 這種沒有具體意義, 但?不得不做的?作, 會讓?非常痛苦

?

解決方法:

這樣就類似解決高耦合的思想,引入第三方來保存保存和交互雙方信息

我們?活中, 避免不了和各個機構(醫院, 學校, 政府部?等)打交道, 就需要保存各個機構的電話號碼. 如果機構換了電話號碼, 就需要通知各個使??, 但是這些機構的使??群體是巨?的, 沒辦法做到??通知, 怎么處理呢?
機構電話如果發?變化, 通知114. ??需要聯系機構時, 先打114查詢電話, 然后再聯系各個機構.

?

114查號臺的作?主要有兩個:
  • 號碼注冊: 服務方把電話上報給114
  • 號碼查詢: 使用方通過114可以查到對應的號碼

?

同樣的, 微服務開發時, 也可以采?類似的?案.
  • 服務啟動/變更時, 向注冊中心報道. 注冊中心記錄應用和IP的關系.
  • 調??調?時, 先去注冊中心獲取服務?的IP, 再去服務?進?調?

?1.2什么是注冊中心

在最初的架構體系中, 集群的概念還不那么流?, 且機器數量也?較少, 此時直接使?DNS+Nginx就可以滿??乎所有服務的發現. 相關的注冊信息直接配置在Nginx. 但是隨著微服務的流?與流量的激增,機器規模逐漸變?, 并且機器會有頻繁的上下線?為, 這種時候需要運維?動地去維護這個配置信息是?個很?煩的操作. 所以開發者們開始希望有這么一個東西, 它能維護?個服務列表, 哪個機器上線了,哪個機器宕機了, 這些信息都會自動更新到服務列表上, 客戶端拿到這個列表, 直接進行服務調用即可. 這個就是注冊中心。

?注冊中?主要有三種??:

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

?

1.3CAP理論

CAP 理論是分布式系統設計中最基礎, 也是最為關鍵的理論. ?

  • ?致性(Consistency) CAP理論中的?致性, 指的是強?致性. 所有節點在同?時間具有相同的數據
  • 可?性(Availability) 保證每個請求都有響應(響應結果可能不對)
  • 分區容錯性(Partition Tolerance) 當出現?絡分區后,系統仍然能夠對外提供服務
?個部門全國各地都有崗位, 這時候, 總部下發了?個通知, 由于通知需要開會周知全員, 當有客戶咨詢時:
所有成員對客戶的回應結果都是?致的(?致性)
客戶咨詢時, ?定有回應(可用性)
當其中?個成員休假時, 這個部門的其他成員也可以對客戶提供咨詢服務(分區容錯性)
CAP 理論告訴我們: ?個分布式系統不可能同時滿?數據?致性, 服務可?性和分區容錯性這三個基本需求, 最多只能同時滿?其中的兩個
為什么?
  • 如果要保證一致性,總部有了新通知,就必須等所有地區的成員都收到通知后,才能統一回應客戶。但這樣在網絡故障期間,那些沒收到通知的地區成員就無法回應客戶,也就犧牲了可用性。
    ?
  • 如果要保證可用性,不管網絡有沒有問題,只要客戶來咨詢,成員們就得馬上回應。但這樣一來,在網絡分區的情況下,那些沒收到新通知的成員可能就會給出和收到通知的成員不一樣的回應,也就犧牲了一致性。
在分布式系統中, 系統間的?絡不能100%保證健康, 服務?必須對外保證服務. 因此Partition
Tolerance不可避免. 那就只能在C和A中選擇?個. 也就是CP或者AP架構
CP架構: 為了保證分布式系統對外的數據?致性, 于是選擇不返回任何數據
AP架構: 為了保證分布式系統的可?性, 即使數據不一致,也要保證響應

1.4常見的注冊中心

  1. Zookeeper
    Zookeeper的官?并沒有說它是?個注冊中?, 但是國內Java體系, ?部分的集群環境都是依賴 Zookeeper來完成注冊中?的功能.
  2. Eureka:
    Eureka是Netflix開發的基于REST的服務發現框架, 主要?于服務注冊, 管理,負載均衡和服務故障轉移. 官?聲明在Eureka2.0版本停?維護, 不建議使?. 但是Eureka是SpringCloud服務注冊/發現的默認實現, 所以?前還是有很多公司在使?.
  3. Nacos:
    Nacos是Spring Cloud Alibaba架構中重要的組件, 除了服務注冊, 服務發現功能之外, Nacos還?持配置管理, 流量管理, DNS, 動態DNS等多種特性

?CAP理論對比?

?

在分布式環境中, 即使拿到?個錯誤的數據, 也勝過?法提供實例信
11.11, 京東618都是謹遵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 會存儲這些信息
關于Eureka的使用, 主要包含以下三個部分:
  1. 搭建Eureka Server
  2. 將order-service, product-service 都注冊到Eureka
  3. order-service遠程調?時, 從Eureka中獲取product-service的服務列表, 然后進?交互

2.1搭建Eureka Server

?Eureka-server 是?個獨立的微服務,我也通過子項目形式編寫

1.搭建注冊中心

2.pom文件添加Eureka依賴

 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><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/

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

?

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

?5.啟動項目成功嘿嘿

?


2.2服務注冊?

服務注冊:針對提供給order訂單服務的product產品服務?

接下來我們把product-service 注冊到eureka-server中

1. product的pom文件加入Eureka的依賴?

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

?
2. application.yml修改配置信息

1.添加該服務的信息

2.添加相關eureka配置信息?


3. 啟動,測試

?

?


2.3服務發現

服務發現:針對消費produc產品服務的order訂單服務

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

1. 加入Eureka依賴

?

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


2.application.yml修改配置信息

1.添加該服務的信息

2.添加相關eureka配置信息?

servic:port: 8080spring:application:name: order-servicedatasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: weigang527driver-class-name: com.mysql.cj.jdbc.Drivermvc:favicon:enable: falseprofiles:  #多平臺配置active: dev
# 設置 Mybatis 的 xml 保存路徑
mybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration: # 配置打印 MyBatis 執行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自動駝峰轉換
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/

?

3.service層修改遠程調用的代碼

package order.service;import lombok.extern.slf4j.Slf4j;
import order.mapper.OrderMapper;
import order.model.OrderInfo;
import order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.List;
@Slf4j
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;//注入這個接口@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;//注意這個有多個同名,使用.cloud.client后綴的public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();//從Eureka中獲取服務列表(因為可能不止一個服務,所有使用列表,然后再選擇列表中的product服務)List<ServiceInstance> instances = discoveryClient.getInstances("product-service");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. 啟動,測試?

5.查看遠程調用是否成功

?

?

2.4Eureka 和Zookeeper區別

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

?

?

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

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

相關文章

極速版:棧的內存/局部變量表/堆的內存細分

1. 棧的存儲 每個線程都有自己的棧&#xff0c;棧中數據以棧幀&#xff08;Stack Frame&#xff09;為基本單位 線程上正在執行的每個方法都各自對應一個棧楨&#xff08;Stack Frame&#xff09; 棧楨是一個內存區塊&#xff0c;是一個數據集&#xff0c;維系著方法執行過程…

【操作系統】內存泄漏 vs 內存碎片

【操作系統】內存泄漏 vs 內存碎片 內存泄漏&#xff08;Memory Leak&#xff09; vs 內存碎片&#xff08;Memory Fragmentation&#xff09;1. 內存泄漏&#xff08;Memory Leak&#xff09;2. 內存碎片&#xff08;Memory Fragmentation&#xff09;3. 內存泄漏 vs 內存碎片…

力扣HOT100之矩陣:73. 矩陣置零

這道題我沒有想到什么好的辦法&#xff0c;直接暴力AC了&#xff0c;直接遍歷兩次矩陣&#xff0c;第一次遍歷用兩個向量分別記錄出現0的行數和列數&#xff0c;第二次遍歷就判斷當前的元素的行數或者列數是否出現在之前的兩個向量中&#xff0c;若出現了就直接置零&#xff0c…

?Flink/Kafka在python中的用處

一、基礎概念 1. ?Apache Kafka 是什么&#xff1f; ?核心功能&#xff1a;Kafka 是一個分布式流處理平臺&#xff0c;主要用于構建實時數據管道和流式應用程序。?核心概念&#xff1a; ?生產者&#xff08;Producer&#xff09;?&#xff1a;向 Kafka 發送數據的程序。…

推薦系統(十八):優勢特征蒸餾(Privileged Features Distillation)在商品推薦中的應用

在商品推薦系統中&#xff0c;粗排和精排環節的知識蒸餾方法主要通過復雜模型&#xff08;Teacher&#xff09;指導簡單模型&#xff08;Student&#xff09;的訓練&#xff0c;以提升粗排效果及與精排的一致性。本文將以淘寶的一篇論文《Privileged Features Distillation at …

深度學習四大核心架構:神經網絡(NN)、卷積神經網絡(CNN)、循環神經網絡(RNN)與Transformer全概述

目錄 &#x1f4c2; 深度學習四大核心架構 &#x1f330; 知識點概述 &#x1f9e0; 核心區別對比表 ? 生活化案例理解 &#x1f511; 選型指南 &#x1f4c2; 深度學習四大核心架構 第一篇&#xff1a; 神經網絡基礎&#xff08;NN&#xff09; &#x1f330; 知識點概述…

R語言對偏態換數據進行轉換(對數、平方根、立方根)

我們進行研究的時候經常會遇見偏態數據&#xff0c;數據轉換是統計分析和數據預處理中的一項基本技術。使用 R 時&#xff0c;了解如何正確轉換數據有助于滿足統計假設、標準化分布并提高分析的準確性。在 R 中實現和可視化最常見的數據轉換&#xff1a;對數、平方根和立方根轉…

第十四屆藍橋杯省賽電子類單片機學習記錄(客觀題)

01.一個8位的DAC轉換器&#xff0c;供電電壓為3.3V&#xff0c;參考電壓2.4V&#xff0c;其ILSB產生的輸出電壓增量是&#xff08;D&#xff09;V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析&#xff1a; ILSB&#xff08;最低有效位&#xff09;的電壓增量計算公式…

HarmonyOSNext_API16_媒體查詢

媒體查詢條件詳解 媒體查詢是響應式設計的核心工具&#xff0c;通過判斷設備特征動態調整界面樣式。其完整規則由媒體類型、邏輯操作符和媒體特征三部分組成&#xff0c;具體解析如下&#xff1a; 一、媒體查詢語法結構 基本格式&#xff1a; [媒體類型] [邏輯操作符] (媒體特…

Python+拉普拉斯變換求解微分方程

引言 在數學和工程學中,微分方程廣泛應用于描述動態系統的行為,如電路、電氣控制系統、機械振動等。求解微分方程的一個常見方法是使用拉普拉斯變換,尤其是在涉及到初始條件時。今天,我們將通過 Python 演示如何使用拉普拉斯變換來求解微分方程,并幫助大家更好地理解這一…

【算法】手撕快速排序

快速排序的思想 任取一個元素作為樞軸&#xff0c;然后想辦法把這個區間劃分為兩部分&#xff0c;小于等于樞軸的放左邊&#xff0c;大于等于樞軸的放右邊 然后遞歸處理左右區間&#xff0c;直到空或只剩一個 具體動畫演示詳見 數據結構合集 - 快速排序(算法過程, 效率分析…

《八大排序算法》

相關概念 排序&#xff1a;使一串記錄&#xff0c;按照其中某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來。穩定性&#xff1a;它描述了在排序過程中&#xff0c;相等元素的相對順序是否保持不變。假設在待排序的序列中&#xff0c;有兩個元素a和b&#xff0c;它們…

深度學習篇---paddleocr正則化提取

文章目錄 前言一、代碼總述&介紹1.1導入必要的庫1.1.1cv21.1.2re1.1.3paddleocr 1.2初始化PaddleOCR1.3打開攝像頭1.4使用 PaddleOCR 進行識別1.5定義正則表達式模式1.6打印提取結果1.7異常處理 二、正則表達式2.1簡介2.2常用正則表達式模式及原理2.2.1. 快遞單號模式2.2.2…

JavaScript DOM與元素操作

目錄 DOM 樹、DOM 對象、元素操作 一、DOM 樹與 DOM 對象 二、獲取 DOM 元素 1. 基礎方法 2. 現代方法&#xff08;ES6&#xff09; 三、修改元素內容 四、修改元素常見屬性 1. 標準屬性 2. 通用方法 五、通過 style 修改樣式 六、通過類名修改樣式 1. className 屬…

單元測試的編寫

Python 單元測試示例 在 Python 中&#xff0c;通常使用 unittest 模塊來編寫單元測試。以下是一個簡單的示例&#xff1a; 示例代碼&#xff1a;calculator.py # calculator.py def add(a, b):return a bdef subtract(a, b):return a - b 單元測試代碼&#xff1a;test_c…

大模型學習:從零到一實現一個BERT微調

目錄 一、準備階段 1.導入模塊 2.指定使用的是GPU還是CPU 3.加載數據集 二、對數據添加詞元和分詞 1.根據BERT的預訓練&#xff0c;我們要將一個句子的句頭添加[CLS]句尾添加[SEP] 2.激活BERT詞元分析器 3.填充句子為固定長度 代碼解釋&#xff1a; 三、數據處理 1.…

10組時尚復古美學自然冷色調肖像電影照片調色Lightroom預設 De La Mer – Nautical Lightroom Presets

De La Mer 預設系列包含 10 種真實的調色預設&#xff0c;適用于肖像、時尚和美術。為您的肖像攝影帶來電影美學和個性&#xff01; De La Mer 預設非常適合專業人士和業余愛好者&#xff0c;可在桌面或移動設備上使用&#xff0c;為您的攝影項目提供輕松的工作流程。這套包括…

SDL多窗口多線程渲染技術解析

SDL多窗口多線程渲染技術解析 技術原理 SDL多線程模型與窗口管理 SDL通過SDL_Thread結構體實現跨平臺線程管理。在多窗口場景中,每個窗口需關聯獨立的渲染器,且建議遵循以下原則: 窗口與渲染器綁定:每個窗口創建時生成專屬渲染器(SDL_CreateRenderer),避免跨線程操作…

QT 跨平臺發布指南

一、Windows 平臺發布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 應用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 庫 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…

L2-037 包裝機 (分數25)(詳解)

題目鏈接——L2-037 包裝機 問題分析 這個題目就是模擬了物品在傳送帶和筐之間的傳送過程。傳送帶用隊列模擬&#xff0c;筐用棧模擬。 輸入 3 4 4 GPLT PATA OMSA 3 2 3 0 1 2 0 2 2 0 -1輸出 根據上述操作&#xff0c;輸出的物品順序是&#xff1a; MATA樣例分析 初始…