为什么需要使用网关
1.实现统一认证
2.统一一个域名,解决调用困难。
3.协议转换 将不友好的协议转成友好的协议。
spring cloud gateway 是什么
是spring cloud 的第二代网关,会替代zuul 第一代网关。
基于 netty,reactor,webflux 构建。
优点:
1.性能强劲 是 zuul 的1.6倍
2.功能强大
内置 监控,限流,转发等
3.设计优雅,容易扩展。
编写spring cloud gateway
增加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
网关配置
server: port: 8040 spring: application: name: gateway cloud: nacos: discovery: server-addr: localhost:8848 gateway: discovery: locator: # 让gateway通过服务发现组件找到其他的微服务 enabled: true management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
这样网关就编写好了
通过网关访问为微服务
http://网关地址/user-center/user/1
这个将会将请求转发到 http://用户微服务/user/1 的地址。
- id: sytem uri: lb://jpaas-system predicates: - Path=/api-system/** filters: - StripPrefix=1
这个作用是,当路径为
/api-system/ 开头的路径,转发到 jpaas-system 的微服务,并将URL 去掉前缀。
spring gateway 的核心概念
1.路由
spring clound gateway 的基础元素,可以理解成为一条转发规则:
包含ID ,目标URL ,Predicate 集合和 Filter 集合。
2.Predicate (谓词)
即 java.util.function.Predicate ,spring cloud gateway 使用谓词实现路由匹配条件
3.Filter 过滤器
修改请求 以及响应
典型的路由配置:
spring: application: name: gateway cloud: gateway: discovery: locator: # 让gateway通过服务发现组件找到其他的微服务 enabled: true routes: - id: user_route uri: lb://user-center predicates: - Path=/users/** - id: content_route uri: lb://content-center predicates: - Path=/shares/**,/admin/**
filters:
- AddRequestHeader=token,0001
包括:
id,uri,predicates,filtres 等
spring gateway 架构图
1. gateway client 是浏览器
2. proxied service 表示 被代理的微服务
3. handler maping 判断路径是否和路由配置匹配。
4.webhandler 会读取这个路由的过滤器,交给过滤器处理。
内置路由谓词工厂
参考文档
http://www.imooc.com/article/290804
自定义谓词工厂
比如限制在 9-17 点才允许访问某个路径
import lombok.Data; import java.time.LocalTime; @Data public class TimeBeweenConfig { private LocalTime start; private LocalTime end; }
配置代码
自定义谓词工厂代码
@Component public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<TimeBeweenConfig> { public TimeBetweenRoutePredicateFactory() { super(TimeBeweenConfig.class); } @Override public Predicate<ServerWebExchange> apply(TimeBeweenConfig config) { LocalTime start = config.getStart(); LocalTime end = config.getEnd(); return new Predicate<ServerWebExchange>() { @Override public boolean test(ServerWebExchange serverWebExchange) { LocalTime now = LocalTime.now(); return now.isAfter(start) && now.isBefore(end); } }; } @Override public List<String> shortcutFieldOrder() { return Arrays.asList("start", "end"); } }
类使用 RoutePredicateFactory 结束,这个是约定。
在配置文件中进行配置。
predicated:
-TimeBetween=上午8:00,下午17:00
网关过滤器配置
http://www.imooc.com/article/290816
内置过滤器介绍。
编写自定义过滤器代码。
@Component public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory { @Override public GatewayFilter apply(NameValueConfig config) { return new GatewayFilter() { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("请求进来了...{},{}", config.getName(), config.getValue()); ServerHttpRequest modifiedRequest = exchange.getRequest() .mutate() .build(); ServerWebExchange modifiedExchange = exchange.mutate() .request(modifiedRequest) .build(); return chain.filter(modifiedExchange); } }; } }
配置编写为
filters:
-PreLog:a,b
filters:
- StripPrefix=1
StripPrefix 过滤器的作用
当我们访问
/api-user/user/org/osUser/current
配置这个过滤器后,访问路径会被修改为
/user/org/osUser/current
会将前缀进行截取。
全局过滤器介绍
https://www.cnblogs.com/yinjihuan/p/10474768.html
GATEWAY 监控
使用 springboot actuator 进行监控
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
增加配置到pom.xml
修改 配置文件:
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
配置好后,访问路径都在 /actoator/gateway 下面
在这里我们可以通过 actuator 增加或更新路由。
调试方法
http://www.imooc.com/article/290824
限流
http://www.imooc.com/article/290828