springCloud-gateWay进⾏API⽹关转发
1 SpringCloud Gateway 简介
SpringCloud Gateway 是 Spring Cloud 的⼀个全新项⽬,该项⽬是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的⽹关,它旨在为微服务架构提供⼀种简单有效的统⼀的 API 路由管理⽅式。
SpringCloud Gateway 作为 Spring Cloud ⽣态系统中的⽹关,⽬标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新⾼性能版本进⾏集成,仍然还是使⽤的Zuul 2.0之前的⾮Reactor模式的⽼版本。⽽为了提升⽹关的性能,SpringCloud Gateway是基于WebFlux框架实现的,⽽WebFlux框架底层则使⽤了⾼性能的Reactor模式通信框架Netty。
Spring Cloud Gateway 的⽬标,不仅提供统⼀的路由⽅式,并且基于 Filter 链的⽅式提供了⽹关基本的功能,例如:安全,监控/指标,和限流。
提前声明:Spring Cloud Gateway 底层使⽤了⾼性能的通信框架Netty。
引⼊依赖:
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 需要注册到eureka -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2 Spring Cloud Gateway路由配置⽅式
yaml⽂件配置
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
-id: url-proxy-1
uri: blog.csdn
predicates:
-Path=/csdn
各字段含义如下:
id:我们⾃定义的路由 ID,保持唯⼀
uri:⽬标服务地址
predicates:路由条件,Predicate 接受⼀个输⼊参数,返回⼀个布尔值结果。该接⼝包含多种默认⽅法来将 Predicate 组合成其他复杂的逻辑(⽐如:与,或,⾮)。
上⾯这段配置的意思是,配置了⼀个 id 为 url-proxy-1的URI代理规则,
路由的规则为:
基于代码的路由配置⽅式
转发功能同样可以通过代码来实现,我们可以在启动类 GateWayApplication 中添加⽅法 customRouteLocator() 来定制转发规则。
package com.springcloud.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.ute.RouteLocator;
import org.springframework.ute.builder.RouteLocatorBuilder;
import t.annotation.Bean;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
utes()
.route("path_route", r -> r.path("/csdn")
.uri("blog.csdn"))
.build();
}
}
3.Predicate的配置使⽤
Predicate 就是为了实现⼀组匹配规则,⽅便让请求过来到对应的 Route 进⾏处理
1.通过请求参数匹配
Query Route Predicate ⽀持传⼊两个参数,⼀个是属性名⼀个为属性值,属性值可以是正则表达式。
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
-id: gateway-service
uri: www.baidu
order: 0
predicates:
-
Query=smile
这样配置,只要请求中包含 smile 属性的参数即可匹配路由。
使⽤ curl 测试,命令⾏输⼊:
curl localhost:8080?smile=x&id=2
经过测试发现只要请求汇总带有 smile 参数即会匹配路由,不带 smile 参数则不会匹配。
还可以将 Query 的值以键值对的⽅式进⾏配置,这样在请求过来时会对属性值和正则进⾏匹配,匹配上才会⾛路由server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
-id: gateway-service
uri: www.baidu
order: 0
predicates:
-Query=keep, pu.
这样只要当请求中包含 keep 属性并且参数值是以 pu 开头的长度为三位的字符串才会进⾏匹配和路由。
使⽤ curl 测试,命令⾏输⼊:
curl localhost:8080?keep=pub
测试可以返回页⾯代码,将 keep 的属性值改为 pubx 再次访问就会报 404,证明路由需要匹配正则表达式才会进⾏路由。
2.通过 Header 属性匹配
Header Route Predicate 和 Cookie Route Predicate ⼀样,也是接收 2 个参数,⼀个 header 中属性名称和⼀个正则表达式,这个属性值和正则表达式匹配则执⾏。
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
-id: gateway-service
uri: www.baidu
order: 0
predicates:
- Header=X-Request-Id, \d+
使⽤ curl 测试,命令⾏输⼊:
则返回页⾯代码证明匹配成功。将参数-H "X-Request-Id:88"改为-H "X-Request-Id:spring"再次执⾏时返回404证明没有匹配。
3.通过 Cookie 匹配
Cookie Route Predicate 可以接收两个参数,⼀个是 Cookie name ,⼀个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执⾏路由,如果没有匹配上则不
执⾏。
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
-id: gateway-service
uri: www.baidu
order: 0
predicates:
- Cookie=sessionId, test
使⽤ curl 测试,命令⾏输⼊:
则会返回页⾯代码,如果去掉--cookie "sessionId=test",后台汇报 404 错误。
4.通过 Host 匹配
Host Route Predicate 接收⼀组参数,⼀组匹配的域名列表,这个模板是⼀个 ant 分隔的模板,⽤.号作为分隔符。它通过参数中的主机地址作为匹配规则。
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
-id: gateway-service
uri: www.baidu
order: 0
predicates:
- Host=**.baidu
使⽤ curl 测试,命令⾏输⼊:
经测试以上两种 host 均可匹配到 host_route 路由,去掉 host 参数则会报 404 错误。
6 通过请求⽅式匹配
可以通过是 POST、GET、PUT、DELETE 等不同的请求⽅式来进⾏路由。
name: api-gateway
cloud:
gateway:
routes:
-id: gateway-service
uri: www.baidu
order: 0
predicates:
- Method=GET
使⽤ curl 测试,命令⾏输⼊:
# curl 默认是以 GET 的⽅式去请求
测试返回页⾯代码,证明匹配到路由,我们再以 POST 的⽅式请求测试。
# curl 默认是以 GET 的⽅式去请求
返回 404 没有到,证明没有匹配上路由
7 通过请求路径匹配
Path Route Predicate 接收⼀个匹配路径的参数来判断是否⾛路由。
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
-id: gateway-service
uri: ityouknow
order: 0
predicates:
-Path=/foo/{segment}
如果请求路径符合要求,则此路由将匹配,例如:/foo/1 或者 /foo/bar。
使⽤ curl 测试,命令⾏输⼊:
经过测试第⼀和第⼆条命令可以正常获取到页⾯返回值,最后⼀个命令报404,证明路由是通过指定路由来匹配。
8 通过请求 ip 地址进⾏匹配
Predicate 也⽀持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最⼩⼤⼩为1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是⼦⽹掩码)。
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: gateway-service
uri: www.baidu
order: 0
predicates:
- RemoteAddr=192.168.1.1/24
可以将此地址设置为本机的 ip 地址进⾏测试。
curl localhost:8080
如果请求的远程地址是 192.168.1.10,则此路由将匹配。
组合使⽤的例⼦:
name: api-gateway
cloud:
gateway:
routes:
- id: gateway-service
uri: www.baidu
order: 0
predicates:
- Host=**.
- Path=/headers
- Method=GET
-
Header=X-Request-Id, \d+
- Query=foo, ba.
- Query=baz
- Cookie=chocolate, ch.p
predicates的官⽅参考:
# 匹配在什么时间之后的
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
# 匹配在什么时间之前的
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
# 匹配在某段时间的
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
# 匹配cookie名称为`chocolate`的值要符合`ch.p`正则.
- Cookie=chocolate, ch.p
# 匹配header为`X-Request-Id`的值要符合`\d+`正则.
- Header=X-Request-Id, \d+
# 匹配任意符合`**.`与`**.`正则的⽹址
- Host=**.,**.
# Host还⽀持模版变量,会保存在`Attributes()`的 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE中,以Map形式存储        - Host={sub}.
# 匹配GET⽅法
- Method=GET
curl是什么命令# 路径匹配,与Host⼀样⽀持模版变量,存在URI_TEMPLATE_VARIABLES_ATTRIBUTE中。
- Path=/foo/{segment},/bar/{segment}
# 匹配存在baz查询参数
- Query=baz
# 匹配存在foo且符合`ba.`正则
- Query=foo, ba.
# 匹配远程地址
- RemoteAddr=192.168.1.1/24
4.和注册中⼼相结合的路由配置⽅式
在uri的schema协议部分为⾃定义的lb:类型,表⽰从微服务注册中⼼(如Eureka)订阅服务,并且进⾏服务的路由。
⼀个典型的⽰例如下:
server:
port: 8084
spring:
cloud:
gateway:
routes:
-id: seckill-provider-route
uri: lb://seckill-provider
predicates:
- Path=/seckill-provider/**
-id: message-provider-route
uri: lb://message-provider
predicates:
-Path=/message-provider/**
application:
name: cloud-gateway
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: localhost:8888/eureka/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。