微服務day02-Ribbon負載均衡與Nacos安裝與入門

一.Ribbon負載均衡

在上一節中,我們通過在RestTemplte實例中加上了注解 @LoadBalanced,表示將來由RestTemplate發起的請求會被Ribbon攔截和處理,實現了訪問服務時的負載均衡,那么他是如何實現的呢?

1.1 Ribbon負載均衡的原理

在這里插入圖片描述
Ribbon實現負載均衡的流程如上圖所示,order-service需要請求user-service的服務,根據user-service在eureka注冊中心的注冊的服務名稱是userservice,order-service直接使用usersivce作為“IP地址+端口號”進行訪問,發起了請求http:userservice/user/1,然后Ribbon會收到該請求,于是訪問eureka注冊中心拉取userservice所有的服務列表,然后負載均衡訪問中的一個。
在這里插入圖片描述
具體的Ribbon的負載均衡實現原理如上圖所示:

  • 1.order-service發送的請求會被LoadBalancerInterceptor負載均衡攔截器攔截
  • 2.由RibbonLoadBanlancerClient獲取url中的服務id(就是你注冊的服務名稱)userservice
  • 3.將該服務id交給DynamicServerListLoadBalancer,從eureka注冊中心中拉取服務列表,并根據IRule選擇一個負載均衡的策略,比如隨機調度,輪詢調度等選擇某個服務。
  • 4.將該服務返回給RibbonLoadBanlacnedClient
  • 5.RibbonLoadBanlacnedClient修改url并發起請求。

1.2 Ribbon負載均衡的策略

有多種負載均衡的策略,默認是輪詢,如果想要自己修改負載均衡的策略,需要在對應的服務中(該服務訪問其他服務)進行配置.
方式一
代碼方式,在比如order-service的application中提供一個定義一個新的IRule,該方式是全局配置,只要配置之后,無論是在order-service中調用哪個微服務,都會執行該負載均衡的策略;

	/*** 代碼方式配置負載均衡策略* @return*/@Beanpublic IRule randomRule(){return new RandomRule();}

方式二
配置yml方式,局部配置,配置某一個微服務的訪問時的負載均衡的策略。

# 配置某個服務的負載均衡策略
userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡的策略

1.3 Ribbon饑餓加載

首先,明確什么是懶加載與饑餓加載?
??懶加載(Lazy Loading)是一種延遲加載數據或資源的策略,它通常在需要時才加載數據,而不是在初始化時就立即加載。這個概念在軟件開發中經常被用來提高性能和減少資源消耗。
??“饑餓加載”(Eager Loading)是一種加載數據或資源的策略,它與懶加載相對。在饑餓加載中,數據或資源在初始化或啟動時就被加載,而不管是否立即需要使用。

??Ribbon默認是采用懶加載,即第一次訪問時才會創建LoadBanlacnedClient,因此第一次請求的時間會很長,但之后就好了(因為加載好的內容會被緩存到內存中)。
??修改Ribbon的加載方式為饑餓加載,于是便會在項目啟東時就創建LoadBanlacnedClient,降低第一次訪問的耗時,通過配置的方式開啟饑餓加載。

# 配置饑餓加載
ribbon:eager-load:enabled: true

二.Nacos安裝與入門

Nacos(全稱為"Dynamic Naming and Configuration Service")是阿里巴巴開源的一款服務發現、配置管理和服務管理平臺。它可以幫助開發者輕松構建云原生應用,實現動態服務發現、服務注冊與配置管理,并提供服務治理、流量管理等功能。

2.1 認識Nacos

Nacos也是服務注冊中心,但是相對Eureka有著更加豐富的功能,且在國內更受歡迎。

2.2 安裝Nacos

當前使用的Nacos的版本是1.4.1,直接解壓安裝包即可。可以在nacos/conf目錄下的application.properties文件中修改端口號信息,默認是8848(8848鈦金手機,成功男人的標志)。

2.3 啟動Nacos

進入Nacos安裝目錄下的bin目錄,輸入命令:

startup.cmd -m standalone

啟動成功截圖,然后按住ctrl+點擊啟動地址即可啟動

在這里插入圖片描述
在這里插入圖片描述

登陸的默認賬號和密碼都是nacos,登陸成功頁面

在這里插入圖片描述

2.4 Nacos快速入門

由于Nacos是后續加入的,所以父工程spring-cloud的依賴并不包含之,需要在父工程中額外加入Nacos管理依賴。
1.修改依賴

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>

將user-service,order-service中的原來eureka客戶端依賴注釋掉,修改為nacos客戶端依賴。

<!-- nacos客戶端依賴包 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.修改配置文件
注釋掉user-service,order-service的eureka服務注冊信息的配置
在這里插入圖片描述
在spring相關配置中添加:

cloud:nacos:server-addr: localhost:8848 # nacos服務地址

然后啟動即可,nacos與eureka的其他代碼都相同,只需要修改配置文件和導入依賴即可。修改之后直接啟動各個服務,隨后各個服務會被注冊到nacos注冊中心之中,如下圖所示:

在這里插入圖片描述

2.5 Nacos服務分級存儲模型

Nacos還引入了服務集群的概念,在一個服務可以包含多個實例的同時(這點與eureka相同),每個實例還會有一個隸屬的集群,比如北京集群,上海集群,廣州集群,深圳集群,在一個服務需要調用另一個服務時應該盡可能的調用本地集群的服務,這樣速度更快,延遲更低。
為服務實例配置集群屬性

spring:cloud:nacos:discovery:cluster-name: HZ # 集群名稱

配置好之后,啟動user-service,user-service(1);
然后再修改集群名稱為另一個:

spring:cloud:nacos:discovery:cluster-name: SH # 集群名稱

再啟動user-service(2).
此時user-service,user-service(1);會被部署到hz集群,user-service(2)會被部署到sh集群.
在這里插入圖片描述

2.6 NacosRuler負載均衡

決定負載均衡的策略完全是由IRule決定的,當前order-service使用的是隨機負載均衡策略

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡的策略

那么并不會按照集群本地訪問優先的規則進行訪問。所以修改負載均衡策略為NacosRule,優先選擇本地集群,本地集群內使用隨機方式訪問。

NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡的策略

配置之后,會優先訪問同集群內服務user-service(hz集群)
在這里插入圖片描述
user-service(1)(hz集群)
在這里插入圖片描述
user-service(2)(sh集群)
在這里插入圖片描述
當停掉HZ服務之后,只剩下SH服務:
在這里插入圖片描述
仍能訪問成功,但是order-service控制臺會給出一個警告信息,提醒這是一個跨越集群的訪問:
在這里插入圖片描述

2.7 NacosRuler負載均衡的權重設置

當出現不同機器需要承擔不同比例的請求時,就不能單純的按照優先本地集群,集群內隨機的方式負載均衡了。需要配置權重。直接在Nacos控制臺配置權重即可,配置的權重通常是0-1之間,當某個服務的權重為0時,表示該服務不會被任何用戶訪問(可以用于不停服更新,絲滑過渡等場景)。
在這里插入圖片描述

2.8 NacosRuler負載均衡的權重設置

Nacos中服務存儲和數據存儲的最外層都是一個名為namespace的東西,用來做外層隔離。
在這里插入圖片描述
namespace可以用于隔離開發環境,生產環境,測試環境等。
通過nacos控制臺新建一個命名空間dev
在這里插入圖片描述
可以看到,新建的命名空間dev中沒有任何服務。
在這里插入圖片描述
如果要修改服務所在命名空間,需要在代碼中修改對應的服務yml配置文件。

spring:cloud:nacos:discovery:namespace: d3811bbe-1b14-449f-b984-85bdbcdf16dd # 命名空間ID

添加上述代碼到order-service中,重啟order-service服務,刷新nacos控制臺,發現public命名空間中只剩下一個user-service;
在這里插入圖片描述
命名空間dev中卻有了order-service
在這里插入圖片描述
此時由于二者位于不同的命名空間,二者便無法再相互訪問…

2.9 Nacos與Eureka注冊中心的比較

二者訪問服務的邏輯基本一致。

區別一:服務提供者的健康檢測

??Nacos分為臨時實例和非臨時實例,二者的健康檢測是不同的,臨時實例的健康檢測同Eureka,每隔30s向nacos注冊中心報告一次狀態(心跳檢測),如果nacos注冊中心在一定時間內未收到臨時實例的報告,會直接認為該服務已經掛掉了,將該服務直接從列表中剔除。而非臨時實例則是nacos主動詢問目標服務,即使非臨時服務掛掉了,nacos注冊中心也不會把非臨時實例從列表中剔除,而是會等著該服務,等著該服務回復健康。
在這里插入圖片描述

區別二:服務消費者的獲取服務方式不同
??eureka的服務消費者只通過定時拉取服務的方式拉取服務列表pull,由于是定時拉取,因此當服務列表更新時,可能更新之后的服務獲取不及時。
??nacos的服務消費者不僅通過定時拉取服務的方式拉取服務列表pull,同時加入主動推送變更消息的機制push,這樣當服務變更時可以及時的提醒服務消費者。
在這里插入圖片描述

設置臨時實例/非臨時實例
默認為臨時實例,在修改配置之后變為非臨時實例。

spring:cloud:nacos:discovery:ephemeral: false # 設置為非臨時實例

在這里插入圖片描述

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

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

相關文章

鏈表的歸并排序-LeetCode(Python版)

雙指針歸并排序&#xff01;圖解排序鏈表&#xff01;-知乎 class ListNode(object):def __init__(self, val0, nextNone):self.val valself.next nextclass Solution(object):def find_mid(self, head): # 快慢指針slow, fast head, headwhile fast.next and fast.next.n…

linux 硬盤存儲剩余容量自動化監控+報警通知

linux 硬盤存儲剩余容量自動化監控報警通知 編寫shell腳本 #!/bin/bash# 獲取系統存儲大小&#xff08;單位為GB&#xff09; storage_size$(df -h / | awk NR2 {print $4} | sed s/G//)# 閾值&#xff08;小于10GB觸發報警&#xff09; threshold10# 釘釘機器人 Webhook UR…

LabVIEW非接觸式電阻抗層析成像系統

LabVIEW非接觸式電阻抗層析成像系統 非接觸式電阻抗層析成像&#xff08;NEIT&#xff09;技術以其無輻射、非接觸、響應速度快的特點&#xff0c;為實時監測提供了新的解決方案。基于LabVIEW的電阻抗層析成像系統&#xff0c;實現了數據的在線采集及實時成像&#xff0c;提高…

代碼隨想錄算法訓練營第四十四天|139.單詞拆分、56.攜帶礦石資源

139.單詞拆分 思路&#xff1a;將字符串s看作為背包容量&#xff0c;從字符串中獲取物品&#xff0c;剛好滿足背包容量的過程&#xff0c;因為可以從字符串中多次取值&#xff0c;相當于物品的數量是不限制&#xff0c;這就是一個完全背包的問題&#xff01;這個題有個關鍵點&a…

Python中的windows路徑問題

在Python中處理Windows路徑時,經常會遇到一些特殊的問題。這主要是因為Windows和大多數其他操作系統(如Linux和macOS)使用不同的路徑分隔符。在Windows中,路徑使用反斜杠(\)作為分隔符,而在其他操作系統中,路徑使用正斜杠(/)作為分隔符。 以下是在Python中處理Windo…

Java SE:多線程(Thread)

1. 線程兩個基本概念 并發&#xff1a;即線程交替運行多個指令并行&#xff1a;即多個線程同時運行指令 并發并行不矛盾&#xff0c;兩者可同時發生&#xff0c;即多個線程交替運行指令 2. 多線程3種實現方式 2.1 直接創建線程對象 /*** 方式1&#xff1a;* 1. 創建thread類的…

mybatis plus 深入學習 【Base Mapper】的方法 【IService】的方法

mybatis plus 深入學習 常見注解 1.TableName 描述&#xff1a;表名注解&#xff0c;標識實體類對應的表使用位置&#xff1a;實體類 TableName("sys_user") public class User {private Long id;private String name;private Integer age;private String email;…

【Linux系統化學習】信號的保存

目錄 阻塞信號 信號處理常見方式概覽 信號的其他相關概念 在內核中的表示 sigset_t 信號集操作函數 sigprocmask函數 sigpending函數 信號的捕捉 內核如何實現信號的捕捉 sigaction函數 可重入函數 volatile 阻塞信號 信號處理常見方式概覽 當信號來臨時&#x…

c++算法入門教程(2)

C是一種功能強大且廣泛應用的編程語言&#xff0c;對于想要深入學習編程和算法的人來說&#xff0c;掌握C是一個重要的里程碑。本文將帶你逐步了解C編程的基礎知識&#xff0c;并介紹一些常見的算法和編程技巧幫你入門c算法。 ?在c算法入門教程(1) 中&#xff0c;我講解了什么…

GEE:使用Sigmoid激活函數對單波段圖像進行變換(以NDVI為例)

作者:CSDN @ _養樂多_ 本文將介紹在 Google Earth Engine (GEE)平臺上,對任意單波段影像進行 Sigmoid 變換的代碼。并以對 NDVI 影像像素值的變換為例。 文章目錄 一、Sigmoid激活函數1.1 什么是 Sigmoid 激活函數1.2 用到遙感圖像上有什么用?二、代碼鏈接三、完整代碼一…

查詢每個會話使用內存大小(DM8達夢數據庫)

DM8達夢數據庫查詢每個會話使用內存大小 1 環境介紹2 查詢每個sql會話使用內存大小3 達夢數據庫學習使用列表 1 環境介紹 在某些環境數據庫內存增長到服務器內存用完,發生OOM事件,可以分析sql會話使用內存大小; 2 查詢每個sql會話使用內存大小 --創建SQL會話占用內存記錄表 …

共享棧的C語言實現

共享棧&#xff1a;所謂共享棧就是為了節省空間&#xff0c;讓兩個棧共享一片連續的存儲空間&#xff0c;兩個棧從這片連續的共享空間的兩端向中間擴充自己的存儲空間&#xff0c;設這片存儲空間的大小為maxSize&#xff0c;采用棧頂指針始終指向當前棧頂元素的方式來實現共享棧…

簡單認識算法的復雜度

時間復雜度與空間復雜度 1.算法的復雜度 ? 算法在編寫成可執行程序后&#xff0c;運行時需要耗費時間資源和空間(內存)資源 。因此衡量一個算法的好壞&#xff0c;一般是從時間和空間兩個維度來衡量的&#xff0c;即時間復雜度和空間復雜度。 ? 時間復雜度主要衡量一個算法…

MYSQL02高級_目錄結構、默認數據庫、表文件、系統獨立表空間

文章目錄 ①. MySQL目錄結構②. 查看默認數據庫③. MYSQL5.7和8表文件③. 系統、獨立表空間 ①. MySQL目錄結構 ①. 如何查看關聯mysql目錄 [rootmysql8 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /etc/selinux/targeted/tmp/modules/100/mysql /etc/seli…

前端src中圖片img標簽資源的幾種寫法?

在 Vue 項目中引用圖片路徑有幾種不同的方法&#xff0c;具體取決于你的項目結構和配置。以下是幾種常見的方式&#xff1a; 1. 靜態資源目錄 (Public) 如果你的圖片放在了項目的 public 目錄下&#xff08;例如&#xff0c;Vite 和 Create Vue App 腳手架工具通常使用這個目…

05 OpenCV圖像混合技術

文章目錄 理論算子示例 理論 其中 的取值范圍為0~1之間 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 參數1&#xff1a;輸入圖像Mat …

2024年【廣東省安全員A證第四批(主要負責人)】考試試卷及廣東省安全員A證第四批(主要負責人)作業模擬考試

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 廣東省安全員A證第四批&#xff08;主要負責人&#xff09;考試試卷根據新廣東省安全員A證第四批&#xff08;主要負責人&#xff09;考試大綱要求&#xff0c;安全生產模擬考試一點通將廣東省安全員A證第四批&#x…

釘釘機器人發送折線圖卡片 工具類代碼

釘釘機器人 “創建并投放卡片 接口 ” 可以 發送折線圖、柱狀圖 官方文檔&#xff1a;創建并投放卡片 - 釘釘開放平臺 0依賴、1模板、2機器人放到內部應用、3放開這個權限 、4工具類、5調用工具類 拼接入參 卡片模板 自己看文檔創建&#xff0c;卡片模板的id 有用 0、依賴…

Springboot項目中定時任務的四種實現方式

文章目錄 1. 使用Scheduled注解1.1 時間間隔執行1.2 固定時間點執行 2. 使用EnableScheduling注解啟用定時任務3. 實現SchedulingConfigurer接口4. 使用Quartz框架4.1 配置QuartzScheduler4.2 定義Job類和Trigger類 5. 總結 在開發現代應用時&#xff0c;定時任務是一個非常常見…

地圖可視化繪制 | R-ggplot2 NC地圖文件可視化

在推出兩期數據分享之后&#xff0c;獲取數據的小伙伴們也知道&#xff0c;數據格式都是NetCDF(nc) 格式網格數據&#xff0c;雖然我在推文分享中說明使用Python、R或者GIS類軟件都是可以進行 處理和可視化繪制的&#xff0c;但是&#xff0c;還是有小伙伴咨詢使用編程軟件Pyth…