刘頔

Jan 04, 2023

GateWay

一、API网关

网关就是所有项目的一个统一入口
 
api网关作用就是把各个服务对外提供的api汇聚起来,让外接看起来是一个统一的接口,同事也可以在网关中提供额外的功能。

1 网关 = 路由转发 + 过滤器

2 Spring Cloud 中提供的网关解决方案

2.1 Spring Cloud Netflix Zuul

现在为啥会被替换:
  • 主要原因是因为,他的跟新替换是有 Netflix所主导的,为了适配 spring cloud 其发版具有延迟性。
  • 版本依赖于 Netflix zuul

2.2 Spring Cloud Gateway

  • spring 自己退出的网关产品,完全依赖于spring自家产品,版本由spring把控

2.3 Gateway 组成

  1. route 路由
  1. Predicate 谓词
  1. filter
spring: cloud: # 网关配置 gateway: # 打印请求日志(自定义) requestLog: true discovery: # 配置网关发现机制 locator: # 配置处理机制 # 只要请求地址符合规则: http://gatewayIP:gatewayPort/微服务名称/微服务请求地址 # 网关自动映射。把请求转发到 http://微服务名称/微服务请求地址 # 如:有微服务,命名是 ribbon-app-service # 请求地址是: http://localhost:9999/ribbon-app-service/getArgs?name=admin&age=20 # 自动转发到: http://ribbon-app-service/gatArgs?name=admin&age=20 # 商业开发中,enabled一般不设置,使用默认值false。避免不必要的自动转发规则。 lowerCaseServiceId: true # 开启服务名称大小写转化 enabled: true # 开启网关自动映射逻辑 routes: # 配置网关中的一个完整路由,包括命名、地址、谓词集合(规则)、过滤器集合 # 认证中心 - id: first # 路由定义的命名,唯一可用,命名规则符合Java中的变量符命名规则 # lb - 代表loadbalance uri: lb://ribbon-app-server # 当前路由定义对应的微服务转发地址 # 谓词,命名是有套路的,是GatewayPredicate接口实现的命名前缀,XxxRoutePredicateFactory predicates: - Path=/api/** # 定义一个谓词,格式:谓词名称=参数 或者 name:名字 args:参数 filters: # 配置过滤器集合 # 过滤转发地址前缀,过滤1节 # 如:请求地址 - http://localhost:9999/api/*** # 对应的谓词,规则是/api 符合 # 对应的uri是 lb://ribbon-app-server 转换成 http://ribbon-app-server 且包含负载均衡 # 转发地址是: http://ribbon-app-server/api/*** # 过滤器是 过滤转发地址前缀,过滤1节,即删除/api -> http://ribbon-app-server/*** - StripPrefix=1 # 定义一个过滤器。格式:过滤器名字=参数 或者 name:名字 args:参数
 

过滤器 Filter

 
内置filter 都是GatewayFilter 实现类
 

自定义filter

  1. 实现 GlobalFilter 下的 filter接口
  1. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {}
ServerHttpRequest newRequest = exchange .getRequest() .mutate() // 为请求追加 Id-Token 参数 .header(SaIdUtil.ID_TOKEN, SaIdUtil.getToken()) .build(); ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
  1. 最后要return chain.filter(newRequres);
  1. 他会下去接着去找其他的过滤
 

Copyright © 2025 刘頔

logo