idea离线安装 C语言 TCP连接 security gridview plugins websocket datagridview redis常用语句 mtu原理 controller vue路由 vue下载 nodejs视频教程 css最后一个子元素 数据库设计规范 c语言求和 js对象添加元素 mysql查询结果拼接 python如何注释 python环境设置 python读取数据库 python零基础 java生成当前时间 linux命令行大全 dep robotstudio 掌门一对一下载 微信猜拳 cad视口旋转 发射爱心的图片 php随机数函数 正则表达式数字 oledbconnection jquery下载 任务管理软件 桌面系统 regedit打不开 ps二寸照片制作教程 winrar无广告版
当前位置: 首页 > 学习教程  > 编程语言

springcloud微服务之gateway使用,附件创建项目说明,各种断言使用和过滤器使用说明

2020/11/4 14:33:41 文章标签:

文章目录前言1.gateway API 网关2.gateway网关的关键词汇1)Route 路由2)Predicate 断言3)Filter 过滤器4.项目搭建5.gateway网关详细使用说明5.1初次体验使用5.2路由(uri)使用固定路由:动态路由:5.3断言(predicates&am…

文章目录

  • 前言
  • 1.gateway API 网关
  • 2.gateway网关的关键词汇
    • 1)Route 路由
    • 2)Predicate 断言
    • 3)Filter 过滤器
  • 4.项目搭建
  • 5.gateway网关详细使用说明
    • 5.1初次体验使用
    • 5.2路由(uri)使用
      • 固定路由:
      • 动态路由:
    • 5.3断言(predicates)使用
      • 1)After:配置在某个时间之后转发路由
      • 2)Before:配置在某个时间之前转发路由
      • 3)Between:配置在时间范围内转发路由
      • 4)Cookie:cookie值判断转发路由
      • 5)Header:Header值判断转发路由
      • 6)Host: 配置Host值转发路由
      • 7)Method:配置请求方式转发路由
      • 8)Path:配置请求路径转发路由
      • 9)Query:配置请求参数转发路由
      • 10)RemoteAddr:配置远程地址转发路由
      • 11)Weight:权重转发路由
      • 12)断言的组合使用
    • 5.4过滤器(Filters)使用
    • GatewayFilter网关过滤器
      • 1)RewritePath:重写请求路径
      • 2)PrefixPath:追加路径前缀
      • 3)StripPrefix:切割路径
    • 全局网关过滤器


前言

学习总结都是在gateway官网的api文件学习:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#configuration-properties
什么是网关?网关有什么用?有什么好处?可以做什么?处理什么问题?这些我不说了,我这里主要说是怎么使用。


1.gateway API 网关

简单理解:API网关是一个服务器,是系统的唯一入口

2.gateway网关的关键词汇

1)Route 路由

网关的基本构建块。它由ID,目标URI,断言集合(predicates)和过滤器集合(filters)定义。如果聚合断言为true,则匹配路由。

2)Predicate 断言

输入类型是Spring FrameworkServerWebExchange。这使您可以匹配HTTP请求中的所有内容,例如标头或参数。

3)Filter 过滤器

这些是使用特定工厂构造的Spring FrameworkGatewayFilter实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

4.项目搭建

看文章:微服务-创建springcloud项目框架

5.gateway网关详细使用说明

5.1初次体验使用

1)在gateway服务配置写上这个,然后直接启动服务

spring:
  cloud:
    gateway:
      routes:
        - id: test
          uri: https://example.org/
          predicates:
            - Path=/test

2)打开浏览器输入:http://127.0.0.1:8180/test 就会转发到:https://example.org/test

5.2路由(uri)使用

uri就是网关要代理地址

固定路由:

固定路由就是直接配置转发地址,就是那些请求转发到这个服务器地址,只能是单一

动态路由:

动态路由是针对注册中心使用的,网关服务注册到注册中心,然后使用微服务的名字来转发,当服务有多个的时候,就可以达到负载均衡的作用
例如:

uri: lb://server1

5.3断言(predicates)使用

1)After:配置在某个时间之后转发路由

所述After路由,只有一个参数datetime(类型是Java 的ZonedDateTime对象)。predicates匹配在指定日期时间之后发生的请求。
中国的时区是:Asia/Shanghai
下面的示例配置路由:
意思是在2020年10月20号之后就会转发,时间没到就不会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: https://example.org
          predicates:
            - After=2020-10-20T00:00:00.000+08:00[Asia/Shanghai]

2)Before:配置在某个时间之前转发路由

所述Before路由,只有一个参数datetime(类型是Java 的ZonedDateTime对象)。predicates匹配在指定日期时间之前发生的请求。
中国的时区是:Asia/Shanghai
下面的示例配置路由:
意思是在2020年10月20号之前就会转发,时间过了就不会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: before_route
          uri: https://example.org
          predicates:
            - Before=2020-10-20T00:00:00.000+08:00[Asia/Shanghai]

3)Between:配置在时间范围内转发路由

所述Between路由,有两个参数,datetime1并且datetime2 (类型是Java的ZonedDateTime对象)。predicates匹配是指时间datetime1和时间datetime2之间。
下面的示例配置路由:
意思是在2020年10月20号和2020年10月21号之间才会转发,时间不在范围之内就不会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: between_route
          uri: https://example.org
          predicates:
            - Between=2020-10-20T00:00:00.000+08:00[Asia/Shanghai],2020-10-21T00:00:00.000+08:00[Asia/Shanghai]

4)Cookie:cookie值判断转发路由

所述Cookie路由,有两个参数,该cookie的nameregexp(regexp就是value,支持Java正则表达式),predicates匹配是指cookie的值是不是匹配。
下面的示例配置路由:
意思是cookie值的token等于123才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: cookie_route
          uri: https://example.org
          predicates:
          	- Cookie=token, 123

注:想要多个cookie值匹配,就多配几个:- Cookie=token, 123,如下

spring:
  cloud:
    gateway:
      routes:
        - id: cookie_route
          uri: https://example.org
          predicates:
          	- Cookie=token, 0
          	- Cookie=token1, 1
          	- Cookie=token2, 2

5)Header:Header值判断转发路由

所述Header路由,有两个参数,该Header的nameregexp(regexp就是value,支持Java正则表达式),predicates匹配是指Header的值是不是匹配。
下面的示例配置路由:
意思是Header头X-Request-Id等于数字(一个或者多个)才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: https://example.org
          predicates:
          	- Header=X-Request-Id, \d+

注:想要多个Header值匹配,就多配几个:- Header=X-Request-Id, \d+

6)Host: 配置Host值转发路由

所述Host路由,有一个参数,主机名的列表patterns(多个列名用逗号隔开),predicates匹配是指与Host匹配模式的标头匹配。
下面的示例配置路由:

spring:
  cloud:
    gateway:
      routes:
        - id: host_route
          uri: https://example.org
          predicates:
            - Host=**.somehost.org,**.anotherhost.org

7)Method:配置请求方式转发路由

所述Method路由,有一个参数,断言需要methods的参数(POST,GET),它是一个或多个参数:predicates匹配是指HTTP方法来匹配。
下面的示例配置路由:
意思是请求方式是POST或者是GET才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: method_route
          uri: https://example.org
          predicates:
            - Method=GET,POST

8)Path:配置请求路径转发路由

所述Path路由,有一个参数(多个path用逗号分隔)
下面的示例配置路由:
意思是请求路径是/a/xx和/b/xx,(例如/a/test,/b/test/123)才会转发到https://example.org ,并把路径追加到后面(https://example.org/a/test 或者 https://example.org/b/test/123)

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: https://example.org
          predicates:
            - Path=/a/**,/b/**

9)Query:配置请求参数转发路由

所述Query路由,有两个参数,该Query的nameregexp(regexp就是value,支持Java正则表达式),predicates匹配是指请求的参数的值是不是匹配。
下面的示例配置路由:
意思是请求参数值的green等于数字才会转发到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: Query_route
          uri: https://example.org
          predicates:
            - Query=green,\d+

注:多个参数就写多个- Query=green,\d+
如果不想出参数值有限制,可以不写:- Query=green

10)RemoteAddr:配置远程地址转发路由

所述RemoteAddr路由,有一个参数
如192.168.0.1/16(其中192.168.0.1是一个IP地址和16一个子网掩码)
下面的示例配置路由:

spring:
  cloud:
    gateway:
      routes:
        - id: RemoteAddr_route
          uri: https://example.org
          predicates:
            - RemoteAddr=127.0.0.1

11)Weight:权重转发路由

下面的示例配置路由:
这条路线会将大约80%的流量转发到weighthigh.org,将大约20%的流量转发到weightlow.org。

spring:
  cloud:
    gateway:
      routes:
        - id: weight_high
          uri: https://weighthigh.org
          predicates:
            - Weight=group1, 8
        - id: weight_low
          uri: https://weightlow.org
          predicates:
            - Weight=group1, 2

12)断言的组合使用

请求需要满足,请求方式是POST,路径是/a/xx,带参数green,参数是数字,cookie值是token-1,才会路由到https://example.org

spring:
  cloud:
    gateway:
      routes:
        - id: all_route
          uri: https://example.org
          predicates:
            - Method=POST
            - Path=/a/**
            - Query=green,\d+
            - Cookie=token, 1

5.4过滤器(Filters)使用

spring cloud gateway的过滤器作用范围划分为GatewayFilterGlobalFilter,二者区别:

  • GatewayFilter:网关过滤器
    通过spring.cloud.routes.filters配置在具体路由下,只作用在当前路由
    通过spring.cloud.default-filters配置在全局,只作用在所有路由上

  • GlobalFilter:全局过滤器

    不需要在配置文件中配置,作用在所用的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换成真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。

过滤器太多了,我这边选出几个常用的

GatewayFilter网关过滤器

1)RewritePath:重写请求路径

对于的请求路径/red/blue,这会将路径设置为/blue发出下游请求之前的路径

spring:
  cloud:
    gateway:
      routes:
        - id: rewritepath_route
          uri: https://example.org
          predicates:
            - Path=/red/**
          filters:
            - RewritePath=/red(?<segment>/?.*), $\{segment}

2)PrefixPath:追加路径前缀

这将/mypath作为所有匹配请求的路径的前缀。因此,/hello将向发送请求/mypath/hello

spring:
  cloud:
    gateway:
      routes:
        - id: prefixpath_route
          uri: https://example.org
          filters:
            - PrefixPath=/mypath

3)StripPrefix:切割路径

通过网关/name/blue/red发出请求时,发出的请求nameservice看起来像nameservice/red

spring:
  cloud:
    gateway:
      routes:
        - id: nameRoot
          uri: https://nameservice
          predicates:
            - Path=/name/**
          filters:
            - StripPrefix=2

全局网关过滤器

第一步:实现接口GlobalFilter, Ordered
第二步:@Component添加到组件里,就是注入到bean
也可以在启动类上加:

@Bean
public GlobalFilter customFilter() {
    return new CustomGlobalFilter();
}

样例实现:

@Component
public class CustomGlobalFilter  implements GlobalFilter, Ordered {

    /**
     * 过滤器业务逻辑
     *
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
       System.out.println("custom global filter");
        return chain.filter(exchange);
    }

    /**
     * 过滤器执行顺序,数值越小,优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

本文链接: http://www.dtmao.cc/news_show_350190.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?