网关路由快速入门

  1. 在Spring Boot中整合Spring Cloud Gateway是一个常见的需求,尤其是当需要构建一个微服务架构的应用程序时。Spring Cloud Gateway是Spring Cloud生态系统中的一个项目,它提供了一个API网关,用于处理服务之间的请求路由、安全、监控和限流等功能。

  2. 使用

    • 引入依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
    • 进行配置
    server:
      port: 9527
     
    spring:
      application:
        name: cloud-gateway
      cloud:
        nacos:
          server-addr: localhost:8848 		 # nacos 地址
        gateway:
          routes:
            - id: user_service #路由的ID,没有固定规则但要求唯一,建议配合服务名
              uri: lb://user_service #匹配后提供服务的路由地址
              predicates:
                - Path=/users/**         # 断言,路径相匹配的进行路由
              filters: 					   # 过滤器配置
                - AddRequestHeader=token, test # 添加请求头
    
  3. 多种配置

    • Predicate 断⾔条件

    • 路由过滤器

    • 默认过滤器配置

    spring:
      cloud:
        gateway:
          routes:
            - id: user-service 
              uri: lb://userservice 
              predicates: 
              - Path=/user/**
          default-filters: 					# 默认过滤器配置
            - AddRequestHeader=token, test  # 添加请求头
    
  4. 自定义全局路由过滤器: order数值越大优先级越低, 负的越多, 优先级越高

    @Component
    public class GateWayFilter implements GlobalFilter, Ordered {
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
            // 1.获取请求参数 
            //1.这里的request并不是servlet中的request  
            //2.返回值是一个多键的map集合、也就是说这个map集合的键可以重复
            MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
            // 2.获取userName参数
            String userName = params.getFirst("userName");
            // 3.校验
            if ("root".equals(userName)) {
                // 放行
                return chain.filter(exchange);
            }
            // 4.拦截
            // 4.1.禁止访问,设置状态码
            exchange.getResponse().setStatusCode(500);
            // 4.2.结束处理
            return exchange.getResponse().setComplete();
        }
    
        @Override
        public int getOrder() {
            return -1;
        }
    }
    
  5. 设置order值的两种方式

    • 实现Ordered接口,并且重写getOrder方法
    @Component
    public class GateWayFilter implements GlobalFilter, Ordered {
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
        }
    
        @Override
        public int getOrder() {
            return -1;
        }
    }
    
    • 使用@Order注解
    @Order(-1)
    @Component
    public class GateWayFilter implements GlobalFilter, Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
        }
    }
    
  6. 过滤路由过滤器的执行顺序: 默认过滤器 → 当前路由过滤器 → 全局过滤器

  7. 网关的跨域(请求位置和被请求位置不同源就会发生跨域)问题:浏览器会禁止请求的发起者与服务端发生跨域AJAX请求

    • 解决方案:CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
    spring:
      cloud:
        gateway:
          globalcors: # 全局的跨域配置
            add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
            							# options请求 就是一种询问服务器是否浏览器可以跨域的请求
            							# 如果每次跨域都有询问服务器是否浏览器可以跨域对性能也是损耗
            							# 可以配置本次跨域检测的有效期maxAge
            							# 在maxAge设置的时间范围内,不去询问,统统允许跨域
            corsConfigurations:
              '[/**]':
                allowedOrigins: 		# 允许哪些网站的跨域请求 
                  - "http://localhost:8090"
                allowedMethods: 		# 允许的跨域ajax的请求方式
                  - "GET"
                  - "POST"
                  - "DELETE"
                  - "PUT"
                  - "OPTIONS"
                allowedHeaders: "*" 	# 允许在请求中携带的头信息
                allowCredentials: true	# 允许在请求中携带cookie
                maxAge: 360000 			# 本次跨域检测的有效期(单位毫秒)
                						# 有效期内,跨域请求不会一直发option请求去增大服务器压力
    
posted @   Hanyta  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示