政務(wù)網(wǎng)站隊(duì)伍建設(shè)情況匯報(bào)怎么免費(fèi)創(chuàng)建個(gè)人網(wǎng)站
GateWay工作流程+GateWay搭建
核心流程圖如下:
核心概念:
客戶端向 Spring Cloud Gateway 發(fā)出請(qǐng)求。如果Gateway Handler Mapping確定請(qǐng)求與路由匹配,則將其發(fā)送到Gateway Web Handler 處理程序。此處理程序通過(guò)特定于請(qǐng)求的Fliter鏈運(yùn)行請(qǐng)求。Fliter被虛線分隔的原因是Fliter可以在發(fā)送代理請(qǐng)求之前(pre)和之后(post)運(yùn)行邏輯。執(zhí)行所有pre過(guò)濾器邏輯。然后進(jìn)行代理請(qǐng)求。發(fā)出代理請(qǐng)求后,將運(yùn)行“post”過(guò)濾器邏輯。
過(guò)濾器作用:
- Filter在pre類型的過(guò)濾器可以做參數(shù)效驗(yàn)、權(quán)限效驗(yàn)、流量監(jiān)控、日志輸出、協(xié)議轉(zhuǎn)換等。
- Filter在post類型的過(guò)濾器可以做響應(yīng)內(nèi)容、響應(yīng)頭的修改、日志輸出、流量監(jiān)控等
- 這兩種類型的過(guò)濾器有著非常重要的作用
在GateWay的內(nèi)部有三個(gè)核心點(diǎn),我們先來(lái)看一下:
核心點(diǎn)
-
Route(路由)
路由是構(gòu)建網(wǎng)關(guān)的基礎(chǔ)模塊,它由ID,目標(biāo)URI,包括一些列的斷言和過(guò)濾器組成,如果斷言為true則匹配該路由
-
Predicate(斷言)
參考的是Java8的java.util.function.Predicate,開發(fā)人員可以匹配HTTP請(qǐng)求中的所有內(nèi)容(例如請(qǐng)求頭或請(qǐng)求參數(shù)),請(qǐng)求與斷言匹配則進(jìn)行路由
-
Filter(過(guò)濾)
指的是Spring框架中GateWayFilter的實(shí)例,使用過(guò)濾器,可以在請(qǐng)求被路由前或者之后對(duì)請(qǐng)求進(jìn)行修改。
-
三個(gè)核心點(diǎn)連起來(lái):
當(dāng)用戶發(fā)出請(qǐng)求到達(dá)GateWay,GateWay會(huì)通過(guò)一些匹配條件,定位到真正的服務(wù)節(jié)點(diǎn),并在這個(gè)轉(zhuǎn)發(fā)過(guò)程前后,進(jìn)行一些及細(xì)化控制。其中Predicate就是我們匹配的條件,而Filter可以理解為一個(gè)攔截器,有了這兩個(gè)點(diǎn),再加上目標(biāo)URI,就可以實(shí)現(xiàn)一個(gè)具體的路由了。
總結(jié)
GateWay核心的流程就是:路由轉(zhuǎn)發(fā)+執(zhí)行過(guò)濾器鏈
GateWay搭建
依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.mashibing</groupId><artifactId>cloud-gateway-9999</artifactId><version>0.0.1-SNAPSHOT</version><name>cloud-gateway-9999</name><description>cloud-gateway-9999</description><properties><java.version>1.8</java.version><spring-cloud-alibaba.version>2.2.10-RC1</spring-cloud-alibaba.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version></properties><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
## 應(yīng)用名稱
#spring.application.name=cloud-gateway-9999
## Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
## Nacos認(rèn)證信息
#spring.cloud.nacos.discovery.username=nacos
#spring.cloud.nacos.discovery.password=nacos
## Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口
#spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
## 注冊(cè)到 nacos 的指定 namespace,默認(rèn)為 public
#spring.cloud.nacos.discovery.namespace=publicserver:port: 9999
spring:application:name: cloud-gateway-servicecloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: true #開啟注冊(cè)中心路由功能routes: # 路由- id: nacos-provider #路由ID,沒(méi)有固定要求,但是要保證唯一,建議配合服務(wù)名uri: http://localhost:9001/nacos-provider # 匹配提供服務(wù)的路由地址predicates: # 斷言- Path=/msb/** # 斷言,路徑相匹配進(jìn)行路由
更改9001的DemoController,加上一個(gè)入口
package com.paic.test.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/msb")//路由路徑
public class IndexController {@Value("${server.port}")private String port;@GetMapping(value = "/nacos")public String getServerPort(){return "this is nacos server: " + port ;}@GetMapping(value = "/testGateway")public String testGateway(){return "this is testGateway test" + port ;}}
最后測(cè)試,啟動(dòng)Nacos、9001和9999網(wǎng)關(guān),通過(guò)網(wǎng)關(guān)訪問(wèn)9001的/msb/get接口同時(shí)查看Nacos控制臺(tái)