SpringCloud 微服務框架

單體架構:將業務全部功能集中到一個項目中,打成一個war包存儲,部署在一臺服務器中,只有一個數據庫

優點 :架構簡單,部署成本低。適合小型項目

問題:高并發性能問題,開發時代碼耦合問題,部署升級時停服的問題

垂直架構:拆分模塊,每個模塊使用自己的數據庫,如果有模塊需要其他模塊數據時需要自己查對方模塊數據庫

問題:大量代碼冗余,系統難以維護,性能問題,部署問題

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

服務之間相互調用,分布式多節點部署

優點:降低耦合,有利于服務升級和拓展 適合大型互聯網項目

缺點:服務調用關系錯綜復雜

在進行服務拆分的時候要考慮很多問題:服務拆分的粒度如何界定,服務之后如何調用,服務的調用關系如何管理,需要指定一套有效的標準來約束分布架構

微服務

架構特點:1.單一職責,每一個服務對應唯一的業務能力,做到單一職責

2.自治,團隊獨立,技術獨立,數據獨立,獨立部署和交付

3.面向服務,服務提供統一的接口,與語言技術無關

4.隔離性強,服務調用做好隔離,容錯,降級避免出現級聯問題(級聯故障是由于正反饋循環并且隨著時間的增加所產生的故障。典型表現:最初由單個節點或子系統故障觸發的連鎖反應)

微服務的上述特點給分布式架構制定啦一個標準,進一步降低服務之間的耦合,提供服務的獨立性和靈活性。微服務是一種經過良好架構設計的分布式架構方案

微服務技術的對比

SpringCloud微服務框架

官網地址:Spring Cloud

開發springcloud組件的組織:spring社區,alibaba,netflix

springCloud集成了各種微服務功能組件,基于SpringBoot實現組件的自動裝配

常見的組件:服務注冊發現(Eureka,nacos,consul),服務遠程調用(OpenFeign,Dubbo),服務鏈路監控(Zipkin,Sleuth),統一配置管理(SpringCloudConfig,nacos),統一網關路由(SpringCloudGateway,zuul),流控降級保護(Hystix,Sentinel)

SpringCloud底層是依賴于SpringBoot的,并且有版本兼容關系

服務拆分原則:1.不同微服務不用重復開發相同業務

2.微服務數據獨立,有自己的數據庫

3.微服務可以將自己的業務暴露為接口,供其他微服務使用

遠程調用

微服務的調用方式:基于RestTemplate發起的http請求實現遠程調用,http請求做遠程調用只要知道ip,端口,接口路徑,請求參數即可。

步驟:1.注冊RestTemplate的實例到Spring容器

2.修改消費者order-service服務中的OrderService類中的queryOrderById方法,根據Order對象中的userId查詢User

3.將查詢到的User填到Order對象

#在order-service服務中的OrderApplication啟動類中,注冊RestTemplate實例
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
#修改order-service服務中的OrderService類中的queryOrderById方法
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查詢訂單Order order = orderMapper.findById(orderId);//2查詢用戶String url="http://userservice/user/"+order.getUserId();User user = restTemplate.getForObject(url, User.class);// 3封裝user信息order.setUser(user);// 4.返回return order;}
}

在服務調用關系中,會有兩個不同的角色,這兩個角色是相對的

服務提供者Provider:一次業務中,被其他微服務調用的服務,提供接口給其他服務

服務消費者consumer:一次業務中,調用其他微服務的服務,調用其他微服務提供的接口

注冊中心

解決問題:服務注冊與發現(服務治理問題)

Eureka注冊中心

EurekaServer:服務端,注冊中心

EurekaClient:客戶端

服務注冊:提供者啟動之后將自己的信息注冊到eureka-server(Eureka服務端)

eureka-server保存服務名稱到服務實例地址列表的映射關系

服務拉取:消費者根據服務名稱拉取實例地址列表(注冊表)并緩存到本地

消費者根據負載均衡算法選中一個實例地址,發起遠程調用

健康檢查:提供者每隔一段時間(默認30秒)向eureka-server發起請求,報告自己狀態。稱為心跳

當超過一段時間(90秒)沒有發送心跳,eureka-server認為微服務實例故障,將該實例從列表中剔除,拉取服務時,該故障實例排除

搭建eureka-server

1.引入依賴

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

2.編寫啟動類

@SpringBootApplication
@EnableEurekaServer    //開啟eureka的注冊中心功能
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}

3.編寫配置文件application.yml

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

啟動成功

服務注冊

引入依賴

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

配置文件

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

可以將user-service多次啟動,模擬多實例部署,注意修改端口設置-Dserver.port=自定義的端口號

如果沒有service選項【IDEA】idea打開新項目,左下角的工作欄中沒有顯示Services解決辦法 - Angel擠一擠 - 博客園

在order-service完成服務拉取,修改OrderService的代碼,修改訪問路徑

在order-service項目的啟動類OrderApplication中RestTemplate添加負載均衡諸界

    @Bean@LoadBalanced    //負載均衡注解public RestTemplate restTemplate(){return  new RestTemplate();}

負載均衡

SpringCloud底層利用Ribbon的組件,實現負載均衡。服務調用者動態調用服務提供者的多個節點

Ribbon內部就是集成了LoadBalancerClient負載均衡,通過@LoadBalance注解開啟負載均衡器。

基本流程:RibbonLoadBalanceClient從請求url中獲取服務名稱,DynamicServerListLoadBalancer根據服務名稱到eureka拉取服務列表eureka返回服務列表,IRule利用內置的負載均衡規則從列表中選擇一個服務,返回給RibbonLoadBalanceClient

Ribbon的負載均衡規則時一個叫IRule的接口來定義的,每一個接口就是一種規則

內置的負載均衡規則:

RoundRobinRule 簡單的輪詢服務列表來選擇服務器,Ribbon默認的負載均衡規則

ZoneAvoidanceRule 以區域可用的服務器為基礎進行服務器的選擇

默認的實現就是ZoneAvoidanceRule,是一種輪詢方案(一般使用默認的負載均衡規則,不修改)

Ribbon采用默認的懶加載,第一次訪問才會去創建LoadBalanceClient,請求時間會很長。

Nacos注冊中心

Nacos是阿里巴巴的產品,現在是SpringCloudAlibaba中的一個組件(SpringCloudAlibaba實現啦對SpringCloud組件進行擴展)

與Eureka的差異:依賴不同,服務地址不同

Nacos服務搭建,下載安裝包,解壓,在bin目錄下運行startup.cmd -mstandalone

引入依賴,在父工程里面,引入

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

在服務消費者和提供者的pom文件引入nacos的依賴,注釋掉eureka的依賴

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

配置nacos地址,在user-service和order-service的application.yml中添加nacos地址,不要忘了注釋掉eureka的地址

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

在啟動類添加注解@EnableDicoveryClient

Nacos服務分級存儲模型

一個服務有多個實例,實例分布在不同的機房中,Nacos將同一機房的實例劃分為一個集群

服務-集群-實例

服務調用盡可能選擇本地集群的服務,跨集群調用延遲較高。(本地集群不可訪問時,在訪問其他集群)

給user-service配置集群,修改user-service的application.yml文件

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

復制一個user-service啟動配置,添加屬性

-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

默認的zoneAvoidanceRule不能實現同集群有效實現負載均衡,Nacos中提供了一個NacosRule的實現,可以優先從同集群中挑選實例。

修改負載均衡規則修改order-service的application.yml文件,修改負載均衡規則:

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

根據權重負載均衡:在實際部署中提高權重配置來控制訪問頻率,權重高訪問頻率高

在Nacos控制臺設置實例的權重值0~1之間

環境隔離namespace

Nacos中服務存儲和數據存儲的最外層都是一個namespace的東西,用做最外層隔離,修改order-service的application.yml文件:

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

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

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

非臨時實例:如果實例宕機,不會從服務列表中剔除,也叫永久實例

Nacos和Eureka的區別:

相同點:都支持服務注冊和服務拉取,都支持服務提供者心跳方式做健康檢測

區別:1.Nacos支持服務端主動檢測提供者狀態:臨時實例采用心跳檢測,非臨時實例nacos主動詢問

2.臨時實例心跳不正常被剔除,非臨時實例則不會剔除

3.Nacos支持服務禮包變更的消息推送模式,服務列表更新更及時

4.Nacos集群默認采用AP方式,集群中存在非實例時采用CP模式;Eureka采用AP模式

CAP定理:布魯爾定理

指出對于一個分布式計算機來說,不可能同時滿足三點,最多同時滿足兩點:

一致性(Consistency)系統中所有數據備份,在同一時刻同樣的值

可用性(Availability)保證每次請求不管成功失敗都有響應

分區容錯性(Partition tolerance)系統中任意信息的丟失或失敗不會影響系統的繼續運作

配置中心

配置統一管理和配置隔離問題

nacos=SpringCloud eureka注冊中心+SpringCloud config配置中心

項目的核心配置,需要熱更新的配置才有放到nacos管理的必要。基本不會變更的一些配置還是保存在微服務本地比較好。(熱加載:不重啟一個項目,使得部分代碼更新,通過java類加載器實現)

保證項目中有bootstrap.yml

微服務要拉取nacos中管理的配置,并且與本地的application.yml配置合并,才能完成項目啟動

在bootstrap.yml中提那就配置中心相關內容:環境相關spring.profiles.active

配置中心地址,配置文件后綴

配置加載順序:先加載共享配置文件,再加載環境相關配置文件,在加載application.yml

在idea中的使用

導入依賴

<!--nacos配置管理依賴-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

添加bootstrap.yaml

spring:application:name: userservice # 服務名稱profiles:active: dev #開發環境,這里是dev cloud:nacos:server-addr: localhost:8848 # Nacos地址config:file-extension: yaml # 文件后綴名
配置熱更新

最終目的,是修改nacos中的配置后,微服務無需重啟就可以讓配置生效(配置熱更新)

使用兩種方式:

一:@Value注入的變量所在類上添加注解@RefreshScope:

二: 在controller中使用@ConfigurationProperties注解代替@Value注解。

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

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

相關文章

goLand導入git項目并打包發布linux

作為項目管理&#xff0c;擁有半吊子開發能力&#xff0c;居然有一天需要修改維護go項目。。。從菜鳥教程學習開始~苦 goland導入git項目 本地啟動 導入之后會自動更新相關依賴。 本人導入之后立馬修改了依賴位置&#xff0c;且修改為一項目一位置&#xff0c;互不干涉。 在代…

通義靈碼插件安裝入門教學 - IDEA(安裝篇)

在開發過程中&#xff0c;使用合適的工具和插件可以極大地提高我們的工作效率。今天&#xff0c;我們將詳細介紹如何在 IntelliJ IDEA 中安裝并配置通義靈碼插件&#xff0c;這是一款旨在提升開發者效率的實用工具。無論你是新手還是有經驗的開發者&#xff0c;本文都將為你提供…

【設計模式精講】開源實戰之剖析Spring框架:Spring中工廠模式的應用

文章目錄 第七章 開源實戰7.1 剖析Spring框架中用到的經典設計模式7.1.1 Spring中工廠模式的應用7.1.1.1 Spring中的Bean組件7.1.1.2 Spring中的BeanFactory7.1.1.3 Spring中的FactoryBean 個人主頁&#xff1a;道友老李 歡迎加入社區&#xff1a;道友老李的學習社區 第七章 開…

[數據結構]用棧實現隊列

思路分析 代碼實現&#xff1a; typedef int STDataType; typedef struct Stack {int* a;int top;//下標int capacity; }ST; //棧的初始化 void STInit(ST* ps); //棧的插入 void STPush(ST* ps, STDataType x); //棧的刪除 void STPop(ST* ps); // int STSize(ST* ps); //判斷…

C++ 17 允許在 for 循環,if 語句,switch 語句中初始化變量

看到 c 有這個特性&#xff0c;python 和 java 似乎都沒有&#xff0c;根據 AI 的回答進行了一些整理總結。 文章目錄 **1. 在 for 循環中初始化變量****特點****多個變量初始化** **2. 在 if 語句中初始化變量&#xff08;C17 及以上&#xff09;****示例****特點** **3. 在 s…

【云原生之kubernetes實戰】在k8s環境中高效部署Vikunja任務管理工具(含數據庫配置)

【【云原生之kubernetes實戰】在k8s環境中高效部署Vikunja任務管理工具(含數據庫配置) 前言一、Vikunja介紹1.1 Vikunja簡介1.2 Vikunja主要特點1.3 使用場景二、相關知識介紹2.1 本次實踐存儲介紹2.2 k8s存儲介紹三、本次實踐介紹3.1 本次實踐簡介3.2 本次環境規劃3.3 部署前…

分享一個常用的命名規則和Spring的命名風格

目錄 Spring 命名風格規范總結表 常用代碼命名單詞&#xff08;通用且專業&#xff09; 命名技巧 一、返回布爾值的方法 二、條件執行方法 三、異步處理方法 四、回調方法 五、集合操作方法 六、狀態校驗方法 七、對象生命周期方法 八、數據操作方法 Spring 命名風格規…

【Golang學習之旅】Go-zero + Gen:如何使用 Gen 提升 Go 開發效率

文章目錄 前言一、Go-zero簡介二、Gen工具簡介2.1 Gen的功能與特點2.2 Gen的工作原理 三、Go-zero Gen&#xff1a;結合的優勢3.1為什么選擇Go-zero與Gen3.2 Gen的代碼生成與Go-zero的結合點 四、實際案例&#xff1a;Go-zero Gen的應用4.1 構建一個用戶管理系統4.2 定義Gen配…

軟件工程----統一過程模型RUP

統一過程RUP是一種以用例驅動、以體系結構為核心、迭代和增量的軟件開發過程&#xff0c;由UML方法和工具支持&#xff0c;廣泛應用于各類面向對象項目。 RUP本身支持可裁剪性&#xff0c;可應付給類領域軟件和不同的項目規模 RUP蘊含了大量優秀的實踐方法&#xff0c;如&…

48V電氣架構全面科普和解析:下一代智能電動汽車核心驅動

48V電氣架構&#xff1a;下一代智能電動汽車核心驅動 隨著全球汽車產業邁入電動化、智能化的新時代&#xff0c;傳統12V電氣系統逐漸暴露出其無法滿足現代高功率需求的不足。在此背景下&#xff0c;48V電氣架構應運而生&#xff0c;成為現代電動汽車&#xff08;EV&#xff09…

圖數據庫 | 24、如何進行正確性驗證?

圖數據庫計算和查詢結果的正確性&#xff0c;這個重要性當然是不言而喻的&#xff01; 老夫之前也寫文章講過&#xff0c;今天再手書一篇&#xff0c;旨在向大家系統地介紹一下圖數據庫查詢與計算到底如何進行正確性驗證&#xff01;&#xff01;&#xff01; 圖數據庫中的操…

Rust ~ Vec<u8>和[u8]

Vec<u8> 和 &[u8] 是兩種不同的數據類型&#xff0c;它們都與字節序列相關&#xff0c;但在所有權、內存管理、使用場景等方面存在明顯區別 類型本質 Vec<u8>&#xff1a;Rust 中的動態數組類型&#xff0c;即向量&#xff08;vector&#xff09;。它是一個擁…

MYSQL學習筆記(十):約束介紹(如:非空、唯一、主鍵、外鍵、級聯、默認、檢查約束)

前言&#xff1a; 學習和使用數據庫可以說是程序員必須具備能力&#xff0c;這里將更新關于MYSQL的使用講解&#xff0c;大概應該會更新30篇&#xff0c;涵蓋入門、進階、高級(一些原理分析);這一篇講解“約束”&#xff0c;如&#xff1a;非空、唯一、主鍵、外鍵、級聯、默認…

樹莓百度百科更新!宜賓園區業務再添新篇

樹莓集團宜賓園區業務不斷拓展&#xff0c;主要體現在以下幾個方面&#xff1a; 產業布局 -聚焦數字經濟核心領域&#xff1a;涵蓋軟件開發、人工智能、大數據等&#xff0c;吸引眾多上下游企業入駐&#xff0c;形成從芯片研發、軟件開發到系統集成的完整產業鏈條。 -推進“雙…

Halcon 學習之路 set_grayval 算子

gen_imag_const 創建灰度圖像 gen_image_const(Image&#xff0c;Type&#xff0c;Width&#xff0c;Height) 算子gen_image_const創建指定大小的圖像&#xff0c;圖像的寬度和高度由Width和Height決定 Type 像素類型 byte :每像素1字節&#xff0c;無符號&#xff08;0-255&…

03_pyqt5 + vlc 實現視頻播放器

1.功能需求如圖 按鈕: 播放/暫停, 前進/后退, 視頻上一個/下一個, 打開視頻進度條: 視頻進度條顯示, 進度條拖拽, 音量控制按鍵控制: 1,2,3,4縮放畫面大小, 2.方案選擇 開發語言: python UI界面: pyqt5 qt_designed 設計ui布局 視頻編碼: python-vlc 方案說明: 視頻解碼可…

使用vscode導出Markdown的PDF無法顯示數學公式的問題

我的硬件環境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF來導出md文件對應的PDF。但不管導出html還是PDF文件&#xff0c;數學公式都是顯示的源代碼。 我看了許多教程&#xff0c;給的是這個方法&#xff1a;在md文件對應的html文件中加上以下代碼&#xff1a…

Java 網絡編程(二)—— TCP流套接字編程

TCP 和 UDP 的區別 在傳輸層&#xff0c;TCP 協議是有連接的&#xff0c;可靠傳輸&#xff0c;面向字節流&#xff0c;全雙工 而UDP 協議是無連接的&#xff0c;不可靠傳輸&#xff0c;面向數據報&#xff0c;全雙工 有連接和無連接的區別是在進行網絡通信的時候&#xff0c;…

MySQL 事務筆記

MySQL 事務筆記 目錄 事務簡介事務操作事務四大特性并發事務問題事務隔離級別總結 事務簡介 事務&#xff08;Transaction&#xff09;是數據庫操作的邏輯單元&#xff0c;由一組不可分割的SQL操作組成。主要用于保證&#xff1a; 多個操作的原子性&#xff08;要么全部成功…

GPT1 與 GPT2 的異同

1.什么是GPT1&#xff1a; GPT1介紹了一種通過生成式預訓練&#xff08;Generative Pre-Training&#xff09;來提升語言理解能力的方法。這種方法首先在一個大型的未標注文本語料庫上進行語言模型的預訓練&#xff0c;然后針對具體的任務進行判別式微調&#xff08;discrimin…