【Day02】Spring Cloud組件的使用--Nacos配置中心、sentinel流量控制、服務網關Gateway、RocketMQ、服務調用鏈路(Sleuth、zipkin)


今日內容

 一、配置中心

1、遺留問題

yml配置,每一次都需要重啟項目

需要不重啟項目拿到更新的結果

引出:配置中心

選擇:Spring Cloud Config組件 / Alibaba的Nacos(注冊中心、配置中心)

使用:Nacos可以同時當配置中心和注冊中心

查看 :默認8848端口,可以查看配置中心和注冊中心內容

 2、實際創建

 

 創建配置可以填寫yml名稱和內容

3、代碼使用新的配置

步驟:

(1)導入依賴--之前的是discovery,現在使用config包

(2)配置:當前項目的Nacos作為配置中心所在的地址

通常創建配置文件內部

 (6)寫注解

引入讓配置生效的依賴

 

 寫注解:加載想要使用外部配置文件的類上使用@RefreshScope注解

4、測試

 

 就能夠拿到配置的username:jack

5、實現功能

無需重啟項目就能對配置文件進行更改

同時可以對配置文件進行多次修改

 二、sentinel流量控制

1、遺留問題

 大量訪問接口的qps,會根據機器占用資源決定

需要對接口的流量進行控制(可以只讓某個接口一個單位訪問1000次)

解決方式:

  • 定義private int count = 0;被多個線程共享,就可以進行累加
  • 根據系統時間的計算,進行判斷
  • 超過閾值,給客戶端返回錯誤信息

原因:負載過大系統宕機,從而會影響上層服務(引起雪崩效應--影響上游服務)

下游服務不可用,級聯影響上游服務

解決【有對應組件對其進行實現】:

  • 上述代碼進行限流-避免服務不掛掉
  • 也可以降級--服務不可用,或希望其不可用,則調整其優先級 

2、以Sentinel舉例

Sentinel-server需要知道哪些服務要進行限流/降級

需要對其進行部署(jar包或源碼)

當前目錄輸入cmd

查看啟動日志,可以看到,默認綁定在8080端口

 sentinel-sentinel

需要先把需要被保護的服務接口信息上報到sentinel

3、步驟

(1)指定服務下引入依賴

 無需引入版本

(2)寫配置

在yml文件中

告訴項目,sentinel-server的位置 

 默認不用配置用戶名密碼

也可以自定義指定認證信息,如Nacos

(3)不需要寫注解

4、查看

實際上還沒有,所以會有懶加載機制

一下子寫入對sentinel-server壓力大

只有訪問了該資源,才會把接口信息寫入sentinel-server

 從而對其進行流量控制

 

可以捕獲錯誤信息,返回頁面給用戶【sentinel的github上面】

4、監控

 5、配置

 降級后,不再提供服務,可以指定時間,或異常數

對集群部署,也可以對熱點規則

 6、總結 

服務指定sentinel,進行懶加載方式進行流量控制

三、使用MQ進行流量削峰,緩存消息,解決並發量大的問題

1、存在問題

訂單服務中的creteOrder()使用OpenFeign的方式調用微服務時

如調用count-Service服務,調用余額deduct

調用pay-service#payMethod()

調用扣減庫存stroge-service#deduceKucun()

調用物流服務……

創建訂單調用許多服務

例如余額掛掉

不用立即減少余額,可以等恢復時再減少余額

解決:消息發到MQ,對應用解耦,降低容錯性【發到消息中間件,不用寫到一個方法中】

將同步調用變為異步調用,使用MQ完成解耦邏輯

流量削峰:某個服務(userservice並發量大時),超過qps值,可以使用sentinel進行限流(提示客戶端返回錯誤信息)

現在:使用MQ,qps=5000超過服務的1000,剩下4000對用戶體驗不好

請求不需要 落在userservice,從MQ中消費消息

 進入5000qps,出來1000qps,讓用戶等待

其他應用場景:數據分發

2、選型

阿里RocketMQ【火箭】、RabbitMQ【兔子,提升性能】、K‘afka咖負咖、Pulsar、ActiveMQ【積極的】等

開發語言:Java、erlang、Scala……

功能擴展性等不同維度,適用場景不同

選擇:RocketMQ

使用:觀察者模式

3、搭建架構

4、過程及步驟Apache RocketMQ

(1)搭建server--集群式部署

(2)啟動nameserver及broker

broker用於接收消息和處理消息

nameserver理解為RocketMQ的注冊中心

先啟動注冊中心nameserver,后啟動broker【綁定ip和端口,自動創建主題】

4、使用maven啟動dashboard項目

 查看默認主題

 可以自己創建主題,選擇生產者

 5、使用過程--原生的api

(1)引入依賴

 (2)使用demo測試--ProducerGroup

 

 broker注冊到nameserver上

異步生產消息、消費消息……操作

6、具體舉例

user-service作為生產者,order作為消費者

(1)導入依賴,可以指定版本

 (2)寫配置

指定nameserver,和注冊中心打交道

在user-service生產者中配置

 (3)寫注解--無

上述是針對producer

(4)編寫接口發送消息

 自動裝配RocketMQTemplate

spring boot對其進行了封裝

 

 指定主題,指定發消息的內容

 最終源碼是對原生api的封裝,即

 訪問時發送消息

7、消費者

(1)導入依賴

(2)寫配置

(3) 寫注解

獲取感興趣的消息

 

 (4)測試生產消費

 8、總結

優點:解耦、流量削峰

問題:

引入中間件,如果MQ掛掉,兩個服務無法直接通信;

使用中間件交互,復雜度高;

需要考慮重復消息,和消息是否丟失

四、網關

1、存在問題

微服務架構可以實現異步通信

 不同服務的入口,無需暴露給客戶端

解決:網關作為前置組件,做路由的轉發,轉發到后置服務-相當於Nginx的功能,更適用於java環境

功能:實現路由

2、選型--GateWay

 zuul:BIO同步阻塞

gateway:nio--同步非阻塞IO,適用於並發量比較高的場景

 可以實現具體路由的轉發

 3、使用GateWay 

(1)創建一個單獨的工程module

 並將依賴的版本與之前保持一致(gateway默認版本比較新)

特性:

支持服務的注冊發現

可以根據名稱拿到URL地址

需要在網關中整合Nacos的依賴

(2)配置

修改為yml文件

配置應用在注冊中心的名字

配置網關服務發現的能力Gateway-enable

 (3)使用

 定位網關、服務發現

有了服務發現的能力,就可以實現路由轉發

 

 Netty監聽到了端口

 (4)自定義路由規則

使用謂詞和過濾器完成操作

指定路由匹配的條件Predicts和Filters、uri

 4、其他功能

可以實現熔斷、限流、路徑重寫、用戶認證 、授權操作

五、鏈路追蹤

1、存在問題

訪問了一個鏈接,訪問了多個服務

即:記錄微服務的調用關系,以便后面對問題進行排查

方案:基於日志記錄的思想,使用組件記錄日志,或使用AOP切面自定義記錄日志

使用Spring Cloud Sleuth組件,進行日志記錄

 查看日志記錄的結果,使用zebkin進行圖形化展示

2、介紹

zebkin-server進行圖形化展示

(1)整合:在需要記錄日志的服務里面導入zebkin依賴,自動導入Sleuth組件

 (2)啟動java -jar zebkin

 

 默認9411端口

(3)寫配置

配置zebkin的位置

 將sleuth的采樣概率改為100%(默認10%)

 

 3、測試

重啟項目:my-gateway、userservice、order-service

可以通過鏈路追蹤到錯誤

 4、其他選型

zebkin+sleuth

 SkyWalking-功能強大,自動生成可視化圖表(Apache,國人使用Java開發的) 

可以搜索skywalking【支持ES、MySQL等】和sleuth的對比

 六、事務管理-SEATA

1、其他問題

 RPC/rest api調用時,需要保證事務性

方式:在當前類上添加@Transactional注解

源碼底層會根據注解得到動態代理類,並根據createOrder進行增強,使用AOP對事務進行管理

分布式環境:該注解失效,會生成動態代理實現類,但問題在於三個服務使用的不是同一個數據源

管理事務的前提:基於同一個connection

分布式事務的管理:參考Seata架構

2、Seata的介紹

 

 數據庫事務-JDBC事務-Spring事務-分布式事務

明天講原理,后天講容器化內容

今日內容總結

今天主要學到的組件和功能,包括配置中心(Nacos、Config),流量控制(sentinel),服務網關(GateWay、zuul),消息中間件(RocketMQ)、服務調用鏈路(zipkin+sleuth)、分布式事務(seata)
1、對於配置中心主要有Config組件和阿里巴巴的Nacos組件
而Nacos可以充當配置中心和注冊中心,所以使用了Nacos作為配置中心,默認端口是8848
配置中心主要實現不需要重啟項目,就能夠對配置文件進行修改

2、對於多個訪問接口的資源占用,可以對接口進行流量控制,可以對服務進行一個限流或者降級,但是使用自定義變量的方式進行判斷的話,可能會影響上層服務
因此使用了sentinel使用了懶加載的方式進行了流量控制,通過其圖形化界面,可以實現流量控制規則的定義,降級的規則,熱點的規則和授權的規則、熔斷、降級等功能,此外,還可以對服務的訪問量進行qps的監控同時可以對錯誤信息進行捕獲,返回自定義頁面。
3、使用了RocketMQ消息隊列進行流量的削峰和緩存,來解決並發量大的問題,實現流量控制,不會請求過多而導致大量的請求訪問失敗的問題,可以傳入消息隊列,讓請求進行等待,同時還有其他的場景,比如數據分發。通過圖形化管理界面,可以自己創建主題,選擇生產者,同時使用方法進行了測試,對於框架中使用了封裝好的包,配置好監聽的地址和端口以及主題后就可以發送消息了,發送到消息之后就能夠監聽到發送的消息

4、對於多個服務的入口,無需全部暴露給客戶端,可以使用服務網關進行路由的轉發,傳遞一個鏈接,將其轉發到后置的服務,與之前的nginx 進行對比,不是一個單獨的組件,更適用於開發環境,可以使用的選型包括zuulgateway,gateway是一個nio的路由,是用於並發量比較高的場景
如果使用GateWay的話,需要創建一個單獨的工程,並在配置文件里面配置好注冊中心,從而實現服務的發現及路由轉發。此外,還可以使用自定義的路由規則,通過謂詞和過濾器完成操作,實現指定路由的匹配,同時,GateWay還能實現熔斷、限流、重寫用戶認證以及授權等操作

5、對於多個服務之間的鏈路追蹤,可以使用日志記錄的思想進行日志記錄,使用了sleuth組件,該組件基於zipkin(包含sleuth)圖形化展示組件,當請求發生錯誤的時候,就可以根據zip kin追蹤到錯誤的來源,此外,除了zepkin之外,還有一些其他的組件也可以進行鏈路追蹤,比如skywalking以及阿里的鷹眼和大眾點評的cat
6、對於分布式事務管理,可以使用seata完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM