概述簡介
了解地址官網:
1.上一代zuul1.x :https://github.com/Netflix/zull/wiki
2.gatway https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/
是什么?
cloud全家桶中有個很重要的組件就是網關,在1.x版本中都是采用zuul網關,但是2.x版本中,zuul一直處於維護中,后來springcloud自己研發了一個網關代替zuul。
就是springcloud gateway一句話:gateway是原來zuul1.x版本的替代。
springcloud gateway是基於webflux框架實現的,而webflux框架底層則是使用了高性能的Reactor模式通信框架Netty
springcloud gateway的目標是提供統一的路由方式且基於Fileter鏈的方式提供了網關基本的功能,例如:安全,監控/指標和限流。
一句話:springcloud gateway使用的時Webflux中的reactor-netty響應式編程組件,底層使用了Netty通訊框架。在高並發、非阻塞式響應式通訊中非常有優勢。
能干啥
2.鑒權
3.流量控制
4.熔斷
5.日志監控
6.。。。
為什么選擇gateway?
1.zuul遲遲不發布新版本。
比zuul更簡單,而且是springcloud團隊研發,親兒子值得信賴;gateway是基於異步非阻塞模型上進行研發,性能方面不需要擔心,雖然zuul2.x早就發布了,但是springcloud模式沒有整合計划。
2.springcloud gateway具有如下特性:
(1)基於spring framework 5,project reactor和springboot2.0進行構建。
(2)動態路由,能夠匹配任何請求屬性
(3)可以對路由進行Predicate(斷言)和Filter(過濾)
(4)集成springcloud服務發現功能
(5)集成Hystrix的斷路由器功能
(6)易於編寫Predicate(斷言)和Filter(過濾)
(7)請求限流功能
(8)支持路徑重新。
1.Route(路由)
路由是構建網關的基本模塊,它是由ID,目標URL,一系列的斷言和過濾器組成,如果斷言為true則匹配該路由。
2.Predicate(斷言)
參考java8的java.util.function.Predicate
開發人員可以再匹配HTTP請求中的所有內容(例如請求頭、請求參數),如果請求與斷言相匹配,則進行路由。
3.Filter(過濾)
指的是spring框架中GatewayFiltere的實例,使用過濾器,可以再請求被路由前或者后對請求進行修改。
4.總體
web請求,通過一些匹配條件,定位到真正的服務節點,並在這個轉發過程的前后,進行一些精細化的控制。
predicate就是我們的匹配條件;
filter就可以理解為一個無所不能的攔截器,有了這兩個元素,再加上目標uri,就可以實現一個具體的路由了
環境搭建
(1)創建名為cloud-gateway-gateway9527的module
(2)修改POM文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.seegot.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-gateway-gateway9527</artifactId> <dependencies> <!--引入gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--gateway也是需要注冊到服務中心的--> <!--注入eureka client 依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--網關依賴中,不需要這些配置--> <!--<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>--> <!--引入熱部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
(2)編寫application.yml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 開啟從注冊中心動態創建路由的功能,利用微服務名進行路由
routes:
- id: payment_routh #payment_routh #路由的ID,沒有固定規則,但要求唯一,建議配合服務名
#uri: http://localhost:8001 #匹配后提供服務的路由地址 沒有進行負載均衡
uri: lb://cloud-payment-service #匹配后提供服務的路由地址
predicates:
- Path=/payment/get/** #斷言,路徑相匹配的進行路由
- id: payment_routh2 #payment_routh #路由的ID,沒有固定規則,但要求唯一,建議配合服務名
#uri: http://localhost:8001 #匹配后提供服務的路由地址
uri: lb://cloud-payment-service #匹配后提供服務的路由地址
predicates:
- Path=/payment/lb/** #斷言,路徑相匹配的進行路由
eureka:
instance:
hostname: cloud-gateway-service
client: # 服務提供者provider注冊金eureka服務列表內
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
(3)修改主入口程序
package com.atguigu.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; /** * @program: cloud2020 * @description: * @author: PP Zhang * @create: 2020-06-18 13:19 */ @SpringBootApplication @EnableEurekaClient public class GatewayMain9527 { public static void main(String[] args) { SpringApplication.run(GatewayMain9527.class,args); } }
(4)測試
需要注意的是,我提前已經創建了注冊中心模塊和服務生產者模塊。
http://localhost:9527/payment/lb