三.微服務架構中的精妙設計:服務注冊/服務發現-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/diannao/76474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76474.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76474.shtml

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

相關文章

FPGA實現4K MIPI視頻解碼H265壓縮網絡推流輸出,基于IMX317+VCU架構,支持4K60幀,提供工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 MIPI 編解碼方案我這里已有的視頻圖像編解碼方案 3、詳細設計方案設計框圖FPGA開發板IMX317攝像頭MIPI D-PHYMIPI CSI-2 RX Subsystem圖像預處理Sensor …

Ollama+open-webui搭建私有本地大模型詳細教程

Ollamaopen-webui搭建私有本地大模型詳細教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 簡介 ? Ollama 是一個輕量級的 AI 模型運行時&#xff0c;專注于簡化 AI 模型的部署和使用。它支持多種預訓練模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

解決Centos7集成IDEA報git版本太低問題

Centos 7 服務器上默認安裝的 Git 是 1.8.3.1 版本的 與最新的IDEA已無法匹配&#xff0c;需要更新 首先&#xff0c;卸載老版本 sudo yum -y remove git sudo yum -y remove git-*添加 End Point 到 CentOS 7 倉庫 sudo yum -y install https://packages.endpointdev.com/r…

Qt常用宏定義判斷大全

Qt 提供了一系列預定義宏用于判斷 Qt 版本、操作系統平臺、編譯器特性等。這些宏在跨平臺開發中非常有用。 1. Qt 版本判斷宏 // 檢查Qt版本 #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代碼 #endif// 常用版本判斷 #if QT_VERSION > QT_V…

實戰 | 餐廳點餐小程序技術解析:SpringBoot + UniApp 高效開發指南

&#x1f5a5;? 一、系統架構概覽 1.1 技術選型 為了確保開發效率和系統穩定性&#xff0c;我們采用以下技術棧&#xff1a; 模塊技術選型后臺服務SpringBoot MyBatis-Plus MySQL用戶端&#xff08;點餐小程序&#xff09;UniApp&#xff08;Vue 語法&#xff09;師傅端&…

實現在Unity3D中仿真汽車,而且還能使用ros2控制

文章目錄 前言&#xff08;Introduction&#xff09;搭建開發環境&#xff08;Setup Development Environment&#xff09;在window中安裝Unity&#xff08;Install Unity in window&#xff09;創建Docker容器&#xff0c;并安裝相關軟件&#xff08;Create Docker containers…

華為配置篇-BGP實驗

BGP 一、簡述二、常用命令總結三、實驗 一、簡述 IBGP 水平分割&#xff1a;從一個 IBGP 對等體學到的路由&#xff0c;不會再通告給其他的 IBGP 對等體。在一個 AS 內部&#xff0c;路由器之間通過 IBGP 交換路由信息。如果沒有水平分割機制&#xff0c;當多個路由器之間形成…

Python視頻標簽工具詳解:基于wxPython和FFmpeg的實現

在當今數字媒體時代&#xff0c;視頻內容的管理和標記變得越來越重要。無論是研究人員需要對實驗視頻進行時間點標記&#xff0c;教育工作者需要對教學視頻添加注釋&#xff0c;還是個人用戶希望對家庭視頻進行分類整理&#xff0c;一個高效的視頻標簽工具都是不可或缺的。本文…

國產三維CAD「皇冠CAD」在汽車零部件領域建模教程:剎車片

本教程深度融合三維皇冠CAD&#xff08;CrownCAD&#xff09;的MBD&#xff08;Model-Based Definition&#xff09;設計理念&#xff0c;通過參數化建模、智能約束管理、動態裝配驗證等功能&#xff0c;實現數據驅動設計&#xff0c;精準解決了汽車制動系統中精密制動組件的設…

C#從入門到精通(3)

目錄 第九章 窗體 &#xff08;1&#xff09;From窗體 &#xff08;2&#xff09;MDI窗體 &#xff08;3&#xff09;繼承窗體 第十章 控件 &#xff08;1&#xff09;控件常用操作 &#xff08;2&#xff09;Label控件 &#xff08;3&#xff09;Button控件 &…

關于跨域與.NET的處理方案

在 Web 開發里&#xff0c;瀏覽器的同源策略是一項關鍵的安全機制。同源指的是兩個 URL 的協議、域名和端口都相同。當瀏覽器從一個源&#xff08;域名、協議、端口&#xff09;的網頁去請求另一個源的資源時&#xff0c;就會產生跨域問題。例如&#xff0c;從 http://www.exam…

react 15-16-17-18各版本的核心區別、底層原理及演進邏輯的深度解析--react18

React 18 是一次重大的版本升級&#xff08;發布于2022年&#xff09;&#xff0c;引入了并發渲染&#xff08;Concurrent Rendering&#xff09; 和一系列新特性&#xff0c;旨在提升應用性能、用戶體驗和開發靈活性。 一、核心新特性 并發模式&#xff08;Concurrent Mode&a…

基于Spring Boot的平面設計課程在線學習平臺系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Scala-面向對象

Scala 包 基本語法 package 包名 Scala 包的三大作用&#xff08;和 Java 一樣&#xff09; 區分相同名字的類 當類很多時&#xff0c;可以很好的管理類 控制訪問范圍 包的命名、說明、對象 包的命名 命名規則 只能包含數字、字母、下劃線、小圓點.&#xff0c;但不能用數字…

Excel 使用技巧:excel 合并不同列內容; excel 將公式轉化為文本

Excel 使用技巧 目錄 Excel 使用技巧excel 合并不同列內容="A:"&C1&"、B:"&D1&"、C:"&E1&"、D:"&F1excel 將公式轉化為文本右鍵選擇行粘貼某一列均填入“提示詞”單擊拖動雙擊某一列均填入“1”清除1…

【數字化轉型,企業應用上云】---持續集成能力重塑企業軟件交付新范式

在數字化轉型浪潮中&#xff0c;軟件交付的速度與質量已成為企業核心競爭力的關鍵。如何高效管理從代碼開發到生產上線的全流程&#xff0c;實現開發與運維的無縫協作&#xff1f;如何通過自動化手段減少人為失誤、加速迭代周期&#xff1f;我們出的研發效能管理平臺&#xff0…

OpenCV圖像形態學:原理、操作與應用詳解

一、引言 圖像形態學&#xff08;Image Morphology&#xff09;是圖像處理領域的一個重要分支&#xff0c;它基于集合論、格論、拓撲學和隨機函數理論&#xff0c;主要用于分析和處理圖像的幾何結構。形態學操作通過特定的結構元素&#xff08;Structuring Element&#xff09;…

jenkins 參數化發布到服務器 publish over ssh、label、Parameterized publishing

前言 jenkins 參數化發布到服務器 jenkins可匹配標簽通過一個字符串或者正則表達式來匹配jenkins 可通過參數配置發布到服務器&#xff0c;比如打包后&#xff0c;根據參數配置&#xff0c;只發布到某個服務器。 設置選項參數 新增選項參數&#xff0c;比如填入myParameter…

第十二章網絡規劃設計

文章目錄 12-1考點分析12-2綜合布線(歷年高頻考點)12-3網絡設計與分析12-4網絡結構與功能12-5廣域網接入技術12-6網絡故障診斷與排查章節總結 12-1考點分析 12-2綜合布線(歷年高頻考點) 結構化布線系統 網絡規劃和設計是一個迭代和優化的過程。 ■ 結構化綜合布線系統是基于…

Qt基本框架(1)

本篇主要介紹Qt的基本框架&#xff0c;并實現簡單的按鈕事件 本文部分ppt、視頻截圖原鏈接&#xff1a;[萌馬工作室的個人空間-萌馬工作室個人主頁-嗶哩嗶哩視頻] 1. Qt基本框架介紹 Qt基本框架主要分為兩部分&#xff1a;Qt實例對象和Qt窗口。Qt實例對象負責初始化Qt運行時…