本文源码已由 GitHub https://github.com/2335119327/SpringCloud 已经收录(内涵更多SpringCloud的Demo,有兴趣的小伙伴可以看看),之后会持续更新SpringBoot系列,欢迎Star。
SpringCloud GateWay是Spring Cloud的一个全新项目,基于Spring5.0 + Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在微服务架构提供一种简单有效的统一的API路由管理方式。
SpringCloud GateWay 作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud2.0以上版本,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud GateWay是基本WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud GateWay的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
Spring Cloud GateWay官方文档
当然对于我这种英语学渣来说英文当然是看不懂的,所以给大家找到了中文文档
Spring Cloud中文文档
建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上
能够匹配任何请求属性上的路由。
谓词和过滤器特定于路由。
Hystrix断路器集成。
Spring Cloud DiscoveryClient集成
易于编写的谓词和过滤器
请求速率限制
路径改写
一方面因为Zuul1.0已经进入了维护阶段,而且GateWay是SpringCloud团队研发的,本着一家亲的概念,更值得信赖,而却很多功能Zuul都没有用起来也非常的简单便捷。
GateWay是基于异步非阻塞模型进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的Zuul2.x,但SpringCloud貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;不知前景如何?
综合考虑GateWay是很理想的网关选择。
下图从总体上概述了Spring Cloud Gateway的工作方式:
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。
在没有端口的路由中定义的URI,HTTP和HTTPS URI的默认端口值分别为80和443。
建表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for payment
-- ----------------------------
DROP TABLE IF EXISTS `payment`;
CREATE TABLE `payment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`serial` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of payment
-- ----------------------------
INSERT INTO `payment` VALUES (31, '皮皮虾');
INSERT INTO `payment` VALUES (32, 'Code');
SET FOREIGN_KEY_CHECKS = 1;
eureka-server为服务注册模块(服务注册中心使用的是eureka)
commons为公共模块
getaway为网关模块
8001和8003为客户模块
将8001、8003两个客户端注册进eureka,可参考Eureka入门实战讲解
注意:Gateway并不需要web依赖
在gateway模块中进行配置yml
1、配置文件yml配置
2、代码中注入RouteLocator的Bean
咋看不懂,还不会照着写嘛。没见过猪肉,难道还没见过猪跑?
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
RouteLocatorBuilder.Builder routes = builder.routes();
routes.route("path_route",r->r.path("/guonei").uri("https://news.baidu.com/guonei"));
return routes.build();
}
}
可见转发成功!
想要设置多个转发,照着写就行了,相信大家都能做到,需要注意的是:路由id不要重复
可以看见原先的yml配置中,uri配置写死了,不够灵活,在实际开发中不会只有这一两台机器,所以这就需要配置动态路由。
默认情况下GateWay会根据注册中心的服务列表,以注册中心上的微服务名为路径创建动态路由·转发,从而实现动态路由的功能。
动态路由实现成功!
Cookie route Predicate需要两个参数,一个是Cookie name,义格式正则表达式。路由规则会通过获取对应的Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
两个参数,一个是属性名称和一个正则表达式,这个属性值和正则表达式匹配执行。
我就讲到这里了,剩余的大家可自行参考文档进行测试不难的
Filter指的是Spring框架中GateWayFilter的实例,使用过滤器,可以在请求被路由前或者路由后对请求进行修改。
一般的过滤器,大家可自行按照文档进行配置,我们主要讲解的是自定义过滤器。
需要实现GlobalFilter, Ordered 这两个接口
@Component
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
//过滤
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("********come in MyLogGatewayFilter: " + new Date());
//看有没有uname这个key
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname == null) {
log.info("*******用户名为null,非法用户,o(╥﹏╥)o");
//设置状态码 HttpStatus.NOT_ACCEPTABLE (不被接受)
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
//返回
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
本文源码已由 GitHub https://github.com/2335119327/SpringCloud 已经收录(内涵更多SpringCloud的Demo,有兴趣的小伙伴可以看看),之后会持续更新SpringBoot系列,欢迎Star。
觉得博主写的不错的读者大大们,可以点赞关注和收藏哦,谢谢各位!
Java学习路线目录索引