【SpringCloud】网关

网关Gateway

作用

  • 对用户请求做身份认证,权限校验
  • 将用户请求路由到微服务,并实现负载均衡
  • 对用户请求限流
    image

搭建网关服务

网关本身也是一个服务,也需要注册到nacos中,统一管理

  1. 创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖,配置springboot
    image

    image

  2. 编写路由配置及nacos地址
    image

    server:
      port: 10010
    spring:
      application:
    	name: gateway
      cloud:
    	nacos:
    	  server-addr: localhost:8848
    	gateway:
    	  routes:
    		- id: user-service # 路由标识,必须唯一
    		  uri: lb://userservice # 路由的目标地址
    		  predicates: # 路由断言 判断请求是否符合规则
    			- Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合
    		- id: order-service
    		  uri: lb://orderservice
    		  predicates:
    			- Path=/order/**
    

总结

网关搭建步骤:

1.创建项目,引入nacos服务发现和gateway依赖
2.配置application.yml,包括服务基本信息、nacos地址

路由路由配置包括:

1.路由id:路由的唯一标示
2.路由目标(uri):路由的目标地址,http代表固定地址,b代表根据服务名负载均衡
3.路由断言(predicates):判断路由的规则,

流程图

张老师这个ppt的图很清晰
image

路由断言工厂

用到时查看官方文档
SpringCloud-Route Predicate Factories

image

路由的过滤器

image

当前路由的过滤器

spring:
  cloud:
    gateway:
      routes:
        - id: user-service # 路由标识,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言 判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合
          filters:
            - AddRequestHeader=Truth, apple! # 过滤器
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

默认过滤器

对所有路由都生效

spring:
  cloud:
    gateway:
      routes:
        - id: user-service # 路由标识,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言 判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
      default-filters:
        - AddRequestHeader=Truth, apple! # 默认过滤器

全局过滤器GlobalFilter

假设需求是必须header头部带"authorization",且值为"admin"

步骤:

实现GlobalFilter接口

@Order(-1) // 越小越大,也可以通过实现Ordered接口来完成
@Component // 注册为Bean管理
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1. 获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        // 2. 获取参数中的authorization参数
        String auth = params.getFirst("authorization");
        // 3. 判断参数值是否等于admin
        if ("admin".equals(auth)) {
            // 4. 是,放行 传入exchange就是交给下一个链,自然就是放行了
            return chain.filter(exchange);
        }
        // 5. 否,拦截
        // 5.1 设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
}

过滤器链执行顺序

GatewayFilterAdapter中使用了适配器模式,能将GlobalFilter接口转换成GatewayFilter
image

排序
  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
  • GlobalFilteri通过实现Ordered接口,或者添加@Orderi注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行。
    image

image

跨域问题

image
CORS跨域要配置的参数包括哪几个?

  • 允许哪些域名跨域?
  • 允许哪些请求头?
  • 允许哪些请求方式?
  • 是否允许使用cookie?
  • 有效期是多久?
posted @ 2024-11-21 17:20  chendsome  阅读(37)  评论(0)    收藏  举报