SpringClound——網關、服務保護和分布式事務

一、網關

網絡的關口,負責請求的路由、轉發、身份驗證

server:port: 8080
spring:cloud:nacos:discovery:server-addr: 192.168.96.129:8848gateway:routes:- id: item-serviceuri: lb://item-servicepredicates:- Path=/items/**,/search/**- id: user-serviceuri: lb://user-servicepredicates:- Path=/addresses/**,/users/**- id: cart-serviceuri: lb://cart-servicepredicates:- Path=/carts/**- id: trade-serviceuri: lb://trade-servicepredicates:- Path=/orders/**application:name: hm-gateway

二、網關登錄校驗

自定義過濾器:

package com.hmall.gateway.filters;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();System.out.println("GlobalFilter pre階段 執行了");return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

微服務項目網關:

package com.hmall.gateway.filters;import com.hmall.common.exception.UnauthorizedException;
import com.hmall.gateway.config.AuthProperties;
import com.hmall.gateway.utils.JwtTool;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.List;@Component
@RequiredArgsConstructor
public class AuthGlobalFilter implements GlobalFilter, Ordered {//不需要處理的請求路徑public final AuthProperties authProperties;public final JwtTool jwtTool;private final AntPathMatcher antPathMatcher = new AntPathMatcher();@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//獲得請求頭ServerHttpRequest request = exchange.getRequest();//放行不需要攔截的請求//路徑合法,需要放行if (isUnique(request.getPath().toString())){//合法,放行return chain.filter(exchange);}//判斷令牌是否合法String token=null;Long userId=null;List<String> authorization = request.getHeaders().get("authorization");if (authorization != null && authorization.size() > 0) {token = authorization.get(0);}try {userId = jwtTool.parseToken(token);}catch (UnauthorizedException e) {//401 未登錄、未授權ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}//TODO 保存用戶id到請求頭,實現多個微服務間用戶id的共享String userInfo = userId.toString();ServerWebExchange swe=exchange.mutate().request(builder -> builder.header("user-info", userInfo)).build();//System.out.println(userId);//放行return chain.filter(swe);}@Overridepublic int getOrder() {return 0;}private boolean isUnique(String path) {for (String excludePath : authProperties.getExcludePaths()) {if (antPathMatcher.match(excludePath, path)) {return true;}}return false;}
}

server:port: 8080
spring:application:name: hm-gatewaycloud:nacos:discovery:server-addr: 192.168.96.129:8848gateway:routes:- id: item-serviceuri: lb://item-servicepredicates:- Path=/items/**,/search/**- id: user-serviceuri: lb://user-servicepredicates:- Path=/addresses/**,/users/**- id: cart-serviceuri: lb://cart-servicepredicates:- Path=/carts/**- id: trade-serviceuri: lb://trade-servicepredicates:- Path=/orders/**- id: pay-serviceuri: lb://pay-servicepredicates:- Path=/pay-orders/**
hm:jwt:location: classpath:hmall.jksalias: hmallpassword: hmall123tokenTTL: 30mauth:excludePaths:- /search/**- /users/login- /items/**- /hi

網關傳遞用戶:將用戶的id保存在請求頭當中,通過統一攔截處理,獲取用戶的id,放入ThreadLocal當中;請求完成,清理ThreadLocal,實現用戶id從網關到各個項目模塊的傳遞

OpenFeign傳遞用戶:OpenFeign中提供了一個攔截器接口,所有由OpenFeign發起的請求都會先調用攔截器處理請求,在攔截處理過程中,我們將ThreadLocal中的用戶id放入OpenFeign的請求頭當中,其他微服務攔截處理的過程中獲得用戶id并放入線程當中

三、配置管理

1.拉取共享配置

2.加入相關依賴

        <!--nacos配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--讀取bootstrap文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

3.配置熱更新

(1)nacos中要有一個與微服務名有關的配置文件

(2)微服務中要以特定方式讀取需要熱更新的配置屬性

package com.hmall.cart.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "hm.cart")
public class MaxCommodityConfig {private Integer maxCommodity;
}

4.動態路由

package com.hmall.gateway.routes;
import cn.hutool.json.JSONUtil;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.Executor;@Component
@RequiredArgsConstructor
public class DynamicRounterLoader {private final NacosConfigManager nacosConfigManager;private final RouteDefinitionWriter writer;private final String dataId="gateway-routes.json";private final String group="DEFAULT_GROUP";//記錄路由的idprivate HashSet<String> set=new HashSet<String>();//在Bean初始化之后執行@PostConstructpublic void initRoutesConfigListener() throws NacosException {//拉取配置并更新配置String configInfo = nacosConfigManager.getConfigService().getConfigAndSignListener(dataId, group, 5000, new Listener() {@Overridepublic Executor getExecutor() {return null;}@Overridepublic void receiveConfigInfo(String configInfo) {//路由表更新,更新監聽器System.out.println(configInfo+"監聽器更新執行了");updateRouters(configInfo);}});System.out.println(configInfo+"監聽器更新了");//第一次啟動,更新監聽器updateRouters(configInfo);}private void updateRouters(String configInfo) {//將json數據轉換為實體類List<RouteDefinition> routeDefinitionList = JSONUtil.toList(configInfo, RouteDefinition.class);//刪除原來的路由表for (String id : set) {writer.delete(Mono.just(id)).subscribe();}set.clear();//添加新的路由表并記錄idfor (RouteDefinition routeDefinition : routeDefinitionList) {writer.save(Mono.just(routeDefinition)).subscribe();set.add(routeDefinition.getId());}}}

將yaml配置轉換為json配置:

[{"id": "item","predicates": [{"name": "Path","args": {"_genkey_0":"/items/**", "_genkey_1":"/search/**"}}],"filters": [],"uri": "lb://item-service"},{"id": "cart","predicates": [{"name": "Path","args": {"_genkey_0":"/carts/**"}}],"filters": [],"uri": "lb://cart-service"},{"id": "user","predicates": [{"name": "Path","args": {"_genkey_0":"/users/**", "_genkey_1":"/addresses/**"}}],"filters": [],"uri": "lb://user-service"},{"id": "trade","predicates": [{"name": "Path","args": {"_genkey_0":"/orders/**"}}],"filters": [],"uri": "lb://trade-service"},{"id": "pay","predicates": [{"name": "Path","args": {"_genkey_0":"/pay-orders/**"}}],"filters": [],"uri": "lb://pay-service"}
]

三、服務保護和分布式事務

1.雪崩問題

微服務調用鏈路中的某個服務故障,引起整個鏈路中的所有微服務都不可用

解決方案:保證代碼的健壯性、保證網絡的暢通、能應對高并發請求

2.服務保護

請求限流:限制訪問服務器的并發量,避免服務因流量激增出現故障

線程隔離:模擬船艙隔板的防水原理。通過限定每個業務能使用的線程數量而將故障業務隔離,避免故障擴散

服務熔斷:由斷路器統計請求的異常比例或慢調用比例,如果超出閾值則會熔斷業務,則攔截該接口請求

3.分布式事務

事務協調者(TC):維護全局和分支事務的狀態,協調全局事務提交和回滾

事務管理器(TM):定義全局事務范圍、開始全局事務、提交或回滾全局事務

資源管理器(RM):管理分支事務,與TC交談以注冊分支事務和報告分支事務狀態

XA模式:

優點:事務的強一致性,滿足ACID原則?,常用數據庫都支持,實現簡單,并且沒有代碼侵入

缺點:因為一階段需要鎖定數據庫資源,等待二階段結束才釋放,性能較差?,依賴關系型數據庫實現事務?

AT模式:

優點:滿足ACID原則?,常用數據庫都支持,實現簡單,并且沒有代碼侵入,單個RM完成之后進行事務的提交,不占用資源,提高了性能

缺點:難以實現復的事務控制,如特定隔離級別;當事務的隔離級別過低時會出現臟讀、不可重復讀、幻讀問題


?

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

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

相關文章

【C++】模版(初階)

目錄 一. 函數模版 1. 格式 原理 2. 函數模版的實例化 二. 類模板 void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double temp left;left right;right temp; }void Swap(char&…

InfluxDB 開發工具鏈:IDE 插件與調試技巧(二)

四、利用 IDE 插件提升開發效率 4.1 代碼編寫技巧 在使用安裝了 InfluxDB 插件的 IDE 進行代碼編寫時&#xff0c;我們可以充分利用插件提供的代碼導航和智能提示功能&#xff0c;來顯著提高編寫 InfluxDB 相關代碼的效率和準確性。 以一個涉及多個 Measurement 和復雜查詢條…

定制開發開源AI智能名片S2B2C商城小程序:場景體驗新維度與四重目標達成

摘要&#xff1a;本文聚焦于定制開發開源AI智能名片S2B2C商城小程序&#xff0c;探討其在場景體驗領域的應用與價值。通過深入分析場景體驗的最高境界——深體驗、強認知、高傳播、關系深化這四個目標&#xff0c;闡述該小程序如何憑借自身特性與功能&#xff0c;在商業場景中實…

開源 GIS 服務器搭建:GeoServer 在 Linux 系統上的部署教程

GeoServer 是一個開源的地理信息服務服務器&#xff0c;可以發布地圖、矢量數據和柵格數據。 1. 更新系統 sudo apt update && sudo apt upgrade -y2. 安裝 Java 11 GeoServer 需要 Java 運行環境&#xff0c;這里用 OpenJDK 11。 sudo apt install openjdk-11-jdk…

前端面試通關:Cesium+Three+React優化+TypeScript實戰+ECharts性能方案

前端面試題詳解與更多面試題 WebGLCesiumThree 1. 自我介紹 回答要點&#xff1a; 教育背景和工作經驗技術棧和專長領域參與過的重點項目個人優勢和學習能力職業規劃 示例&#xff1a; “我是一名有前端開發經驗的工程師&#xff0c;熟練掌握React、Vue等主流框架&#x…

集成電路學習:什么是Object Tracking目標跟蹤

Object Tracking:目標跟蹤 Object Tracking,即目標跟蹤,是計算機視覺領域的一個重要研究方向,它專注于在視頻幀序列中連續地監測和定位一個或多個目標對象的位置。以下是對目標跟蹤技術的詳細解析: 一、定義與目的 定義: 目標跟蹤是指在視頻序列中,通過特定的算法…

深入理解計算機系統

參考書籍 8-18 處理器體系結構不同于馮諾依曼與哈佛體系 壓棧與退棧與理解c等高級語言的工作原理息息相關&#xff0c;也是常用的攻擊手段 Buffer Overflow的主要技術基礎 day2 繼續讀前言之類的 本書前言 這本書&#xff0c;講述應用程序員如何能夠利用系統知識來編寫更好…

LLM 中 token 簡介與 bert 實操解讀

一、什么是 LLM&#xff1f; LLM&#xff0c;全稱為 Large Language Model&#xff08;大語言模型&#xff09;&#xff0c;是一種基于神經網絡&#xff08;主要是 Transformer 結構&#xff09;的大規模自然語言處理&#xff08;NLP&#xff09;模型。其核心能力在于理解、生成…

【運維心得】三步更換HP筆記本電腦外殼

目錄 準備工作 第一步&#xff1a;拆卸電池與后蓋 第二步&#xff1a;處理隱藏螺絲 第三步&#xff1a;斷開內部排線 總結一下 今天又碰到了兩臺HP的筆記本&#xff0c;一臺外殼完好&#xff0c;但是無法開機&#xff0c;判斷是主板問題。另外一臺外殼有損壞&#xff0c;但…

深入 Linux 網絡(一) -- 網卡隊列

文章目錄網卡網卡的核心功能網卡的關鍵技術單隊列網卡多隊列網卡查看網卡信息ifconfigethtool查看網卡隊列Linux 查看中斷綁定網卡中斷查詢查看中斷綁定的 cpu總結1. 默認情況&#xff08;單隊列網卡&#xff09;2. 多隊列網卡3. 如何查看和配置綁定關系&#xff1f;4. 性能優化…

HTTP 1.0, 2.0 和 3.0 有什么區別?

HTTP/1.0 就像是“一問一答”的電話&#xff0c;每次打電話&#xff08;請求&#xff09;都得先撥號&#xff08;建立連接&#xff09;&#xff0c;說完一句話&#xff08;發送數據&#xff09;就掛斷&#xff08;關閉連接&#xff09;&#xff0c;再打下一通電話。效率比較低。…

無畏契約手游上線!手機遠控模擬器暢玩、搶先注冊稀有ID!

終于來了&#xff01;《無畏契約》手游今天已經全平臺上線&#xff01;保留了端游經典的英雄技能與射擊體驗&#x1f3ae;&#xff3b;新服開啟&#xff0c;ID爭奪戰一觸即發&#xff3d;《無畏契約》手游備受FPS玩家期待&#xff0c;累計獲得超6000萬線上預約&#xff01;每次…

《WINDOWS 環境下32位匯編語言程序設計》第4章 第一個窗口程序

4.1 開始了解窗口4.1.1 窗口是什么窗口是什么&#xff1f;大家每天在使用Windows&#xff0c;屏幕上的一個個方塊就是一個個窗口&#xff01;那么&#xff0c;窗口為什么是這個樣子呢&#xff1f;窗口就是程序嗎&#xff1f;1.使用窗口的原因回想一下DOS時代的計算機屏幕&#…

Mybatis執行sql流程(二)之加載Mapper

Mybatis加載Mapper注冊方式注冊時機特點MapperScanBean定義階段注冊接口定義批量注冊&#xff0c;推薦方式Mapper (接口注解)同 MapperScan需每個接口單獨標注XML 配置 <mapper>MyBatis 初始化時傳統方式&#xff0c;不依賴 Spring 容器SqlSessionTemplate 直接獲取調用時…

基于 JSP+Mysql實現MVC房屋租賃系統

基于 MVC 的房屋租賃系統的設計與實現摘 要&#xff1a;房屋租賃管理系統與網絡相結合&#xff0c;給用戶提供更加周到和人性化的服務。網站模式為 MVC 模式&#xff0c;基于 MySQL 數據庫,采用 JSP&#xff0c;Session 繪畫跟蹤、JavaScript 等技術,實現了普通用戶可以瀏覽、查…

第六天~提取Arxml中CAN采樣點信息Creat_ECU--Standard

?? ARXML探秘:解碼CAN采樣點的精準藝術 在汽車電子的交響樂中,CAN采樣點(Sample Point) 如同指揮家揮棒的關鍵時刻——它決定了何時"聆聽"總線上的信號。這個看似微小的百分比數值,卻是保障整車通信可靠性的核心密碼。本文將帶您深入ARXML中的采樣點配置世界…

Windows Git安裝配置

進入git官網Git - Downloading Package 點擊下載&#xff08;可復制鏈接到迅雷&#xff09; 雙擊運行exe安裝包 選擇安裝目錄 下一步 選擇 Git 默認編輯器&#xff0c;下一步設置初始化新項目(倉庫)的主干名字 讓Git決定&#xff08;Let Git decide&#xff09;使用默認的…

面試經驗分享-某電影廠

java會嗎&#xff1f;不會。。。。。hdfs讀文件寫文件的流程 數據寫入 1-客戶端向NameNode發起請求 2-NameNode審核權限和剩余空間&#xff0c;滿足條件即允許寫入&#xff0c;并告知客戶端寫入的DataNode地址 3-客戶端向指定的DataNode發送數據包 4-被寫入數據的DataNode同時完…

數據清理后續

前篇&#xff1a;Python 項目里的數據清理工作&#xff08;數據清洗步驟應用&#xff09; 一&#xff0c;先接上文添加兩種數據填充的方法 1、線性回歸填充 def lr_train_fill(train_data,train_label):train_data_all pd.concat([train_data, train_label], axis1)train_d…

nuc設置腳本開機自啟動

在終端執行gnome-session-properties這個是帶有圖型化頁面的設置開機自啟動的軟件沒有這個軟件的可以直接下載sudo apt update sudo apt install gnome-startup-applications一般都有&#xff0c;ubunutu自帶的右邊有添加&#xff0c;名稱和注釋隨便寫&#xff0c;只需要把命令…