目錄
1:Gateway服務網關
1.1:為什麼需要網關
1.2:gateway快速入門
1):建立gateway服務,引入依賴
2):編寫啟動類
3):編寫基礎配置和路由規則
4):重新開機測試
5):網關路由的流程圖
1:Gateway服務網關
Spring Cloud Gateway 是 Spring Cloud 的一個全新項目,該項目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等響應式程式設計和事件流技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。
1.1:為什麼需要網關
Gateway網關是我們服務的守門神,所有微服務的統一入口。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CNyIzM4gTN3gTNmBTYlBDOzYzXxETNxADM2IzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
什麼是網關的呢?
像上圖的工作流程,使用者将請求發送到微服務中,項目中的所有服務使用者都可通路,一個項目中可是有些服務不能暴露出去通路的或者說有一定權限才能通路的,如果都可以通路,那勢必會存在一定的安全性問題!那麼怎麼解決這個問題呢!則就引入了springCloud的元件,gateway(網關)進行解決!
網關的核心功能特性:
- 身份認證,權限控制(請求來了網關進行判斷你是誰進行權限的判斷,判斷通過,網關放行到微服務中 !網關作為微服務入口,需要校驗使用者是是否有請求資格,如果沒有則進行攔截。)
-
服務路由,負載均衡(比如有個請求功能到網關了,網關能處理業務嗎?肯定不能,網關需要把請求轉發到微服務當中,比如user-service服務中去,這時網關就需要進行判斷了,根據你的請求網關處理給你轉接到具體的哪個服務這個過程被稱為路由。
同樣一個服務可能有多個執行個體,網關同樣會做負載均衡)
- 請求限流(比如說一個遊樂場,場區規定容納兩萬人,結果到雙休日了一下子來了四萬人,這時守門員出手了,你們兩萬人先等等,裡面已經達到容納量了!類比于,微服務中每個服務可能每小時隻能接收一萬次請求,雙十二突然增多,這些服務因為承載不了垮掉了,網關出手了,把多出請求的攔截下來,避免服務壓力過大,保證程式的正常運轉,這就是限制流量)
架構圖:
在SpringCloud中網關的實作包括兩種:
- gateway
- zuul
Zuul是基于Servlet的實作,屬于阻塞式程式設計。而SpringCloudGateway則是基于Spring5中提供的WebFlux,屬于響應式程式設計的實作,具備更好的性能。
1.2:gateway快速入門
下面,我們就示範下網關的基本路由功能。基本步驟如下:
- 建立SpringBoot工程gateway,引入網關依賴
- 編寫啟動類
- 編寫基礎配置和路由規則
- 啟動網關服務進行測試
1):建立gateway服務,引入依賴
建立服務:
引入依賴
<!--網關-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服務發現依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2):編寫啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class TestGetwayApplication {
public static void main(String[] args) {
SpringApplication.run(TestGetwayApplication.class,args);
}
}
3):編寫基礎配置和路由規則
建立application.yml檔案,内容如下:
#端口号
server:
port: 10010
spring:
application:
name: test-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos服務位址
gateway:
discovery:
locator:
enabled: true #開啟服務注冊和發現的功能,自動建立router以服務名開頭的請求路徑轉發到對應的服務
routes: # 網關路由配置
- id: consumer #自定義,路由id,隻要唯一即可
uri: lb://service-consumer #通路路徑,路由的目标位址 lb是負載均衡,後面跟着服務名稱
predicates: #斷言,也就是判斷請求是否複合路由規則的條件
- Path=/consumer/** #這個是按照路徑比對,隻要以/consumer/開頭就符合要求
我們将符合
Path
規則的一切請求,都代理到
uri
參數指定的位址。
本例中,我們将
/consumer/**
開頭的請求,代理到
lb://service-consumer
,lb是負載均衡,根據服務名拉取服務清單,實作負載均衡。
4):重新開機測試
重新開機網關,通路http://localhost:10010/consumer/user/login時,符合
/consumer/**
規則,請求轉發到uri:http://service-consumer/user/login/愛吃豆的洋芋,得到了結果:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/login/{loginname}")
@SentinelResource(value = "login" , blockHandler = "loginBlockHandler")
public String login(@PathVariable("loginname") String str){
return "登入成功"+ str;
}
5):網關路由的流程圖
整個通路的流程如下:
總結:
- 建立項目,引入nacos服務發現和gateway依賴
- 配置application.yml,包括服務基本資訊、nacos位址、路由
- 路由id:路由的唯一标示
- 路由目标(uri):路由的目标位址,http代表固定位址,lb代表根據服務名負載均衡
- 路由斷言(predicates):判斷路由的規則,
- 路由過濾器(filters):對請求或響應做處理