注冊中心Eureka和Nacos,以及負載均衡Ribbon

1.初識微服務

1.1.什么是微服務

微服務,就是把服務拆分成為若干個服務,降低服務之間的耦合度,提供服務的獨立性和靈活性。做到高內聚,低耦合。

在這里插入圖片描述

1.2.單體架構和微服務架構的區別:

  • 單體架構:簡單方便,高度耦合,擴展性差,適合小型項目。例如:學生管理系統

  • 分布式架構:松耦合,擴展性好,但架構復雜,難度大。適合大型互聯網項目,例如:京東、淘寶

  • 微服務:一種良好的分布式架構方案

    ①優點:拆分粒度更小、服務更獨立、耦合度更低

    ②缺點:架構非常復雜,運維、監控、部署難度提高

  • SpringCloud是微服務架構的一站式解決方案,集成了各種優秀微服務功能組件

1.3.什么是SpringCloud

SpringCloud是一種微服務框架,集成了各種微服務功能組件,并基于SpringBoot實現了這些組件的自動裝配,從而提供了良好的開箱即用體驗。

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

1.4.微服務技術對比

在這里插入圖片描述

在這里插入圖片描述

2.Eureka注冊中心

如果沒有Eureka,就要把服務調用代碼寫死,下面是例子

//配置類注冊restTemplate的bean
@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
@Autowired
private RestTemplate restTemplate;
String url = "http://localhost:8081/user/"+order.getUserId();
User user = restTemplate.getForObject(url,User.class);
order.setUser(user);

Eureka架構中,微服務角色有兩類

  • EurekaServer:服務端,注冊中心
    • 記錄服務信息
    • 心跳監控
  • EurekaClient:客戶端
    • Provider:服務提供者
      • 注冊自己的信息到EurekaServer
      • 每隔30秒向EurekaServer發送心跳
    • consumer:服務消費者
      • 根據服務名稱從EurekaServer拉去服務列表
      • 基于服務列表做負載均衡,選中一個微服務后發起遠程調用

2.1.Eureka作用

在這里插入圖片描述

  • 消費者如何獲取服務提供者具體信息?
    • 提供者啟動時向eureka注冊自己的信息
    • eureka保存這些信息
    • 消費者根據服務名稱向eureka獲取提供者信息
  • 如果有多個服務提供者,消費者利用負載均衡算法,從服務器列表挑選一個
  • 消費者如何感知服務提供者健康狀態?
    • 提供者每30s想EurekaServer發送心跳請求,報告健康狀態
    • eureka會更新記錄服務器列表信息,不健康的會被刪除
    • 消費者就可以拉取到最新信息

2.2.搭建Eureak服務

流程:搭建注冊中心 --> 服務注冊 --> 服務發現

2.2.1.搭建Eureka服務

1.引入依賴,服務器依賴

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

2.加注解@EnableEurekaServer,表示啟用Eureka服務

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

3.編寫配置文件application.yml,把eureka注冊為服務

server:port: 10086 # 服務端口
spring:application:name: eurekaserver # eureka的服務名稱
eureka:client:service-url:  # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka

2.3.2.服務注冊

1.引入依賴,客戶端依賴

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

2.注冊服務,配置eureka地址

spring:application:name: userservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

2.3.3.服務發現(服務拉取)

1.添加依賴(消費者也要添加客戶端依賴)
2.配置文件(消費者也要添加到服務)
3.修改url路徑(服務拉取)

String url = "http://user-service/user/"+order.getUserId();User user = restTemplate.getForObject(url,User.class);order.setUser(user);

4.負載均衡@LoadBalanced

    //配置類注冊restTemplate的bean@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}

2.3.Eureka和Ribbon

Eureka是一個服務注冊和發現的組件,Ribbon是一個負載均衡的組件。
在這里插入圖片描述

負載均衡流程

在這里插入圖片描述

2.3.1.Ribbon負載均衡策略

負載均衡的規則都定義在IRule接口中,而IRule有很多不同的實現類:
在這里插入圖片描述
不同規則的含義如下:

內置負載均衡規則類規則描述
RoundRobinRule簡單輪詢服務列表來選擇服務器。它是Ribbon默認的負載均衡規則。
AvailabilityFilteringRule對以下兩種服務器進行忽略: (1)在默認情況下,這臺服務器如果3次連接失敗,這臺服務器就會被設置為“短路”狀態。短路狀態將持續30秒,如果再次連接失敗,短路的持續時間就會幾何級地增加。 (2)并發數過高的服務器。如果一個服務器的并發連接數過高,配置了AvailabilityFilteringRule規則的客戶端也會將其忽略。并發連接數的上限,可以由客戶端的..ActiveConnectionsLimit屬性進行配置。
WeightedResponseTimeRule為每一個服務器賦予一個權重值。服務器響應時間越長,這個服務器的權重就越小。這個規則會隨機選擇服務器,這個權重值會影響服務器的選擇。
ZoneAvoidanceRule以區域可用的服務器為基礎進行服務器的選擇。使用Zone對服務器進行分類,這個Zone可以理解為一個機房、一個機架等。而后再對Zone內的多個服務做輪詢。
BestAvailableRule忽略那些短路的服務器,并選擇并發數較低的服務器。
RandomRule隨機選擇一個可用的服務器。
RetryRule重試機制的選擇邏輯

默認的實現就是ZoneAvoidanceRule,是一種輪詢方案

2.3.2.Ribbon負載均衡配置

兩種方式的區別:

  • 代碼方式:全局配置,所有order的服務者都是這個配置,
  • 配置文件方式:給某個微服務配置負載均衡規則,比如只配置userservice服務
  1. 代碼方式:在order-service中的OrderApplication類中,定義一個新的IRule:
@Bean
public IRule randomRule(){return new RandomRule();
}
  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改規則:
userservice: # 給某個微服務配置負載均衡規則,這里是userservice服務ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡規則 

注意,一般用默認的負載均衡規則,不做修改。

2.3.3.饑餓加載

默認是懶加載:第一次使用才加載LoadBalanceClient
饑餓加載:啟動即加載

ribbon:eager-load:clients: - user-service   # 指定饑餓加載的服務名稱,多個就換行加 -enabled: true  # 開啟饑餓加載

3.Nacos注冊中心

Nacos是阿里巴巴的產品,現在是SpringCloud中的一個組件。相比Eureka功能更加豐富,在國內受歡迎程度較高。

3.1.服務注冊到nacos

在Nacos的GitHub頁面,提供有下載鏈接,可以下載編譯好的Nacos服務端或者源代碼:

GitHub主頁:https://github.com/alibaba/nacos

GitHub的Release下載頁:https://github.com/alibaba/nacos/releases

下載解壓到無中文無空格的目錄下,
啟動:cmd命令

startup.cmd -m standalone

1.引入依賴

在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依賴:

<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中的pom文件中引入nacos-discovery依賴:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:不要忘了注釋掉eureka的依賴。

2.配置nacos地址

在user-service和order-service的application.yml中添加nacos地址:

spring:cloud:nacos:server-addr: localhost:8848

注意:不要忘了注釋掉eureka的地址

3.2.服務分級存儲模型

一個服務有多個實例,同一個機房內的實例,劃分為一個集群
在這里插入圖片描述
一級:集群
二級:服務
三級:實例

3.2.1.配置集群

方法一:
修改user-service的application.yml文件,添加集群配置:

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ # 集群名稱

修改一個集群,啟動對應實例,再修改集群,再啟動實例,即可實現集群劃分配置。

方法二:
也可以修改服務的VM選項
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
在這里插入圖片描述

3.2.2.配置同集群優先的負載均衡

1.給消費者添加集群

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ # 集群名稱

2.在消費者yml文件中修改負載均衡規則

userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則 

3.3.配置權重

  • 權重在可以設置在0~1之間
  • 權重越高,被訪問的越多
  • 權重為零,不會被訪問

3.4.環境隔離

Nacos提供了namespace來實現環境隔離功能。例如開發環境和生產環境隔離

  • nacos中可以有多個namespace
  • namespace下可以有group、service等
  • 不同namespace之間相互隔離,例如不同namespace的服務互相不可見
  • 每個namespace有唯一的id

在這里插入圖片描述
在yml文件中,添加namespace的id

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填ID

3.5.Eureka和nacos的區別

在這里插入圖片描述

  • Nacos與eureka的共同點

    • 都支持服務注冊和服務拉取
    • 都支持服務提供者心跳方式做健康檢測
  • Nacos與Eureka的區別

    • Nacos支持服務端主動檢測提供者狀態:臨時實例采用心跳模式,非臨時實例采用主動檢測模式
    • 臨時實例心跳不正常會被剔除,非臨時實例則不會被剔除
    • Nacos支持服務列表變更的消息推送模式,服務列表更新更及時
    • Nacos集群默認采用AP(強調服務可用性)方式,當集群中存在非臨時實例時,采用CP(強調數據可靠性和一致性)模式;Eureka采用AP方式

Nacos的服務實例分為兩種l類型:

  • 臨時實例:如果實例宕機超過一定時間,會從服務列表剔除,默認的類型。

  • 非臨時實例:如果實例宕機,不會從服務列表剔除,也可以叫永久實例。
    配置一個實例為永久實例,yml文件添加以下配置

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

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

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

相關文章

TS基本語法

一、安裝 npm install -g typescript 或者 cnpm install -g typescript 或者 yarnlobal add typescript二、運行 tsc xxxx.ts注意&#xff1a;如果電腦上面沒有安裝過cnpm&#xff0c;請先安裝cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org注意&…

數字圖像處理-AWB跳變

1、自動白平衡&#xff08;AWB&#xff09;算法是相機中常用的圖像處理技術&#xff0c;它能夠自動調整圖像中的白平衡&#xff0c;使得圖像中的顏色更加真實、自然。然而&#xff0c;在實際應用中&#xff0c;AWB算法也存在著一些問題&#xff0c;例如AWB跳變&#xff08;Whit…

DevExpress WinForms數據編輯器組件,提供豐富的數據輸入樣式!(一)

DevExpress WinForms超過80個高影響力的WinForms編輯器和多用途控件&#xff0c;從屏蔽數據輸入和內置數據驗證到HTML格式化&#xff0c;DevExpress數據編輯庫提供了無與倫比的數據編輯選項&#xff0c;包括用于獨立數據編輯或用于容器控件(如Grid, TreeList和Ribbon)的單元格。…

云原生 envoy xDS 動態配置 java控制平面開發 支持restful grpc實現 EDS 動態endpoint配置

envoy xDS 動態配置 java控制平面開發 支持restful grpc 動態endpoint配置 大綱 基礎概念Envoy 動態配置API配置方式動靜結合的配置方式純動態配置方式實戰 基礎概念 Envoy 的強大功能之一是支持動態配置&#xff0c;當使用動態配置時&#xff0c;我們不需要重新啟動 Envoy…

spring boot 整合mongodb

1、安裝依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>2、配置數據庫連接 spring:data:mongodb:host: localhostport: 27017username: xxxxxxp…

2682. 找出轉圈游戲輸家

題目描述&#xff1a; n 個朋友在玩游戲。這些朋友坐成一個圈&#xff0c;按 順時針方向 從 1 到 n 編號。從第 i 個朋友的位置開始順時針移動 1 步會到達第 (i 1) 個朋友的位置&#xff08;1 < i < n&#xff09;&#xff0c;而從第 n 個朋友的位置開始順時針移動 1 步…

“華為杯”研究生數學建模競賽2018年-【華為杯】F題:中轉航班調度:從 MILP 模型到啟發式算法

目錄 摘 要 1 問題描述 2 模型假設 3 符號定義及數據預處理 3.1 符號定義

【廣州華銳視點】帆船航行VR模擬實操系統

帆船航行VR模擬實操系統由廣州華銳視點開發&#xff0c;是一種創新的教學工具&#xff0c;它利用虛擬現實技術&#xff0c;為學生提供了一個沉浸式的學習環境。通過這種系統&#xff0c;學生可以在虛擬的環境中進行帆船航行的實訓&#xff0c;從而更好地理解和掌握帆船航行的技…

Maven(四)常用命令大全

目錄 一、mvn 命令參數二、mvn 插件命令1.介紹2.查看插件的使用文檔3.常用的插件命令 官網地址&#xff1a; https://maven.apache.org/官方插件清單&#xff1a; https://maven.apache.org/plugins/index.html Maven 是一個強大的構建工具&#xff0c;它提供了許多命令來進行項…

使用Python統計字符內容的占比

說明&#xff1a;如果有自己動手做過字符動畫&#xff0c;會知道字符動畫的“靈動性”核心在于使用的字符集。 簡單來說&#xff0c;動畫轉為字符動畫&#xff0c;原理是將動畫轉為灰階圖&#xff0c;灰度范圍是0~255&#xff0c;然后將對應灰度的像素點轉為對應比值的字符。這…

linux github 倉庫管理常用操作

linux 的常用操作 linux 本地 ssh驗證連接github賬號本地倉庫連接遠程私有倉庫push/pull操作 Connecting to Github with ssh git local configuration If you are using git for the first time, configure the user name and email in the device. git config --global u…

R語言ggplot2 | R語言繪制物種組成面積圖(三)

&#x1f4cb;文章目錄 面積圖簡介準備數據集加載數據集數據處理數據可視化 利用R語言繪制物種組成圖。本文以堆疊面積圖的方式與大家分享。 面積圖簡介 面積圖又叫區域圖。它是在折線圖的基礎之上形成的, 它將折線圖中折線與自變量坐標軸之間的區域使用顏色或者紋理填充&…

設計模式之單例設計模式

單例設計模式 2.1 孤獨的太陽盤古開天&#xff0c;造日月星辰。2.2 餓漢造日2.3 懶漢的隊伍2.4 大道至簡 讀《秒懂設計模式總結》 單例模式(Singleton)是一種非常簡單且容易理解的設計模式。顧名思義&#xff0c;單例即單一的實例&#xff0c;確切地講就是指在某個系統中只存在…

【算法題】螺旋矩陣III (求解n階蛇形矩陣)

一、問題的提出 n階蛇形矩陣的特點是按照圖1所示的方式排列元素。n階蛇形矩陣是指矩陣的大小為nn&#xff0c;其中n為正整數。 題目背景 一個 n 行 n 列的螺旋矩陣可由如圖1所示的方法生成&#xff0c;觀察圖片&#xff0c;找出填數規律。填數規則為從 1 開始填到 nn。 圖1 …

【配置環境】Linux下安裝MySQL

目錄 一&#xff0c;環境 二&#xff0c;安裝步驟 1.使用包管理器安裝MySQL 2.配置MySQL的安全選項 3.設置root用戶使用密碼進行身份驗證&#xff08;可選&#xff09; 三&#xff0c;拓展知識 1.如何修改MySQL的密碼策略&#xff1f; 2.實現連接MySQL數據庫的測試代碼…

TiDB基礎介紹、應用場景及架構

1. 什么是newsql NewSQL 是對各種新的可擴展/高性能數據庫的簡稱&#xff0c;這類數據庫不僅具有NoSQL對海量數據的存儲管理能力&#xff0c;還保持了傳統數據庫支持ACID和SQL等特性。 NewSQL是指這樣一類新式的關系型數據庫管理系統&#xff0c;針對OLTP&#xff08;讀-寫&…

經驗分享:企業數據倉庫建設方案總結!

導讀 在企業的數字化轉型浪潮中&#xff0c;數據被譽為“新時代的石油”&#xff0c;而數據倉庫作為數據管理與分析的核心基礎設施&#xff0c;在企業的信息化建設中扮演著重要的角色。本文將深入探討企業數據倉庫建設過程中所遇到的問題以及解決經驗&#xff0c;為正在籌備或…

進程/線程上下文切換會用掉你多少CPU?

進程是操作系統的偉大發明之一&#xff0c;對應用程序屏蔽了CPU調度、內存管理等硬件細節&#xff0c;而抽象出一個進程的概念&#xff0c;讓應用程序專心于實現自己的業務邏輯既可&#xff0c;而且在有限的CPU上可以“同時”進行許多個任務。但是它為用戶帶來方便的同時&#…

嵌入式Linux Qt5 (C++)開發欄目概述

本欄目開始介紹Linux系統下的Qt C程序開發&#xff0c;資源是以嵌入式為切入點&#xff08;現在Linux系統下的Qt C程序開發好像就是應用于嵌入式&#xff09;&#xff0c;那就跟著一起學習Linux系統下的Qt C程序開發知識&#xff0c;再擴展一下嵌入式的知識吧。我這里默認已經熟…

php初解

php是什么&#xff1f; PHP&#xff0c;全稱 Hypertext Preprocessor &#xff0c;中文翻譯“超文本預處理器”。 PHP是一種被廣泛應用的開源通用腳本語言&#xff0c;尤其適用于 Web 開發。 擁有快速&#xff0c;靈活&#xff0c;實用的特點&#xff0c;PHP能做任何事&#xf…