springcloud-网关路由gateway

简介

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

Spring Cloud Gateway 底层使用了高性能的通信框架Netty。

特性

SpringCloud官方,对SpringCloud Gateway 特征介绍如下:

(1)基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
(2)集成 Hystrix 断路器
(3)集成 Spring Cloud DiscoveryClient
(4)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
(5)具备一些网关的高级功能:动态路由、限流、路径重写

从以上的特征来说,和Zuul的特征差别不大。SpringCloud Gateway和Zuul主要的区别,还是在底层的通信框架上。

SpringCloud Gateway主要包含三个部分:

1. Filter(过滤器):

和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。

2. Route(路由):

网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。

3. Predicate(断言):

这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。

代码实现:

1. 首先创建spring-cloud-gateway模块:

2. 修改pom.xml



    4.0.0
    
        com.example
        spring-cloud-wsl
        0.0.1-SNAPSHOT
    
    com.example
    spring-cloud-gateway
    0.0.1-SNAPSHOT
    spring-cloud-gateway
    Demo project for Spring Cloud Gateway

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
    



3. 配置文件application.yml:

server:
  port: 8888
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: gateway-consumer-feign  # 路由ID,命名随意,保证唯一性就可以
          uri: lb://consumer-feign    # 采用 LoadBalanceClient 方式请求,以 lb:// 开头,后面的是注册在eureka上的服务名
          predicates:
            - Method=GET,POST         # Method 方法谓词,这里是匹配 GET 和 POST 请求

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

4. 启动各个服务:

依次启动注册中心、配置中心、服务提供者、服务调用者和spring cloud gateway
浏览器输入http://localhost:8888/feign/test/wangshilin

5. 添加过滤器:

@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");

        if (token == null || token.isEmpty()) {
            ServerHttpResponse response = exchange.getResponse();

            // 封装错误信息
            Map responseData = Maps.newHashMap();
            responseData.put("code", 401);
            responseData.put("message", "非法请求");
            responseData.put("cause", "Token is empty");

            try {
                // 将信息转换为 JSON
                ObjectMapper objectMapper = new ObjectMapper();
                byte[] data = objectMapper.writeValueAsBytes(responseData);

                // 输出错误信息到页面
                DataBuffer buffer = response.bufferFactory().wrap(data);
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
                return response.writeWith(Mono.just(buffer));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return chain.filter(exchange);
    }

    /**
     * 设置过滤器的执行顺序
     *
     * @return
     */
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

6. 重启spring-cloud-gateway服务并在浏览器输入http://localhost:8888/feign/test/wangshilin


因为没有传token参数,返回了我们过滤器自定义的错误

7. 浏览器输入http://localhost:8888/feign/test/wangshilin?token=123

路由转发调用成功

之后会继续更新关于spring cloud gateway的一些路由规则,敬请期待!

你可能感兴趣的:(springcloud-网关路由gateway)