网关是对外提供服务的唯一入口,介于客户端与服务器段之间,可以用于鉴权、限流、路由、监控等功能
重要角色
route路由
路由包括一个路由id+一个目标url地址+一组断言工厂+一组过滤器
predicate断言
相当于一个条件判断,对http请求进行指定规则的匹配,如果匹配通过返回true,此时请求会进入过滤器链,经过过滤器链的层层处理之后,再路由到指定url地址
filter过滤器
请求处理前,对请求进行一些加工操作
使用
通过配置文件的方式
spring: cloud: gateway: # 路由1(请求转发) routes: #路由到百度 - id: baidu_route # 路由uri地址 uri: https://www.baidu.com # 断言:路由规则 predicates: # 拦截 - Path= /baidu #路由2到 consumer - id: consumer_route # 路由uri地址 uri: http://127.0.0.1:8080 # 断言:路由规则 predicates: # 拦截 - Path= /consumer/** #路由3到 provider - id: provider_route # 路由uri地址 uri: http://127.0.0.1:8081 # 断言:路由规则 predicates: # 拦截 - Path= /provider/** nacos: # 指定nacos注册中心的地址 discovery: server-addr: 127.0.0.1:8848 # 指定微服务的名称 application: name: msc-gateway
通过configuration类的方式
@Configuration
public class ApiConfig {
/**
* 路由规则写在配置类中
* @param builder
* @return
*/
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes().route(predicateSpec -> predicateSpec
.path("/**")
.uri("https://www.baidu.com").id("baidu_route")).build();
}
}
断言
springcloud gateway有许多内置的断言工厂
请求时间在指定时间之后,断言为true
请求时间在指定时间之前,断言为true
请求时间在指定时间范围内,断言为true
请求携带了cookie中包含了指定的key和vaue时,匹配为true
请求携带了Header中包含了指定的key和vaue时,匹配为true
请求头中的host属性携带了指定的host时,匹配为true
请求头中请求方式是指定的请求方式,断言为true、
请求路径是指定的请求路径,断言为true
请求路径所要访问的ip是指定的ip区间,断言为true
权重断言工厂
过滤器
往request添加指定的header
往request中添加指定key和vaue的过滤器
往response中添加指定header的过滤器
为指定的url添加一个url前缀的过滤器
为指定的url去除掉指定长度的前缀
为一个url,替换成另一个url的过滤器
过滤器完成网关层的服务熔断和降低
对请求进行限流的过滤器,redis令牌桶实现
全局的过滤器GlobalFilter
在自定义了一些 GlobalFilter 后,为了保证这些Filter 的执行顺序,在每个返回 GlobalFilter的 方法上添加@Order,或直接使自定义的 GlobalFilter 类实现 Order 接口,就可以修改Filter的执行顺序。