SpringCloud-Gateway 网关

boot版本:2.0.6
cloud版本:Finchley.SR2

网关基本的功能:安全(黑白名单)、监控/埋点、熔断、限流等...

核心概念(router、predicates、filter)

路由。路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配

断言。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。

过滤器。一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

spring cloud gateway路由配置

网关最关键的配置是:router,如果写过前后端分离,一定对前端页面的路由(router)有很深的印象。网关的路由和前端的路由功能类似,转发请求到对应的服务上。下面看以下配置:

spring:  
  cloud:
    gateway:
      routes:
        - id: user_route
          uri: lb://yu-user-service-consul
          predicates:
            - Path=/users/**
        - id: third_route
          uri: lb://yu-third-service-consul
          predicates:
            - Path=/third/**

这个配置含义,可以分成两部分,一部分是现实的含义,一部分是隐含的含义:

  • 显示的含义,所有以/users/开头的请求都会被转发到user-service-consul这个服务上,lb代表从注测中心查找user-service-consul的服务进行使用;
  • 隐含的含义,所有的以/users/开头的请求都会经过所有的全局GatewayFilter的处理;

注意,id的配置没有特殊的含义,仅仅标识router。lb对应的是在consul注册的服务名

 

spring cloud gateway跨域配置

请看如下跨域配置:

spring:  
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]'://匹配所有的请求
            allowedOrigins: "*"// 允许的请求域
            allowedMethods:
              - GET,HEAD,PUT,POST,DELETE,OPTION// 允许的方法
            allowedHeaders:
              - memberid,token// 允许的请求头部

 

gateway的filter

在路由配置中说到一个问题,请求会经过所有全局GatewayFilter的处理。因此下面介绍以下gateway的filter。

gateway的filter分为两类:

  • 全局filter,所有的请求都会经过全局filter的处理
  • 非全局filter,自由特定的请求才会被处理

其实系统默认的filter,用的很少,大多数都是自定义filter。下面介绍有以下如何定义filter。

自定义全局filter

@Component
public class XXXGlobleFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("XXXGlobleFilter>>>>>>>>>>>>>>");
        Message message;
        ServerHttpRequest request = exchange.getRequest();
        //业务处理
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 1;
    }
}

自定义全局filter要求实现GlobalFilter和Ordered接口,Ordered接口用于确定自定义filter的执行顺序,GlobalFilter用于实现自定义filter的逻辑。

自定义GatewayFilter:

 @Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {
    public MyGatewayFilterFactory() {
        super(Config.class);
    }
    @Override
    public GatewayFilter apply(Config config) {
        System.out.println("MyGatewayFilterFactory 正在执行");
        return (exchange, chain) -> chain.filter(exchange);
    }
    @Override
    public List<String> shortcutFieldOrder()
    {
        return Arrays.asList("my");
    }
    public static class Config {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}

自定义非全局filter要求实现GatewayFilter和Ordered接口,Ordered接口用于确定自定义filter的执行顺序,GatewayFilter用于实现自定义filter的逻辑。

如何使用自定义filter

1、如何使用自定义全局filter?

只要在自定义的全局filter上,添加@Component注解就可以使用,不需要其它配置。

2、如何使用自定义非全局filter?

配置如下:

spring:
  cloud:
    gateway:
      routes:
      - id: user_router
        uri: lb://yu-user-service-consul
        predicates:
        - Path=/users/**
        filters:
        # 关键在下面一句,值为true则开启认证,false则不开启
        # 这种配置方式和spring cloud gateway内置的GatewayFilterFactory一致
        - GatewayFilterFactory=true

ordered的值越大,优先级越低,越靠后执行

 

 

使用上个版本的代码创建项目 yu-gateway,在consul上新建配置文件 yu-gateway,dev

spring:  
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods:
              - GET,HEAD,PUT,POST,DELETE,OPTION
            allowedHeaders:
              - memberid,token
      routes:
        - id: user_route
          uri: lb://yu-user-service-consul
          predicates:
            - Path=/users/**
        - id: third_route
          uri: lb://yu-third-service-consul
          predicates:
            - Path=/third/**

      discovery:
        locator:
          enabled: true

pom.xml引入依赖

        <!-- 与 gateway冲突 因为spring cloud gateway是基于webflux的,
        如果非要web支持的话需要导入spring-boot-starter-webflux
        而不是spring-boot-start-web -->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-web</artifactId>-->
<!--        </dependency>-->
        <!-- 网关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

 

application.yml配置

server:
  port: 16000
spring:
  application:
    name: yu-gateway #服务名称(consul默认注册的id 为 应用服务名+端口)
  profiles:
    active: dev #选择哪个配置
  redis:
    database: 11

bootstrap.yml(先加载)

spring:
  cloud:
    consul:
      host: localhost
      port: 8500
      config:
        data-key: data #自定义配置文件路径
        format: yaml
        name: yu-gateway  #读指定配置文件(找不到默认为application)
      discovery:
        service-name: yu-gateway-consul #consul 注册服务名称
        register: true

启动 consul(port:8500),yu-gateway(port:16000),yu-user-service(port:16001),yu-third-service(port:16002)

例如 在user服务 创建接口 users/gateway/test,通过

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值