Java之api网关断言及过滤器案例讲解.docx
- 文档编号:30017401
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:15
- 大小:169.05KB
Java之api网关断言及过滤器案例讲解.docx
《Java之api网关断言及过滤器案例讲解.docx》由会员分享,可在线阅读,更多相关《Java之api网关断言及过滤器案例讲解.docx(15页珍藏版)》请在冰豆网上搜索。
Java之api网关断言及过滤器案例讲解
欢迎光临本店,您的支持是我们最大的前进动力,我们的宗旨是为大家精选各行各业的优质文档,帮助大家解决工作、生活中的文档需求。
同时,本店长期提供各类精品作文、手抄报、教案、读后感、日记、合同模板等等,想了解以上内容,敬请关注!
Welcometoourstore.Yoursupportisourgreatestdrivingforce.Ourpurposeistoselecthigh-qualitydocumentsfromallwalksoflifeandhelpyousolvethedocumentneedsinyourworkandlife.
Atthesametime,ourstorehaslongprovidedallkindsofhigh-qualitycompositions,handwrittennewspapers,lessonplans,afterreadingfeelings,diaries,contracttemplates,etc.ifyouwanttoknowtheabovecontents,pleasepayattention!
一、什么api网关?
二、常见的api网关
三、使用步骤
1.SpringCloudGateway
2.优缺
3.传统的过滤器
4.使用gateway
•4.1module
•4.2pom依赖
•4.3yaml配置
•4.4主程序启注解@EnableDiscoveryClient
四、执行流程
五、断言
5.1:
自定义断言
5.2:
过滤器
一、什么api网关?
所谓的API网关,就指后台系统的统一入口,它装了应用程序的内部结构,为客户端统一路由,一些与本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。
说白了就通过网关找。
二、常见的api网关
Ngnix+lua
使用nginx的反向代理和负载均衡可实现对api器的负载均衡及高可用lua一种脚本语言,可以来编写一些简单的逻辑,nginx支持lua脚本Kong
基于Nginx+Lua发,性能高,稳定,有多个可用的件(限流、鉴权等等)可以箱即用。
问题:
只支持Http协议;二次发,扩展困难;管理API,缺乏更易用的管控、配置。
ZuulNetflix源的网关,功能丰富,使用JAVA发,易于二次发问题:
缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的Web容器,性能不如Nginx
SpringCloudGateway
Spring为了替换Zuul而发的网关,将在具体介绍。
三、使用步骤
1.SpringCloudGateway
SpringCloudGatewaySpring基于Spring5.0,SpringBoot2.0和ProjectReactor等技术
发的网关,它旨在为微架构一种简单有效的统一的API路由管理。
它的目标替代
NetflixZuul,其不仅统一的路由,并且基于Filter链的了网关基本的功能,例如:
安
全,监控和限流。
2.优缺
优
性能强劲:
代网关Zuul的1.6倍
功能强:
内置了很多实用的功能,例如转发、监控、限流等
设计优雅,容易扩展
缺
其实现依赖Netty与WebFlux,不传统的Servlet编程模型,学习成本高
不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行
需要SpringBoot2.0及以上的版本,才支持
3.传统的过滤器
代码如下(示例):
@WebFilter(filterName="MyFliter",urlPatterns="/api/share/*")
publicclassMyFliterimplementsFilter{
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
System.out.println("");
}
@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
System.out.println("filter进入之前");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("filter进入之后");
}
@Override
publicvoiddestroy(){
}
}
//在主程序处加上注解
//@ServletComponentScan("过滤器包名")
4.使用gateway
4.1module
4.2pom依赖
代码如下(示例):
4.3yaml配置
代码如下(示例):
server:
port:
7000
spring:
application:
name:
api-gateway
cloud:
nacos:
discovery:
server-ar:
localhost:
8848#将gateway注册到nacos
gateway:
discovery:
locator:
enabled:
true#让gateway从nacos中获取信息
routes:
-id:
share-6002#只要标识就行
uri:
lb:
//share-6002#真的
order:
1
predicates:
#满足断言中的条件才理由
-Path=/api/share/**,/admin/share/**
-id:
user-6001#只要标识就行
uri:
lb:
//user-6001#真的
order:
1
predicates:
#满足断言中的条件才理由
-Path=/api/user/**,/admin/user/**
4.4主程序启注解@EnableDiscoveryClient
@EnableDiscoveryClient和@EnableEurekaClient共同就:
都能够让注册中心能够发现,到该。
@EnableEurekaClient只适用于Eureka作为注册;@EnableDiscoveryClient可以其他注册中心。
代码如下(示例):
@SpringBootApplication
@EnableDiscoveryClient
publicclassGatewayApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(GatewayApplication.class,args);
}
}
四、执行流程
1:
基本概念
路由(Route)gateway中最基本的组件之一,表示一个具体的路由信息载体。
主要定义了几个信息:
-
-
id
路由标识符,区别于其他Route
uri
路由指向的目的地uri,即客户端请求最终被转发到的微。
order
用于多个Route之间的排序,数值越小排序越靠前,匹配优先级越高。
predicate
断言的作用进行条件判断,只有断言都返回真,才会真正的执行路由。
filter
过滤器用于请求和响应信息。
DispatcherHandler:
所有请求的调度器,负载请求分发
RoutePredicateHandlerMapping:
路由谓语匹配器,用于路由的查找,以及找到路由后返回对应的WebHandler,DispatcherHandler会依次遍历HandlerMapping集合进行处理
FilteringWebHandler:
使用Filter链表处理请求的WebHandler,
RoutePredicateHandlerMapping找到路由后返回对应的FilteringWebHandler对请求进行处理,FilteringWebHandler负责Filter链表并调用链表处理请求。
五、断言
Predicate(断言,谓词)用于进行条件判断,只有断言都返回真,才会真正的执行路由。
断言就说:
在什么条件下才能进行路由转发
:
5.1:
自定义断言
自定义断言类
packagegateway.pradicate;
import.alibaba.nacos.mon.utils.StringUtils;
importlombok.Data;
importlombok.NoArgsConstructor;
importorg.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
importorg.springframework.stereotype.Component;
importorg.springframework.web.server.ServerWebExchange;
importjava.util.Arrays;
importjava.util.List;
importjava.util.function.Predicate;
@Component
publicclassAgeRoutePredicateFactoryextendsAbstractRoutePredicateFactory{
//1:
配置类,用于接收配置文件中的对应参数
@Data
@NoArgsConstructor
publicstaticclassConfig{
privateintminAge;//18对应断言配置中的个参数
privateintmaxAge;//60对应断言配置中的第二个参数
}
//2:
构造函数
publicAgeRoutePredicateFactory(){
super(Config.class);
}
//3:
读取配置文件的中参数值给他赋值到配置类中的属性上
publicListshortcutFieldOrder(){
//这个位置的顺序必须跟配置文件中的值的顺序对应
returnArrays.asList("minAge","maxAge");
}
//4:
断言逻辑
publicPredicateapply(Configconfig){
returnnewPredicate(){
@Override
publicbooleantest(ServerWebExchangeserverWebExchange){
//4.1接收前台传入的age参数
StringageStr=serverWebExchange.getRequest().getQueryParams().getFirst("Age");
//4.2先判断否为空
if(StringUtils.isNotEmpty(ageStr)){
//3如果不为空,再进行路由逻辑判断
intage=Integer.parseInt(ageStr);
if(age
returntrue;
}else{
returnfalse;
}
}
returnfalse;
}
};
}
}
在需要判断的的routes下配置
5.2:
过滤器
:
分类:
局部过滤器(作用在某一个路由上)全局过滤器(作用全部路由上)Gateway的Filter从作用范围可分为两种:
GatewayFilter与GlobalFilter。
GatewayFilter:
应用到单个路由或者一个分组的路由上。
GlobalFilter:
应用到所有的路由上。
内置过滤器举例:
注意要从网关访问
自定义局部过滤器
自定义Log配置
@Component
@Slf4j
publicclassLogGatewayFilterFactory
extendsAbstractGatewayFilterFactory{
//1:
配置类接收配置参数
@Data
@NoArgsConstructor
publicstaticclassConfig{
privatebooleanconsoleLog;
}
//2:
构造函数【固定写法】
publicLogGatewayFilterFactory(){
super(Config.class);
}
//3:
读取配置文件中的参数赋值到配置类中
@Override
publicListshortcutFieldOrder(){
returnArrays.asList("consoleLog");
}
//4:
过滤器逻辑
@Override
publicGatewayFilterapply(Configconfig){
returnnewGatewayFilter(){
Longstart=System.currentTimeMillis();
@Override
publicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){
//进入之前
if(config.isConsoleLog()){
log.info("{}进入{}",newDate(),exchange.getRequest().getPath());
}
//调用并且定义回来之后的逻辑
//注意如果此时仅仅只需要进入之前的验证不需要执行完之后的逻辑可以returnchain.filter(exchange)即可
returnchain.filter(exchange).then(Mono.fromRunnable(()->{
if(config.isConsoleLog()){
Longend=System.currentTimeMillis();
log.info("{}退出{}.共耗时:
{}",newDate(),exchange.getRequest().getPath(),(end-start));
}
}));
}
};
}
}
全局过滤器
全局过滤器作用于所有路由,无需配置。
通过全局过滤器可以实现对权限的统一校验,性验证等功
自定义全局过滤器
//自定义全局过滤器需要实现GlobalFilter和Ordered接口
@Component
publicclassMyGloablFilterimplementsGlobalFilter,Ordered{
//过滤逻辑
@Override
publicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){
//1进入之前controller
System.out.println("进入之前在MyGloablFilter");
//2放行
returnchain.filter(exchange).then(Mono.fromRunnable(()->{
//在回调中写返回的逻辑response
System.out.println("从controller回来之后");
}));
//3回调
}
//返回的数字越小就越先起作用
@Override
publicintgetOrder(){
return0;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java api 网关 断言 过滤器 案例 讲解