为什么需要网关
搭建网关服务
编写启动类
@SpringBootApplication
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class,args);
}
断言 : 可以理解为布尔(是或否 true or false)
三,路由断言工厂 Route Predicate Factory
断言工厂的作用为 读取用户配置的断言规则而后解析成判断条件,为将来用户请求进来做条件。
如设置禁止某ip登录的 RemoteAddr ,某时间段登录的Between等;
官网内(spring.io)都有文档实例
例子:before
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: # 网关路由配置
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
- id: user-service # 路由id 自定义 只要唯一即可
# url:http//127.0.0.1:8081
uri: lb://userservice # 路由的目标地址 lb是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** #这个是按照路径匹配 只要以user开头就符合要求
- Before=2027-01-20T17:42:47.789-07:00[America/Denver]
四,过滤器(Filter)
gatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
在断言同级下添加filters
filters:
# - AddRequestHeader=12345678,abcdefghigk
在对应的服务中添加以下内容
/**
* 路径: /user/110
*
* @param id 用户id
* @return 用户
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,@RequestHeader(value = ("12345678"),required = false)String Header) {
System.out.println(Header);
return userService.queryById(id);
}
@RequestHeader(vlaue =(),required= false(有没有请求头都可以正常运行,不加的话会出问题 )最后定义String 输出即可获取
默认过滤器
全局过滤器
首先全局过滤器要更加灵活 (因为默认过滤器和filter是下载配置中的)
GlobalFilter中只有一个filter方法然后其具有两个参数:
exchange 请求进入网关后到离开网关整个流程中都可以共享exchange 请求上下文 无论是request 还是response都可以获取还可以存取其它信息。
chain过滤器链 不是只有一个过滤器还有其他的 主要是放行(调用这里的chain 等于处理结束)。
一个简单的案例(只是试着拦截一下请求数据中的authorization)
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
//2.获取参数中的authorization的参数
String auth = queryParams.getFirst("authorization");
//3.获取参数值是否为admin
if("admin".equals(auth)) {
//4.是,放行
return chain.filter(exchange);
}
//5.否,拦截
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
@component 把方法注入spring容器 成为一个组件
@order 过滤器顺序 越小优先级越高 (因为不只有一个过滤器)
过滤器顺序
order值相同的情况下
默认>路由>全局