目录
基于API Gateway中常用谓词(predicates)对象进行实践分析
核心知识点
API网关诞生背景
服务太多,需要对请求入口进行统一管理
市场主流微服务网关
spring cloud gateway,一代网关zuul...
基于API Gateway实现服务的保护和转发
保护是指基于GatewayFilter的实现类来进行对请求路径的删除(StripPrefixGatewayFilterFactory)来进行保护,此接口的实现类还有很多,都可以对请求的路径进行修改
基于API Gateway层面负载均衡的实现
首先要将gateway注册到nacos
然后修改配置文件将uri: lb://sca-provider
底层在LoadBalancerFilter过滤器内使用Ribbon负载均衡算法实现负载均衡
基于API Gateway底层原理实现分析
客户端向Spring Cloud Gateway发送请求,如果Gateway Handel Mapping 通过谓词predicates的集合与路由(Routers)匹配,则将请求发送到Gateway Web Handler ,Gateway Web Handler基于路由配置调用过滤器链中的过滤器对请求进一步处理
基于API Gateway中常用谓词(predicates)对象进行实践分析
Gateway继承了Predicates接口,GatewayPredicats,此接口有多个实现类,当请求与我们设置的谓词规则匹配时,对应的实现类就返回true,否则返回false,返回false的请求就会报404错误
此接口的实现类设置了一些规则,来对请求进行统一的处理,比如请求的方式,请求的时间,请求的路径
我们也可以通过实现GatewayPredicates自定义谓词对象
Gateway中的网关过滤器
全局过滤器:GlobelFilter,做用在全部的路由上,其中Gateway负载均衡的实现就在全局过滤器中(LoadBalancerFilter)
我们可以通过实现该接口来添加过滤器,比如设置访问路径的黑白名单
@Component public class BlackUrlGlobalFilter implements GlobalFilter, Ordered { private List<String> blackUrl=new ArrayList<>(); //添加非法url请求路径 public BlackUrlGlobalFilter() { blackUrl.add("/nacos/provider/echo/9010"); blackUrl.add("/nacos/provider/echo/9011"); } private List<String> include; /** * exchange参数用来获取请求和响应对象 * chain参数 表示过滤链 * 返回值 Mono对象,本质上是一个(publisher) * 这是Spring5.0以后,WebFlux框架中的一个对象 */ @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //获取请求和响应对象 ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); //获取请求对象的路径(不需要ip和端口号) String requestPath = request.getURI().getPath(); System.out.println(requestPath); //判断是否是非法url if (include.contains(requestPath)){ //1.如果该请求为非法请求,则抛出异常 //throw new RuntimeException("这个请求已被列入黑名单"); //2.响应一个error消息 //告诉浏览器响应的数据类型以及什么编码呈现数据 response.getHeaders().add(HttpHeaders.CONTENT_TYPE,"text/html;charset=UTF-8"); //封装数据 DataBuffer data = response.bufferFactory().wrap("当前url不允许访问资源".getBytes(StandardCharsets.UTF_8)); //将数据加入消息队列 return response.writeWith(Mono.just(data)); } //继续执行下一个过滤链 return chain.filter(exchange); } /** * 定义过滤器优先级,数字越小越先执行 * */ @Override public int getOrder() { return 0; } }
局部过滤器:GatewayFilter,作用在单一路由上,其中配置文件中的Filters就是基于此API的实现类对请求路径进行一些操作的
常见问题
为什么要使用网关
对url统一管理,服务保护,统一身份认证,统一跨域设计...
网关入门实现步骤
1.依赖导入
<!--添加gateway依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
注意:此依赖包含了Spring Boot启动依赖,就不用再导入启动依赖了
2.配置文件修改
server: port: 9000 spring: application: name: sca-gateway2 cloud: gateway: routes: #配置网关路由规则 - id: route01 #路由id,自己指定一个唯一值即可 uri: http://localhost:8082/ #网关帮我们转发的url predicates: ###断言(谓词):匹配请求规则 - Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源 filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理 - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
3.添加启动项
@SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
4.测试
当我们访问9000端口,结果返回sca-provider服务的内容
注意:服务转发不一定要将gateway注册到nacos
网关中的负载均衡底层是基于什么实现的
基于Ribbon,LoadBalancerFilter
网关中的谓词对象是怎么创建的
通过谓词工厂
常用的谓词对象
Path,Method,AfterDatetime,BeforeDatetime....