Java之api网关断言及过滤器案例讲解.docx

上传人:b****0 文档编号:17839878 上传时间:2023-08-04 格式:DOCX 页数:15 大小:169.05KB
下载 相关 举报
Java之api网关断言及过滤器案例讲解.docx_第1页
第1页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第2页
第2页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第3页
第3页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第4页
第4页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第5页
第5页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第6页
第6页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第7页
第7页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第8页
第8页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第9页
第9页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第10页
第10页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第11页
第11页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第12页
第12页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第13页
第13页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第14页
第14页 / 共15页
Java之api网关断言及过滤器案例讲解.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Java之api网关断言及过滤器案例讲解.docx

《Java之api网关断言及过滤器案例讲解.docx》由会员分享,可在线阅读,更多相关《Java之api网关断言及过滤器案例讲解.docx(15页珍藏版)》请在冰点文库上搜索。

Java之api网关断言及过滤器案例讲解.docx

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(ageconfig.getMinAge()){

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;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2