地址:https://github.com/13thm/study_springcloud/tree/main/days9_Gateway
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等
pringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway的目标提供统一的路由方式且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
Predicate(断言):参考的是Java8的java.util.function.Predicate 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由.
Filter(过滤): 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
Gateway工作流程:路由转发+执行过滤器链
启动7001,启动8001,启动9527网关
添加网关前
http://localhost:8001/payment/get/1
添加网关后
http://localhost:9527/payment/get/1
http://news.baidu.com/guonei
用自己的网关访问百度新闻,百度国内新闻网址,需要外网
通过9527网关访问到外网的百度新闻网址
在9527项目 建立package config 写配置类(具体看下载代码)
当访问地址 http://localhost:9527/guonei
时会自动转发到地址:http://news.baidu.com/guonei
默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能.
**启动:**一个eureka7001 + 两个服务提供者8001/8002
修改9527项目的yml
http://localhost:9527/payment/lb
时间前后或者在时间之间设置.
Cookie Route Predicate (cookie设置)
- Cookie=username,java # 断言设置cookie
Cookie Route Predicate需要两个参数,一个是 Cookie name ,一个是正则表达式。
路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行
curl http://localhost:9527/payment/lb
带上cookie
curl http://localhost:9527/payment/lb --cookie "username=java"
- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
测试:
curl http://localhost:9527/payment/lb -H "X-Request-Id:123"
curl http://localhost:9527/payment/lb -H "X-Request-Id:sss"
Host Route Predicate
Host=**.test.com
测试:
正确:curl http://localhost:9527/payment/lb -H "Host: java.test.com"
错误:curl http://localhost:9527/payment/lb -H "Host: java.test.net"
Method Route Predicate
- Method=GET
Path Route Predicate
Path=/payment/lb/** # 断言,路径相匹配的进行路由
Query Route Predicate
- Query=username, \d+ # 要有参数名username并且值还要是整数才能路由
正确:curl http://localhost:9527/payment/lb?username=31
错误:curl http://localhost:9527/payment/lb?username=-31
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。
Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生
官网:https://docs.spring.io/spring-cloud-gateway/docs/3.0.8/reference/html/#gatewayfilter-factories
建一个package filter 写过滤器(具体看下载代码)
正确的:
http://localhost:9527/payment/lb?uname=z3
错误的:
http://localhost:9527/payment/lb