Fork me on GitHub

SpringcloudAlibaba-GateWay

简介

Spring Cloud Gateway 基于Spring Boot 2.x、Spring WebFlux和Project Reactor,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它的目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。
SpringCloud GateWay使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。
特点:

GateWay核心的流程就是:路由转发+执行过滤器链.

代码

  • 父项目添加依赖
           <spring.cloud-version>Hoxton.SR5</spring.cloud-version>
           <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
 
  • GateWay添加依赖
       <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
  • GateWay的YML配置
server:
  port: 9012
spring:
  application:
    name: nacos-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #Nacos服务注册中心地址
    gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
      routes:
      - id: nacos-config
        uri: lb://nacos-config
        predicates:
        - Path=/getGateWay/**
        - After=2022-01-07T14:39:10.529+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通
  • GateWay添加过滤器
package com.yxkj.nacosspringcloudgatewayexample.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

/**
 * @program:FoundationStudy
 * @Author: zhuyang
 * @Date: 2022/02/13/18:39
 * @Description:
 */
@Component
@Slf4j
public class MyFilter implements Ordered, GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        log.info("*************MyFilter:"+new Date());
        if("zs".equals(username)){
            log.info("**********用户名为zs,非法用户,请求被拒绝!");
            //如果username为空,返回状态码为406,不可接受的请求
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        //进入下一个过滤器
        return chain.filter(exchange);
    }

    /**
     * @Description: 加载过滤器的顺序
     * @Author: zhuyang
     * @Date:  2022-02-13
     * @Param:  整数数字越小优先级越高
     * @return: 
     **/
    @Override
    public int getOrder() {
        return 0;
    }
}
  • 子项目分别添加请求接口
    @GetMapping("/getGateWay")
    public String getGateWay(String username){
        return "GateWay进行访问,传入username:"+username;
    }

进行测试

http://127.0.0.1:9012/getGateWay?username=zss:正常请求
image
http://127.0.0.1:9012/getGateWay?username=zs:错误请求,被过滤器进行过滤
image

Gitee地址

https://gitee.com/zhuayng/foundation-study/tree/develop/OtherFrame/SpringCloudAlibaba/nacos-spring-cloud-example/nacos-spring-cloud-gateway-example

posted @ 2022-02-13 19:01  晨度  阅读(289)  评论(0编辑  收藏  举报