簡介
最近都在弄微服務的東西,現在來記錄下收穫。我從一知半解到現在能從0搭建使用最大的感觸有兩點
1.微服務各大元件的版本很多,網上很多部落格內容不一定適合你的版本,很多時候苦苦琢磨都是無用功
2.網上部落格參差不齊,有些甚至錯誤的。更離譜的是,好的文章閱讀量除非高出天際,不然就都很低,比那些複製貼上,隨便應付的都低(這個搜尋推薦演算法不知道基於什麼的)
通過這段時間學習,我覺得最重要是從好的部落格入手,先不要著急怎麼元件怎麼使用,而是先了解元件的作用,大概的原理,然後才是使用,這樣搭建和嘗試的過程中才能更好的定位問題,最後再次回到原理和一些實際問題的處理(不知道實際問題怎樣的,直接搜那個元件的面試題往往效果最好)
接下來的內容,都以導航的形式展現給大家(畢竟優秀的輪子很多,直接看大佬寫的不香嘛),再順帶提些自己的理解
傳送門
更多微服務的介紹可點選下方連結
微服務介紹、Nginx導航、Nacos導航、Gateway導航、Ribbon導航、Feign導航、Sentinel導航
博主微服務git練手專案:https://github.com/NiceJason/SpringCloudDemo
Gateway簡介
SpringCloudGateway的簡介:http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html
Gateway主要由:路由(Route)、斷言(Predicate)和過濾器(Filter)3個部分組成
1個路由可以由多個斷言和多個過濾器共同組成,而元件自身為我們準備了很多斷言可以直接使用,具體看簡介
自定義過濾器如何實現:https://blog.csdn.net/forezp/article/details/85057268
這裡提個坑:
全網閘道器攔截器若想要生效,以下條件之一需要符合
1.當前閘道器必須配置其他非全網攔截器(還真的很神奇)
2.全網閘道器攔截器必須實現Ordered介面
自定義斷言如何實現:https://blog.csdn.net/qq_29064815/article/details/107236161
下面說些不一樣的
1.Gateway不依賴Web
Spring Cloud Gateway 是使用 netty+webflux實現,webflux與web是衝突的。所以Maven依賴不能用Web相關的內容,這句話說的很簡單,但是做起來卻不容易。特別是Maven依賴混亂的專案更難抽離,例如公共服務裡包含了Web依賴,那麼你的Gateway服務就不能引用公共服務了,這樣會導致Gateway服務需要自身拷貝一份公共服務的程式碼,所以好的Maven模組化依賴是很重要的。
Springboot十分方便,但又不能直接引用,但是不引用第三方元件沒準又有問題,可以在父類做如下引用
1 <dependencyManagement>
2 <dependencies>
3 <dependency>
4 <groupId>org.springframework.boot</groupId>
5 <artifactId>spring-boot-dependencies</artifactId>
6 <version>${spring-boot.version}</version>
7 <type>pom</type>
8 <scope>import</scope>
9 </dependency>
10 </dependencies>
11 </dependencyManagement>
2.不要在Gateway做複雜的邏輯
首先要知道,閘道器的作用只有一個,那就是這個請求到底是放行還是拒絕,所以不要在這裡做複雜的操作,對於http請求最好做到只讀,通過讀取的內容就能完成邏輯,而不需要往請求裡增刪改一些東西(如Cookie,body引數等等),因為這操作是很困難的,而且即使成功了沒準也問題多多(專案裡就試過操作Session導致Set-Cookie變成小寫,微信瀏覽器識別不了而導致錯誤)
1 @Component
2 public class MsgGatewayFilterFactory extends AbstractGatewayFilterFactory {
3
4 /**
5 * Cookie裡是否有token
6 * 如果沒有則拒絕請求
7 * @param config
8 * @return
9 */
10 @Override
11 public GatewayFilter apply(Object config) {
12 return ((exchange, chain) -> {
13 System.out.println("進入MsgGatewayFilterFactory");
14 ServerHttpRequest serverRequest = exchange.getRequest();
15 HttpCookie tokenCookie = serverRequest.getCookies().getFirst("token");
16 if(tokenCookie ==null || StringUtils.isEmpty(tokenCookie.getValue())){
17 System.out.println("MsgGatewayFilterFactory攔截 因為cookie裡未找到token");
18 //這裡也可以return Mono.empty()
19 throw new SystemException("cookie裡未找到token");
20 }
21 System.out.println("獲取到token = "+tokenCookie.getValue());
22
23 System.out.println("退出MsgGatewayFilterFactory");
24 return exchange.getSession().flatMap(webSession -> {
25 System.out.println("Gateway開始操作WebSession");
26 ServerHttpResponse response = exchange.getResponse();
27
28 //獲得全域性攔截器的記錄
29 String globalMsg = webSession.getAttribute("GlobalGateway");
30 System.out.println(globalMsg);
31
32 //這Session只能在閘道器裡用
33 //除非這裡自己存到快取裡去,像做SpringSession那樣,不然分散式不了
34 webSession.getAttributes().put("Gateway","Gateway記錄了值");
35 JSONObject message = new JSONObject();
36
37
38 //操作頭部,body,cookie
39 ServerHttpRequest request = exchange.getRequest();
40
41 HttpHeaders headers = request.getHeaders();
42 MultiValueMap<String, HttpCookie> cookies = request.getCookies();
43 MultiValueMap<String, String> queryParams = request.getQueryParams();
44 Flux<DataBuffer> body = request.getBody();
45
46 //想要操作body的值不容易的
47 //參考:https://blog.csdn.net/seantdj/article/details/100546713
48 //參考:https://www.haoyizebo.com/posts/876ed1e8/
49
50 //頭部裡面放值,會報錯,這是個ReadOnlyHttpHeaders
51 //headers.add("GatewayKey-header","GatewayValue-header");
52 //想要設定要這樣設,傳輸中文需要編碼,不然亂碼
53 try{
54 request.mutate().header("GatewayKey-header", URLEncoder.encode("mutate的方式設定頭的值是可以的","UTF-8"));
55 }catch (Exception e){
56 System.out.println("Gateway頭部設定資訊出錯");
57 System.out.println(e);
58 }
59
60
61 //cookie裡面放值,會報錯,只能讀
62 //cookies.add("GatewayKey-cookie",new HttpCookie("GatewayCookieKey","GatewayCookieValue"));
63
64 //往引數裡面放,會報錯,只能讀
65 //queryParams.add("GatewayKey-param","GatewayValue-param");
66
67 return chain.filter(exchange);
68 });
69 });
70 }
71 }
其實很重要的一點Gateway使用的是響應式程式設計。這部分架構、理念、用法不熟悉的話不要弄騷操作,出BUG都不知道怎麼整
真的想搞么蛾子看:https://blog.csdn.net/u010647035/article/details/84726266
裡面有各式的過濾器去操作http請求,搜尋你想要了解的過濾器,去結合原始碼和網上內容做自定義改造
小結
本篇部落格主要介紹常用的方式,對於具體的原理和高深的用法都沒怎麼涉及(菜雞一枚,真的不太懂響應式程式設計),希望能幫到大家~