路由Gateway
是什么
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。
SpringCloud Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/指标、和限流。
干什么
反向代理
鉴权
流量控制
熔断
日志监控
功能:
路由转发+执行过滤器链
怎么干
可以参考子父工程可以参考 上期Nacos结合使用
上期Nacos配置中心
1.与配置中心Nacos结合
1.pom文件
<!--新增gateway,不需要引入web和actuator模块-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.yml配置文件(nacos配置中心的文件)
server:
port: 8300
spring:
cloud:
gateway:
routes:
- id: employee_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8100 #匹配后提供服务的路由地址
predicates:
- Path=/employees/employee/** #断言,路径相匹配的进行路由
yml文件第二中写法(可以实现负载均衡)
server:
port: 8300
spring:
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: employee_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8100 #匹配后提供服务的路由地址
predicates:
- Path=/employees/employee/** #断言,路径相匹配的进行路由
注意:
需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri
代理路径localhost:8100的服务
3.加上启动注解(nacos配置中心)
@EnableDiscoveryClient //nacos
4.启动项目
1.启动8100端口项目
2.启动路由代理8100的项目
2.Predicate的使用
是什么
Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。就是给路由访问提供一些访问规则。
配合yml中使用
predicates:
- Path=/employees/lb/** #断言,路径相匹配的进行路由
#- After=2022-03-08T10:59:34.102+08:00[Asia/Shanghai]
#- Cookie=username,zhangshuai #并且Cookie是username=zhangshuai才能访问
#- Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式
#- Host=**.hand.com
#- Method=GET
#- Query=username, \d+ #要有参数名称并且是正整数才能路由
3.Filter的使用
是什么 :
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。
3.1自定义过滤器
干什么
全局日志记录
统一网关鉴权
自定义全局GlobalFilter
两个主要接口介绍 主要实现下面接口
impiemerts GlobalFilter ,Ordered
实现过滤方法
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
/**
* 自定义实现过滤规则的方法
*
* @param exchange
* @param chain
* @author PC 2022-08-07 23:20
* @return reactor.core.publisher.Mono<java.lang.Void>
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("------welcom MyLogGateWayFilter"+new Date());
String token = exchange.getRequest().getQueryParams().getFirst("token");
if(StringUtils.isEmpty(token)){
log.info("用户名为Null非法用户(---)");
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
3.1实现效果
路径没有拼接token规则
控制台
路径拼接token 符合要求放行