欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

gateway基本配置教程,

来源: javaer 分享于  点击 4380 次 点评:35

gateway基本配置教程,


目录
  • 1、gateway简介
  • 2、gateway核心概念
  • 3、路由
  • 4、断言
  • 5、过滤器
    • 5.1、过滤器介绍
    • 5.2、内置局部过滤器与使用
    • 5.3、内置全局过滤器
    • 5.4、自定义全局过滤器
      • 5.4.1、黑名单校验
      • 5.4.2、模拟登录校验
  • 6、一个简单的gateway配置实例

    1、gateway简介

    路由转发 + 执行过滤器链。

    网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。
    基本功能如下:

    • 统一入口:暴露出网关地址,作为请求唯一入口,隔离内部微服务,保障了后台服务的安全性
    • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
    • 动态路由:动态的将请求路由到不同的后端集群中

    2、gateway核心概念

    • 路由(Route):由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义。如果断言为真,则路由匹配。
    • 断言(Predicate):通过断言匹配http请求中的任何内容(请求头、请求参数等),如果匹配成功,则匹配断言所在路由。
    • 过滤器(Filter):在请求前后执行业务逻辑,比如鉴权、日志监控、流量控制、修改请求头、修改响应等。

    3、路由

    spring:
      cloud:
    	gateway:
    	  routes:
    	  - id: manager						# 路由唯一标识
    		uri: lb://manager_server		# 路由指向目的地URL或服务名,客户端请求最终被转发到的微服务
    		predicates:
    		- Path=/manager/** 				# 断言:以manager开头的请求都负载到manager_server服务
    		filters:
    		- RewritePath=/manager/(?<segment>.*), /$\{segment} # 过滤器:过滤掉url里的manager,例如http://ip:port/manager/test -> http://ip:port/test
    		order: 5						# 用于多个Route之间的排序,数值越小越靠前,匹配优先级越高

    4、断言

    spring:
      cloud:
        gateway:
          routes:
          - id: manager
            uri: https://manager_server
            predicates:
            - After=2017-01-20T17:42:47.789-07:00[America/Denver]	# 时间点后匹配
    		- Before=2017-01-20T17:42:47.789-07:00[America/Denver]	# 时间点前匹配
    		- Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver]	# 时间区间匹配
    		- Cookie=chocolate, ch.p						# 指定cookie正则匹配
    		- Header=X-Request-Id, \d+						# 指定Header正则匹配
    		- Host=**.somehost.org,**.anotherhost.org		# 请求Host匹配
    		- Method=GET,POST								# 请求Method匹配指定请求方式
    		- Path=/red/{segment},/blue/{segment}			# 请求路径正则匹配
    		- Query=green									# 请求包含某参数
    		- Query=red, gree.								# 请求包含某参数并且参数值匹配正则表达式(匹配red;green,greet,gree...)
    		- RemoteAddr=192.168.1.1/24						# 远程地址匹配
    		# 设置分组和权重,按照路由权重选择同一个分组中的路由
          - id: preManager1
            uri: https://preManager1
            predicates:
    		- Weight=group1, 2
          - id: preManager2
            uri: https://preManager2
            predicates:
    		- Weight=group1, 8

    5、过滤器

    5.1、过滤器介绍

    按生命周期分类

    • 前置(pre)过滤器: 在请求被路由之前调用:在chain.filter(exchange)前编写过滤器逻辑
    • 后置(post)过滤器: 在路由到微服务之后调用:通过chain.filter(exchange).then(Mono.fromRunnable(() -> {过滤器逻辑})实现

    按类型分类

    • 局部(GatewayFilter)过滤器:作用在某一个路由上,使用时需要关联指定的路由
    • 全局(GlobalFilter)过滤器:作用在所有路由上,不需要在配置文件中配置

    5.2、内置局部过滤器与使用

    spring:
      cloud:
        gateway:
          routes:
          - id: gateway_filter
            uri: https://example.org
    		predicates:
            - Path=/red/{segment}
            filters:
    		# 1、为原始请求添加Header。headerName:X-Request-red,headerValue:blue。
            - AddRequestHeader=X-Request-red, blue		
    		- AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green
    		# 2、为原始请求添加参数。参数名,参数值
    		- AddRequestParameter=red, blue
    		# 3、为原始响应添加Header
    		- AddResponseHeader=X-Response-Red, Blue
    		# 4、剔除响应头中重复的值
    		- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
    		# 5、为原始请求路径添加前缀
    		- PrefixPath=/mypath
    		# 6、配置该过滤器后,会原始请求的host头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。
    		- PreserveHostHeader
    		# 7、将原始请求重定向到指定的URL,参数为http状态码及重定向的url
    		- RedirectTo=302, https://acme.org
    		# 8、移除响应Body中的指定key
    		- RemoveJsonAttributesResponseBody=id,color
    		# 9、移除原始请求中的指定Header
    		- RemoveRequestHeader=X-Request-Foo
    		# 10、移除原始请求中的指定参数
    		- RemoveRequestParameter=red
    		# 11、移除响应中的指定Header
    		- RemoveResponseHeader=X-Response-Foo
    spring:
      cloud:
        gateway:
          routes:
          - id: gateway_filter
            uri: https://example.org
    		predicates:
            - Path=/red/{segment}
            filters:
    		# 12、请求限流,限流算法为令牌桶,以下示例为根据用户id做限流
    		# @Configuration
    		# public class RateLimiterConfig {
    		#	  @Bean
    		#	  public KeyResolver userKeyResolver() {
    		#		  return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getQueryParams().getFirst("userId")));
    		#     }
    		# }
    		- name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10	# 允许用户每秒处理的请求数
                redis-rate-limiter.burstCapacity: 20	# 令牌桶的容量,即允许在 1 秒内完成的最大请求数。设置为 0 则表示拒绝所有请求。
                key-resolver: "#{@userKeyResolver}"		# 一个引用名为 userKeyResolver 的 bean 的 SpEL 表达式
    		# 13、重写原始的请求路径
    		- RewritePath=/red/?(?<segment>.*), /$\{segment}
    		# 14、重写响应中的某个Header
    		- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
    		# 15、在转发请求之前,强制执行websession::save操作,保存会话状态
    		- SaveSession
    		# 16、修改原始的请求路径
    		- SetPath=/{segment}
    		# 17、修改原始请求中的指定Header值
    		- SetRequestHeader=X-Request-Red, Blue
    		# 18、修改原始响应中的指定Header值
    		- SetResponseHeader=X-Response-Red, Blue
    		# 19、修改原始响应的响应码
    		- SetStatus=401
    		# 20、剥离原始请求路径
    		- StripPrefix=2
    		# 21、请求重试
    		- name: Retry
              args:
                retries: 3						# 重试次数
                statuses: BAD_GATEWAY			# 应被重试的 HTTP Status Codes
                methods: GET,POST				# 应被重试的 HTTP Methods
                backoff:						# 为重试配置指数级的 backoff。重试时间间隔的计算公式为 firstBackoff * (factor ^ n),n 是重试的次数;如果设置了 maxBackoff,最大的 backoff 限制为 maxBackoff. 如果 basedOnPreviousValue 设置为 true, backoff 计算公式为 prevBackoff * factor.
                  firstBackoff: 10ms
                  maxBackoff: 50ms
                  factor: 2
                  basedOnPreviousValue: false
    		# 22、设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返413Payload Too Large
    		- name: RequestSize
              args:
                maxSize: 5000000

    5.3、内置全局过滤器

    • GatewayMetricsFilter(0):统计一些网关的性能指标
    • RouteToRequestUrlFilter(10000):把浏览器的URL请求的Path路径添加到路由的URI之中。
    • NettyRoutingFilter(2147483647):通过HttpClient客户端转发真实的URL,并存储返回的结果。
    • NettyWriteResponseFilter(-1):在所有的其它的过滤器执行完成之后运行,将响应的数据发送给网关的客户端。
    • ForwardRoutingFilter(2147483647):转发路由过滤器,若URI是forward模式,过滤器会将请求转发到DispatcherHandler来处理请求。
    • ForwardPathFilter(0):解析路径,并将路径转发。
    • LoadBalancerClientFilter(10100):负载均衡,解析服务名,获取真实服务地址。
    • RemoveCachedBodyFilter(-2147483648):清除网关上下文中的缓存的请求Body。
    • WebsocketRoutingFilter(2147483646):如果请求中的ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 属性对应的URL前缀为 ws 或 wss,会使用Spring Web Socket 模块转发WebSocket请求。WebSockets可以使用路由进行负载均衡。
    • AdaptCachedBodyGlobalFilter(-2147482648):从请求中获取body缓存到网关上下文。

    5.4、自定义全局过滤器

    创建自定义全局过滤器类 ,实现GlobalFilter和Ordered两个接口。

    • GlobalFilter:全局过滤拦截器
    • Ordered:拦截器的顺序,数字越低,优先级越高

    5.4.1、黑名单校验

    /**
    * 定义全局过滤器,会对所有路由生效
    */
    @Slf4j
    @Component // 让容器扫描到,等同于注册了
    public class BlackListFilter implements GlobalFilter, Ordered {
    	// 模拟黑名单(实际可以去数据库或者redis中查询)
    	private static List<String> blackList = new ArrayList<>();
    	static {
    		blackList.add("0:0:0:0:0:0:0:1"); // 模拟本机地址
    	}
    	/**
    	* 过滤器核心方法
    	* @param exchange 封装了request和response对象的上下文
    	* @param chain 网关过滤器链(包含全局过滤器和单路由过滤器)
    	* @return
    	*/
    	@Override
    	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    		// 思路:获取客户端ip,判断是否在黑名单中,在的话就拒绝访问,不在的话就放行
    		ServerHttpRequest request = exchange.getRequest();
    		ServerHttpResponse response = exchange.getResponse();
    		// 从request对象中获取客户端ip
    		String clientIp = request.getRemoteAddress().getHostString();
    		// 拿着clientIp去黑名单中查询,存在的话就决绝访问
    		if(blackList.contains(clientIp)) {
    			// 拒绝访问,返回
    			response.setStatusCode(HttpStatus.UNAUTHORIZED); // 状态码
    			log.debug("=====>IP:" + clientIp + " 在⿊名单中,将被拒绝访问!");
    			String data = "Request be denied!";
    			DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
    			return response.writeWith(Mono.just(wrap));
    		}
    		// 合法请求,放行,执行后续的过滤器
    		return chain.filter(exchange);
    	}
    	/**
    	* @return 过滤器的顺序(优先级),数值越小,优先级越高
    	*/
    	@Override
    	public int getOrder() {
    		return 0;
    	}
    }

    5.4.2、模拟登录校验

    在过滤器中检查请求中是否携带token请求头。如果token请求头存在则放行;如果token为空或者不存在则返回认证失败状态码。

    @Component
    public class MyGlobalFilter implements GlobalFilter,Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            boolean token = exchange.getRequest().getHeaders().containsKey("token");
            System.out.println("----全局过滤器token----"+token);
            if (!token){
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                ServerHttpResponse response = exchange.getResponse();
                return response.setComplete();
            }
            return chain.filter(exchange);
        }
        @Override
        public int getOrder() {
            return 1;
        }
    }

    6、一个简单的gateway配置实例

    spring:
      cloud:
        gateway:
          discovery:
            locator:
              # 表明Gateway开启服务注册和发现的功能,并且Spring Cloud Gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
              enabled: true
              # 将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了)
              lower-case-service-id: true
          routes:
    	  # 系统管理
          - id: sys-mgt
            uri: lb://sysmgt
            predicates:
            - Path=/sys-mgt/** 	#以sys-mgt开头的请求都负载到sysmgt服务
    		- Method=GET		#只匹配GET请求
            filters:
            - RewritePath=/sys-mgt/(?<segment>.*), /$\{segment} #过滤掉url里的sys-mgt,例如http://ip:port/sys-mgt/test -> http://ip:port/test
    		- PrefixPath=/mgt									#为请求添加/mgt前缀,再结合RewritePath过滤器,http://ip:port/sys-mgt/test -> http://ip:port/mgt/test

    到此这篇关于gateway基本配置的文章就介绍到这了,更多相关gateway基本配置内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • Spring gateway + Oauth2实现单点登录及详细配置
    • 解决SpringCloud Gateway配置自定义路由404的坑
    • Nacos+Spring Cloud Gateway动态路由配置实现步骤
    • spring cloud gateway跨域全局CORS配置方式
    • spring cloud gateway使用 uri: lb://方式配置时,服务名的特殊要求
    相关栏目:

    用户点评