先实现一个简单功能,把某个固定的请求,转发到指定的 url 上。
spring-cloud.s08.gateway 在 pom 中添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies> 创建配置文件 application.yml
server:
port: 32001
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: gateway-service # 这个路由的id
uri: https://spring.io # 跳转到哪里去
predicates:
- Path=/projects/spring-cloud # 谓词断言,当访问路径是 /projects/spring-cloud 时,把这个路径接到 uri 指定的地址去 新建启动类 ..Gateway
@SpringBootApplication
public class Gateway {
public static void main(String[] args) {
SpringApplication.run(Gateway.class, args);
}
} http://localhost:32001/projects/spring-cloud
略
在 pom 中增加 eureka client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> 修改 application.yml 增加 eureka 和 转发请求到服务的配置
server:
port: 32001
eureka:
instance:
ip-address: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
client:
service-url:
defaultZone: http://user:123123@eureka-server-1:34001/eureka/,http://user:123123@eureka-server-2:34002/eureka/,http://user:123123@eureka-server-3:34003/eureka/
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: gateway-service # 这个路由的id
uri: https://spring.io # 跳转到哪里去
predicates:
- Path=/projects/spring-cloud # 谓词断言,当访问路径是 /projects/spring-cloud 时,把这个路径接到 uri 指定的地址去
- id: to_album # 路由的id
uri: lb://album-provider # lb 表示负载均衡 album-provider 是注册中心中的一个服务
predicates:
- Path=/album/** # ** 表示任意匹配。该条目表示只要从前部 /album/ 即可 重启 gateway 项目
http://localhost:32001/album/albums
uri: lb://album-provider 带负载均衡
Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。
在时间点之前
predicates: - Before=2019-01-01T00:00:00+08:00/[Asia/Shanghai/]
在时间点之后
predicates: - After=2019-01-01T00:00:00+08:00/[Asia/Shanghai/]
在时间点之间
predicates: - Between=2019-01-01T00:00:00+08:00/[Asia/Shanghai/], 2019/-07/-01T00:00:00+08:00/[Asia/Shanghai/]
cookie名字和正则表达式的value作为两个输入参数,请求的cookie需要匹配cookie名和符合其中value的正则。
- Cookie=cookiename, cookievalue
两个入参,一个header的name,一个是正则匹配的value。
- Header=X-Request-Id, /d+
host的列表作为参数
- Host=**.somehost.org,**.anotherhost.org
通过HTTP的method来匹配路由。
- Method=GET
path列表作为参数,使用Spring的 PathMatcher 匹配path,可以设置可选变量。
- Path=/foo/{segment},/bar/{segment},/p/**
其中的segment变量可以通过下面方式获取:
PathMatchInfo variables = exchange.getAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE);
Map<String, String> uriVariables = variables.getUriVariables();
String segment = uriVariables.get("segment");
通过一个或两个参数来匹配路由,一个是查询的name,一个是查询的正则value。
- Query=baz
路由会匹配所有包含 baz 查询参数的请求。
- Query=foo, ba.
路由会匹配所有包含 baz ,并且 baz 的内容为诸如: bar 或 baz 等符合 ba. 正则规则的请求。
通过无类别域间路由(IPv4 or IPv6)列表匹配路由。
- RemoteAddr=192.168.1.1/24
路由就会匹配RemoteAddr诸如 192.168.1.10 等请求。
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: gateway-service
uri: https://www.baidu.com
order: 0
predicates:
- Host=**.foo.org
- Path=/headers
- Method=GET
- Header=X-Request-Id, /d+
- Query=foo, ba.
- Query=baz
- Cookie=chocolate, ch.p
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
- AddRequestHeader=X-Request-Foo, Bar
对匹配的请求,会额外添加 X-Request-Foo:Bar 的header。
- AddRequestParameter=foo, bar
对匹配的请求,会额外添加 foo=bar 的请求参数。
- AddResponseHeader=X-Response-Foo, Bar
对匹配的请求,响应返回时会额外添加 X-Response-Foo:Bar 的header返回。