美文网首页
SpringCloud Alibaba之Gateway(网关)

SpringCloud Alibaba之Gateway(网关)

作者: 索性流年 | 来源:发表于2020-05-11 15:56 被阅读0次

来自蚂蚁课堂
链接:http://www.mayikt.com/

概述

  • 该项目提供了一个用于在Spring MVC之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注,例如:安全性,监视/指标和弹性。

Spring Cloud Gateway功能:

  • 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上
  • 能够匹配任何请求属性上的路由。
  • 谓词和过滤器特定于路由。
  • Hystrix断路器集成。
  • Spring Cloud DiscoveryClient集成
  • 易于编写的谓词和过滤器
  • 请求速率限制
  • 路径改写

pom引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

yml添加配置

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        ##服务的注册
        server-addr: 192.168.112.144:8848
      config:
        server-addr: 192.168.112.144:8848
        file-extension: yaml

    gateway:
      routes:
        - id: mayikt-weixin
          uri: lb://mayikt-weixin
          predicates:
            - Path=/mayikt-weixin/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1
        - id: mayikt-member
          uri: lb://mayikt-member
          predicates:
            - Path=/mayikt-member/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1
      x-forwarded:
        enabled: false
      discovery:
        locator:
          enabled: true

  application:
    name: mayikt-gateway


简单过滤器新建.class配置类

/*自定义全局过滤器*/
@Component
public class FluidControlGlobalGatewayFilter implements GlobalFilter, Ordered {
    @Autowired
    private RedisUtil redisUtil;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //        请求信息
        ServerHttpRequest request = exchange.getRequest();
        //        返回信息
        ServerHttpResponse response = exchange.getResponse();
        //        如若为接口文档放行
        if (request.getURI().toString().contains("api-docs")) {
            return chain.filter(exchange);
        }

        
        //        如若请求会员服务直接放行
        if (request.getURI().toString().contains("ly-weixin")) {
            return chain.filter(exchange);
        }


        //        获取请求头
        String token = exchange.getRequest().getHeaders().getFirst("token");
        //        如若token不为空
        if (!StringUtils.isEmpty(token)) {
            // redisUtil 网上搜的工具类,一搜一堆
            String userId = redisUtil.get(token);
            //            如若userId不为空
            if (!StringUtils.isEmpty(userId)) {
                // 移除旧 token 防止重复使用
                redisUtil.delete(token);
                // 在相应头中设置新 token
                String responseToken = TokenUtils.getToken("token", "");
                response.getHeaders().add("token", responseToken);
                // 放行
                return chain.filter(exchange);
            }
        }

        response.setStatusCode(HttpStatus.BAD_REQUEST);
        String jsonString = this.setDataBuffer(500, "token is null", null).toJSONString();
        DataBuffer buffer = response.bufferFactory().wrap(jsonString.getBytes());

        return response.writeWith(Mono.just(buffer));
//        return chain.filter(exchange);
    }

    private JSONObject setDataBuffer(Integer code, String message, Object data) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", code);
        jsonObject.put("msg", message);
        jsonObject.put("data", data);
        return jsonObject;
    }

    @Override
    public int getOrder() {
        return -1000;
    }
}

相关文章

网友评论

      本文标题:SpringCloud Alibaba之Gateway(网关)

      本文链接:https://www.haomeiwen.com/subject/mhaeactx.html