SpringCloud兩種注冊中心

SpringCloud

基本概念

系統架構

我們之前做的所有的項目都屬于單體架構,下面我們將要學習更適合大型項目的分布式架構

單體架構: 將業務的所有功能幾種在一個項目中開發,打成一個包部署。

優點:架構簡單、部署成本低
缺點:耦合度高

分布式架構: 根據業務功能對系統進行拆分、每個業務模塊作為獨立項目開發,稱為一個服務。

優點:降低服務耦合、有利于服務升級拓展。
缺點:架構復雜、運維、監控、部署難度高。

微服務

微服務是一種經過良好的架構設計的分布式架構方案。

微服務架構特征:

  • 單一職責:微服務拆分粒度更小,每一個服務都對應唯一的業務能力,做到單一職責。
  • 面向服務:微服務對外暴露業務接口
  • 自治:團隊獨立,技術獨立,數據獨立,部署獨立。
  • 隔離性強:服務調用做好隔離、容錯、降級,避免出現級聯問題

級聯問題常涉及數據的關聯性操作引發的一系列連鎖變化。

微服務結構:

最知名的兩種技術架構:SpringCloud、阿里巴巴Dubbo

SpringCloud集成了各種微服務功能組件。

并基于SpringBoot實現了這些組件的自動裝配,從而提供了良好的體驗。

服務的拆分總結:

  1. 不同微服務,不能重復開發相同業務。
  2. 微服務數據獨立,不能訪問其他微服務的數據庫。
  3. 微服務將自己的業務暴露為接口,供其他微服務使用。

遠程調用

案例:有兩個服務分別是用戶服務和訂單服務,要求根據訂單ID查詢訂單的同時,把訂單所屬的用戶信息一起返回。

前面知道不同服務之間數據庫互相獨立,所以我們就只能在后端再發一次http請求,去調用其他服務的接口。

這就需要在Java代碼中,發起HTTP請求,此處使用 RestTemplate

RestTemplate 是 Spring 框架提供的一個同步的 HTTP 客戶端工具,用于在 Java 應用程序中發送 HTTP 請求并處理響應。

// 我們需要在配置類中聲明一個Bean,啟動類也屬于配置類,所以此方法也可寫入啟動類中。/*** 創建RestTemplate并注入Spring容器* @return*/
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}

然后就可以在Java代碼中發送請求了

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查詢訂單Order order = orderMapper.findById(orderId);String url = "http://localhost:8081/user/" + order.getUserId();//使用RestTemplate發送請求,第一個參數為請求地址,第二個參數為序列化返回對象User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 4.返回return order;}
}

提供者與消費者

  • 服務提供者:一次業務中,被其它微服務調用的服務。(提供接口給其它微服務)
  • 服務消費者:一次業務中,調用其它微服務的服務。(調用其它微服務提供的接口)

服務調用關系:

  • 服務提供者:暴露接口給其他微服務調用
  • 服務消費者:調用其他微服務提供的接口
  • 提供者與消費者角色是相對的
  • 一個服務可以同時是服務提供者和服務消費者

Eureka注冊中心

前面書寫存在一些問題,有硬編碼的部分,請求地址是寫死了。

Eureka作用

消費者該如何獲取服務提供者具體信息?

  • 服務提供者啟動時向eureka注冊自己的信息
  • eureka保存這些信息
  • 消費者根據服務名稱向eureka拉取提供者信息

如果有多個服務提供者,消費者該如何選擇?

  • 服務消費者利用負載均衡算法,從服務列表中挑選一個

消費者如何感知服務提供者健康狀態?

  • 服務提供者會每隔30秒向 EurekaServer 發送心跳請求,報告健康狀態eureka會
  • 更新記錄服務列表信息,心跳不正常會被剔除
  • 消費者就可以拉取到最新的信息

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

EurekaServer : 服務端,注冊中心

  • 記錄服務信息
  • 心跳監控

EurekaClient : 客戶端

  • Provider:服務提供者,例如案例中的user-service
    • 注冊自己的信息到 Eureka Server
    • 每隔30秒向Eureka Server發送心跳
  • consumer:服務消費者,例如案例中的order-service
    • 根據服務名稱從Eureka Server拉取服務列表
    • 基于服務列表做負載均衡,選中一個微服務后發起遠程調用

搭建Eureka Server服務端

第一步:創建新的Maven模塊,引入eureka-server依賴

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

第二步:為啟動類添加啟動注解

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

第三步:添加配置信息

server:port: 10086
spring:application:name: eurekaservereureka:client:service-url: #eureka地址信息defaultZone: http://127.0.0.1:10086/eureka

注冊user-service

第一步:在需要注冊的服務中引入eureka-client依賴

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

第二步:在配置文件中,添加配置

spring:application:name: userservereureka:client:service-url: #eureka地址信息defaultZone: http://127.0.0.1:10086/eureka

同理也可以注冊order-service

復制服務,右鍵要copy的服務,點擊Copy Configuration
起一個名稱,然后在VM options中配置一個新的端口
-Dserver.port=8082

服務拉取

服務拉取是基于服務器名稱獲取服務列表,然后在對服務列表做負載均衡

  1. 修改OrderService的代碼,修改訪問的url路徑,用服務器名代替ip端口
String url = "http://userservice/user/" + order.getUserId();
  1. 在RestTemplate的Bean中,添加負載均衡注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}

Ribbon負載均衡

Nacos注冊中心

啟動方式:

startup.cmd -m standalone

服務注冊

在父工程中添加spring-cloud-alibaba的管理依賴

<!-- Nacos 管理依賴-->
<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>

注釋原有的eureka依賴,添加nacos的客戶端依賴

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

修改配置文件

spring:application:name: orderservicecloud:nacos:server-addr: localhost:8848 #nacos服務地址

Nacos服務分級存儲模型

一個服務可以有多個實例,大型公司會將實例部署在不同的服務器內。一個服務器機房就稱為一個集群。
服務調用盡可能調用本地集群的服務,跨集群調用延遲較高,只有當本地集群不可訪問時,再去訪問其他的集群。

配置服務集群屬性,修改yml

spring:cloud:nacos:server-addr: localhost:8848 # Nacos 服務端地址discovery:cluster-name: HB # 配置集群名稱,機房位置

如果想要設置優先訪問同集群服務,則需要修改負載均衡的IRule

userservice: # 要做配置的微服務名稱ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則

注意將user-service的權重都設置為1

小結NacosRule負載均衡策略:

  1. 優先選擇同集群服務實例列表
  2. 本地集群找不到提供者,才會到其他集群找,并且會報警告
  3. 確定了可用實例列表后,再采用隨機負載均衡挑選實例

根據權重負載均衡

實際部署中會出現這樣的場景:
服務器設備性能有差異,部分實例所在機器性能較好,另一些較差,我們希望性能好的機器承擔更多的用戶請求

Nacos提供了權重配置來控制訪問頻率,權重越大訪問頻率越高。
在Nacos控制臺可以設置實例的權重值,點擊編輯按鈕

小結:實例的權重控制

  1. Nacos控制臺可以設置實例的權重值,0~1之間
  2. 同集群內的多個實例,權重越高被訪問的頻率越高
  3. 權重設置為0則完全不會被訪問

環境隔離 - namespace

Nacos 中服務存儲和數據存儲的最外層都是一個名為namespace的東西,用來做最外層隔離
注意:服務只能訪問當前命名空間,無法訪問其他命名空間的服務

Namespace 下有 Group 下有 Service / Data

新建命名空間:在Nacos控制臺中 - > 命名空間 -> 新建命名空間
在代碼中修改服務到新的命名空間:

spring:cloud:nacos:server-addr: localhost:8848 #nacos服務地址discovery:cluster-name: HB # 集群名稱namespace: xxxx # 命名空間id

Nacos環境隔離

  1. namespace用來做環境隔離
  2. 每個namespace都有唯一id
  3. 不同namespace下的服務不可見

臨時實例與非臨時實例

服務注冊到Nacos時,可以選擇注冊為臨時或非臨時實例,通過下面的配置來設置

spring:cloud:nacos:server-addr:discovery:namespace:ephemeral: false #是否為臨時實例

臨時實例宕機時,會從nacos的服務列表中剔除,而非臨時實例則不會

與Eureka的對比

Nacos與eureka的共同點

  • 都支持服務注冊和服務拉取
  • 都支持服務提供者心跳方式做健康檢測

Nacos與Eureka的區別

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

AP 可用性保證
CP 一致性保證

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

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

相關文章

SpringAI 搭建智能體(二):搭建客服系統智能體

在現代人工智能應用中&#xff0c;智能體&#xff08;Agent&#xff09; 是一個重要的概念&#xff0c;它的核心能力是自主性與靈活性。一個智能體不僅能夠理解用戶的需求&#xff0c;還能拆解任務、調用工具完成具體操作&#xff0c;并在復雜場景中高效運行。在本篇博客中&…

SVN客戶端使用手冊

目錄 一、簡介 二、SVN的安裝與卸載 1. 安裝&#xff08;公司內部一般會提供安裝包和漢化包&#xff0c;直接到公司內部網盤下載即可&#xff0c;如果找不到可以看下面的教程&#xff09; 2. 查看SVN版本 ?編輯 3. SVN卸載 三、SVN的基本操作 1. 檢出 2. 清除認證數據 3. 提交…

HTML 文本格式化詳解

在網頁開發中&#xff0c;文本內容的呈現方式直接影響用戶的閱讀體驗。HTML 提供了多種文本格式化元素&#xff0c;可以幫助我們更好地控制文本的顯示效果。本文將詳細介紹 HTML 中的文本格式化元素及其使用方法&#xff0c;幫助你輕松實現網頁文本的美化。 什么是 HTML 文本格…

衡量算法性能的量級標準:算法復雜度

今天開始數據結構的學習&#xff01;作為一大重點&#xff0c;拿出態度很重要&#xff0c;想要真實掌握&#xff0c;博客筆記自然少不了&#xff01;重點全部上色&#xff01;避免疏忽 下面我們從0基礎開始學習今天的第一節&#xff01;不用擔心看不懂&#xff0c;拒絕枯燥的理…

Spring Boot Starter介紹

前言 大概10來年以前&#xff0c;當時springboot剛剛出現并沒有流行&#xff0c;當時的Java開發者們開發Web應用主要是使用spring整合springmvc或者struts、iBatis、hibernate等開發框架來進行開發。項目里一般有許多xml文件配置&#xff0c;其中配置了很多項目中需要用到的Be…

Java面試題2025-Spring

講師&#xff1a;鄧澎波 Spring面試專題 1.Spring應該很熟悉吧&#xff1f;來介紹下你的Spring的理解 1.1 Spring的發展歷程 先介紹Spring是怎么來的&#xff0c;發展中有哪些核心的節點&#xff0c;當前的最新版本是什么等 通過上圖可以比較清晰的看到Spring的各個時間版本對…

Linux 切換到 Root 用戶的方式及差異詳解

在 Linux 系統中&#xff0c;切換到 root 用戶進行管理和操作是常見需求。不同的切換方法會影響環境變量、工作目錄以及加載的配置文件。本文將介紹幾種常用的切換方式及它們的特點。 切換到 Root 用戶的主要方式 1. sudo su 這是通過 sudo 提權后調用 su 切換到 root 用戶的…

虹科分享 | 汽車NVH小課堂之聽音辨故障

隨著車主開始關注汽車抖動異響問題&#xff0c;如何根據故障現象快速診斷異響來源&#xff0c;成了汽修人的必修課。 一個比較常用的方法就是靠“聽”——“聽音辨故障”。那今天&#xff0c;虹科Pico也整理了幾個不同類型的異響聲音&#xff0c;一起來聽聽看你能答對幾個吧 汽…

淺談Redis

2007 年&#xff0c;一位程序員和朋友一起創建了一個網站。為了解決這個網站的負載問題&#xff0c;他自己定制了一個數據庫。于2009 年開發&#xff0c;稱之為Redis。這位意大利程序員是薩爾瓦托勒桑菲利波(Salvatore Sanfilippo)&#xff0c;他被稱為Redis之父&#xff0c;更…

element tbas增加下拉框

使用Tabs 標簽頁的label插槽&#xff0c;嵌入Dropdown 下拉菜單&#xff0c;實現Tabs 標簽頁增加下拉切換功能 Tabs 標簽頁 tab-click"事件"&#xff08;這個事件當中到擁有下拉框的tab里時&#xff0c;可以存一下Dropdown 第一個菜單的id&#xff0c;實現點擊到擁有…

SQL-leetcode—1179. 重新格式化部門表

1179. 重新格式化部門表 表 Department&#xff1a; ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中&#xff0c;(id, month) 是表的聯合主鍵。 這個表格有關…

【Address Overfitting】解決過擬合的三種方法

目錄 1. 收集更多數據實踐方法&#xff1a;適用場景&#xff1a;優缺點&#xff1a; 2. 特征選擇方法介紹&#xff1a;實踐示例&#xff1a;適用場景&#xff1a;優缺點&#xff1a; 3. 正則化&#xff08;Regularization&#xff09;正則化類型&#xff1a;實踐示例&#xff1…

面向通感一體化的非均勻感知信號設計

文章目錄 1 非均勻信號設計的背景分析1.1 基于OFDM波形的感知信號1.2 非均勻信號設計的必要性和可行性1.2 非均勻信號設計的必要性和可行性 3 通感一體化系統中的非均勻信號設計方法3.1 非均勻信號的設計流程&#xff08;1&#xff09;均勻感知信號設計&#xff08;2&#xff0…

【深度學習】搭建PyTorch神經網絡進行氣溫預測

第一步 數據加載與觀察 ①導包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline ②加載數據 features pd.read_csv(…

ESP8266 NodeMCU與WS2812燈帶:實現多種花樣變換

在現代電子創意項目中&#xff0c;LED燈帶的應用已經變得極為廣泛。通過結合ESP8266 NodeMCU的強大處理能力和FastLED庫的高效功能&#xff0c;我們可以輕松實現多達100種燈帶變換效果。本文將詳細介紹如何使用Arduino IDE編程&#xff0c;實現從基礎到高級的燈光效果&#xff…

pycharm踩坑(1)

由于我重裝系統&#xff0c;導致我的pycharm需要進行重裝&#xff0c;因此我覺得需要記錄一下&#xff0c;pycharm的正確使用方法 漢化 漢化很重要&#xff0c;除非你從小就雙語教學&#xff0c;不然你看著那些英文就是會消耗大量的精力 我使用的pycharm版本是pycharm-commun…

#HarmonyOS篇:build-profile.json5里面配置productsoh-package.json5里面dependencies依賴引入

oh-package.json5 用于描述包名、版本、入口文件和依賴項等信息。 {"license": "","devDependencies": {},"author": "","name": "entry","description": "Please describe the basic…

OpenCV2D 特征框架 (11)特征檢測與描述用于檢測二值圖像中連通區域(即“斑點”或“blob”)的類cv::SimpleBlobDetector的使用

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::SimpleBlobDetector 是 OpenCV 中用于檢測二值圖像中連通區域&#xff08;即“斑點”或“blob”&#xff09;的類。這些連通區域可以是白色前…

關于deepin上運行Qt開發的程序

國產化替代是將來各單位的主流趨勢&#xff0c;探索自行開發應用程序在國產操作系統上正常運行是將來的主要工作之一。本文淺嘗gui程序在統信社區版——deepin上遇到的小問題。 使用Qt在deepin上做了一個類似gif的幀動畫彈窗&#xff0c;在編譯運行時&#xff0c;程序可以正常…

Unity自學之旅05

Unity自學之旅05 Unity學習之旅⑤&#x1f4dd; AI基礎與敵人行為&#x1f94a; AI導航理論知識&#xff08;基礎&#xff09;開始實踐 &#x1f383; 敵人游戲機制追蹤玩家攻擊玩家子彈碰撞完善游戲失敗條件 &#x1f917; 總結歸納 Unity學習之旅⑤ &#x1f4dd; AI基礎與敵…