微服務03 微服務sentinel, springcloudgateway

战斗小人發表於2024-10-14

6 Sentinel

6.1 Sentinel 介紹和工作機制

6.1.1 微服務流量治理元件介紹

隨著微服務的流行,服務和服務之間的呼叫導致服務的穩定性問題變得越來越重要。
雪崩問題: 微服務呼叫鏈路中的某個服務故障,引起整個鏈路中的所有微服務都不可用,即雪崩。
解決雪崩問題的常見方式有四種:
1.超時處理:設定超時時間,請求超過一定時間沒有響應就返回錯誤資訊,不會無休止等待
2.流量控制:限制業務訪問的QPS,避免服務因流量的突增而故障。
3.熔斷降級:由斷路器統計業務執行的異常比例,如果超出閾值則會熔斷該業務,攔截訪問該業務的一切請求。
4.艙壁模式:限定每個業務能使用的執行緒數,避免耗盡整個tomcat的資源, 因此也叫執行緒隔離。

6.1.2 Sentinel 介紹

https://sentinelguard.io/zh-cn/

6.1.3 Sentinel 基本概念

#資源
資源在java中的資源一般是介面方法。通常就是一個URL,比如:/hello/get
#規則
圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整。

6.1.4 Sentinel 功能和設計理念

6.1.6 Sentinel 架構

6.1.7 Sentinel 的構成

Sentinel 的構成可以分為兩個部分:
核心庫(Java 客戶端):
    開發寫程式碼呼叫sentinel的庫
控制檯(Dashboard):
    運維部署控制檯,Dashboard 主要負責管理推送規則、監控、管理機器資訊等。

6.2 Sentinel 控制檯

6.2.2.1 Java 二進位制啟動控制檯

https://github.com/alibaba/Sentinel/releases
#直接下二進位制包如sentinel-dashboard-1.87.jar(jar命令直接跑), Source code為原始碼還要編譯

使用如下命令啟動控制檯:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
#-Dserver.port定義dashboard web介面埠(預設8858)
#-Dcsp.sentinel.dashboard.server自己作為微服務註冊到dashboard進行監控 -Dproject.name註冊的專案名

#從 Sentinel 1.6.0 起,Sentinel 控制檯引入基本的登入功能,預設使用者名稱和密碼都是 sentinel

範例: Java 包啟動控制檯

#安裝JDK8或以上版本
[root@ubuntu2204 ~]#apt update && apt -y install openjdk-8-jdk
[root@ubuntu2204 ~]#apt update && apt -y install openjdk-11-jdk

[root@ubuntu2204 ~]#wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
[root@ubuntu2204 ~]#java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

#瀏覽器使用預設使用者名稱和密碼sentinel登入訪問
http://10.0.0.151:8080/

docker網上有,但非官方版,很久沒更新了,建議自己製作

sentinel控制檯
#左側簇點鏈路:生成key訪問的路徑,如: http://10.0.0.151:8080/version

流量控制控制/version路徑
#可以在流量規則里加,但不夠快,直接在簇點鏈路下在/version下點選流控
#QPS  單向閾值1表示每秒鐘只能接受一個請求,超出就拒絕。點選新增會出現在流控規則中
此時訪問http://10.0.0.151:8080/version,就能看到失敗情況

#java程式可以呼叫sentinel,來控制流量
#java程式會在配置裡標註sentinel的地址,如果不想用java配置裡寫的sentinel地址,可以在啟動時引數修改
#如果臨時修改sentinel地址資訊,可以不用修改application.yml檔案重新編譯,直接新增下面選項再執行
[root@ubuntu2204 sentinel-sample]#java -Dspring.cloud.sentinel.transport.dashboard=10.0.0.100:8080 -jar target/sentinel-sample-0.0.1-SNAPSHOT.jar

7 Spring Cloud Gateway

7.1 Spring Cloud Gateway 介紹

7.1.1 什麼是 API 閘道器

API閘道器作用就是把各個微服務對外提供的API匯聚起來,讓外界看起來是一個統一的入口
同時還實現了微服務閘道器的額外功能, 包含:負載均衡、路由轉發、身份認證、許可權安全、請求限流、監控/指標等功能 

7.1.3 API 閘道器核心功能

#一般都是開發寫的排程規則
1.路由轉發
轉發後端服務去查nacos服務,如果有多個,配合nacos實現負載均衡,輪流發
2.過濾器
過濾器中預設提供了多種內建功能還支援額外的自定義功能。
比較常用的功能有閘道器的容錯、限流以及請求及相應的額外處理。

7.2 Spring Cloud Gateway 核心概念

7.2.1 Spring Cloud Gateway 相關概念介紹

Route 稱為路由,一個Gateway專案可以包含多個Route。
一個Route路由包含如下部分:
1.Route ID: 是自定的,路由的唯一標識
2.URI: 路由目的地,為一個地址, 支援 LB,http,websocket 
3.predicates: 路由斷言,判斷請求是否匹配和符合轉發規則的要求,如果符合則轉發到路由目的地
4.filters: 路由過濾器,對請求或響應進行過濾處理, 比如: 身份認證和許可權校驗限流限速,此為可選項

示例: 路由配置

#微服務專案中的application.yml內容
server:
 port: 10010 #閘道器埠
spring:
 application:
   name: gateway #服務名稱
 cloud :
   nacos:
     server-addr: localhost:8848 # nacos地址
   gateway:
     routes: #閘道器路由配置 (下面兩個路由)
      - id: user-service #路由id,自定義值,必須唯一
       uri: lb://userservice #路由的目標地址Lb表示負載均衡,後面跟Nacos中微服務名稱
        # uri: http://127.0.0.1:8081 #路由的目標地址,如果使用 http表示固定地址
       predicates: #路由斷言,判斷請求是否符合路由規則的條件
        - Path=/user/** #這個是按照路徑匹配,只要以/user/開頭就符合要求
      - id: order-service
       uri: lb://orderservice/order
       predicates: 
        - Path=/order/** 
       filters:
        - StripPrefix=1 #從請求路徑中刪除第一個字首/order,再轉發給後端

7.2.2 路由斷言工廠 Route Predicate Factory

#這些一般都是開發去呼叫,修改
路由斷言工廠 RoutePredicateFactory 包含的主要實現類如圖所示,包括 Datetime 、請求的遠端地址、路由權重、請求頭、Host 地址、請求方法、
請求路徑和請求引數等型別的路由斷言。

7.2.3 路由過濾器 Gateway Filter

Gateway Filter是閘道器中提供的一種過濾器,可以對進入閘道器的請求和微服務返回的響應做處理

7.2.4 過濾器工廠 GatewayFilterFactory

當前支援34類路由過濾器工廠,實現請求和響應的定製功能

7.3 Spring Cloud Gateway 開發

這是一個庫,需要java寫程式碼呼叫

相關文章