赞
踩
关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;
有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。
推荐热榜内容:《C#实例:SQL如何添加数据》
-------------------------------------正文----------------------------------------
路由(Route)由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义,这篇文章主要介绍了gateway基本配置,需要的朋友可以参考下。
路由转发 + 执行过滤器链。
网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。
基本功能如下:
- 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之间的排序,数值越小越靠前,匹配优先级越高
- 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
按生命周期分类
按类型分类
- 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
创建自定义全局过滤器类 ,实现GlobalFilter和Ordered两个接口。
- /**
- * 定义全局过滤器,会对所有路由生效
- */
- @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;
- }
- }
在过滤器中检查请求中是否携带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;
- }
- }
- 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
感兴趣的同学辛苦 关注/点赞 ,持续分享逻辑、算法、管理、技术、人工智能相关的文章。
博主其它经典原创:《管理心得--如何高效进行跨部门合作》,《技术心得--如何成为优秀的架构师》、《管理心得--如何成为优秀的架构师》、《管理心理--程序员如何选择职业赛道》,及
《C#实例:SQL如何添加数据》,《C#实战分享--爬虫的基础原理及实现》欢迎大家阅读。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。