使用步骤
新建项目依赖如下所示
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
yml
server:
port: 5000
spring:
application:
name: cloud_gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
group: microservices
启动后可以在注册中心看到服务
下一步我们来尝试配置路由
从官网4.1节拷贝这段代码
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue
稍作修改启动
gateway:
routes:
- id: baidu
uri: https://www.baidu.com
提示 predicates 不能为空,那么这个字段是什么意思呢?
从配置文件点击去看一下实现
public void setRoutes(List<RouteDefinition> routes) {
this.routes = routes;
if (routes != null && routes.size() > 0 && logger.isDebugEnabled()) {
logger.debug("Routes supplied from Gateway Properties: " + routes);
}
}
稍作修改先启动成功,后面遇到了再详细说
gateway:
routes:
- id: baidu
uri: https://www.baidu.com
predicates:
- Cookie=mycookie,mycookievalue
官网介绍了另一种predicates写法
predicates:
- Cookie=mycookie,mycookievalue
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
官方文档第5部分有非常多的Route Predicate Factories,翻译过来是路由谓词工厂。
7.3. The ReactiveLoadBalancerClientFilter
这有一个服务接口 http://localhost:8952/user
- id: openfeign-8952-user
uri: http://localhost:8952
predicates:
- Path=/user/**
filters:
- StripPrefix=1
由于网关在 5000端口,所以当访问5000/user/user 的时候会匹配到http://localhost:8952,但是拼接完的路径是 localhost:8952/user/user,所以我们应该根据过滤器去掉1级所以StripPrefix=1。
如果我们想开启两台进行负载均衡应该怎么办呢 ?
在url这里就不能写上固定的8952端口了。
uri: lb://openfeign-8952-user
添加负载均衡依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
连续访问 http://localhost:5000/user/user
可以看到 user8952 和 user8953 交替返回已经具有了负载均衡的能力。
7.3. The ReactiveLoadBalancerClientFilter
By default, when a service instance cannot be found by the ReactorLoadBalancer, a 503 is returned. You can configure the gateway to return a 404 by setting spring.cloud.gateway.loadbalancer.use404=true.
下面我们来演示效果
默认情况返回503
配置属性
spring:
cloud:
gateway:
loadbalancer:
use404: true
返回404