先实现一个简单功能,把某个固定的请求,转发到指定的 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返回。