网关Gateway

网关功能

  • 身份认证和权限校验
  • 服务路由、负载均衡
  • 请求限流

相关技术

image

搭建网关

  1. 创建新的module,引入SpringCloudGateway的依赖nacos的服务发现依赖:
<!--nacos服务发现依赖-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 编写路由配置及nacos地址
server:
  port: 10010  # 网关端口
spring:
  application:
    name: gateway  # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848  #nacos地址
    gateway:
      routes:
        - id: user-service  # 路由标识,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates:
            - Path=/user/**   # 路径断言,判断路径是否是以/user开头,如果是,则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

流程及总结:
image
image

路由断言工厂 Route Predicate Factory

image

路由过滤器 GatewayFilter

所处位置:
image
gateway文档
image

全局过滤器 GlobalFilter

image

@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> params = request.getQueryParams();
        // 2. 获取参数中的authorization 参数
        String auth = params.getFirst("authorization");
        // 3. 判断数值是否等于admin
        if ("admin".equals(auth)) {
            // 4. 是,执行
            return chain.filter(exchange);
        }
        // 5. 否,拦截
        // 5.1 设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 5.2 拦截请求
        return exchange.getResponse().setComplete();
    }
}

image

过滤器执行顺序

image
GatewayFilter,DefaultFilter,GlobalFilter最终都会被看作GatewayFilter
image

跨域问题

image

      globalcors:
        add-to-simple-url-handler-mapping: true   # 解决options请求拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 运行哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowed-methods:
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowed-headers: "*" # 允许在请求中携带的头信息
            allowCredentials: true  # 这次寡欲检测的有效期
posted @   HS文  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示