1、什么是网关 网关是一个服务,是访问内部系统的唯一入口,提供内部服务的路由中转,额外还可以在此基础上提供身份认证、监控、负载均衡,限流、降级与应用检测等功能 SpringCloudGateway底层使用了高性能的通信框架Netty2、SpringCloudGateway与Zuul对比 nginxlua高性能反向代理服务器,通常做为负载均衡入口后端 Zuul是第一代网关,spring浏览器 cloud是第二代网关,基于NettyReactorWebFLux构建缓存性能强劲,zuul1。6倍安全功能强大,内置转发,监控,限流等功能 缺点不能再servlet容器下功能,不能使用war包2。1基础说明springcloudgateway基于springBoot2。x系列,webflux,reactor等技术,传统的同步库都是不能使用的gateway底层依赖netty,不接受servlet容器或者war包2。2zuul1。x与zuul2。x ZUUL1。x是基于同步IO Zuul2。x基于异步IO 3、Gateway基本使用3。1predicate断言 参考的是java8的java。util。function。predicate开发人员可以匹配http请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由 path断言predicates:pathmg Query断言参数值可以写正则,也可以只写参数名predicates:queryfoo,ba。 Method断言predicates:Methodget Host断言predicates:Hostwzx。cool Cookie断言predicates:cookiename。wuzhixuan3。2route路由 构建网关的基本模块,它由id,目标uri,一系列的断言和过滤器组成,如果断言为true则匹配该路由3。3filter过滤 指的是spring框架中gatewayfilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。3。4、总体web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。predicate就是我们的匹配条件;而filter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了4、原理 5、通过微服务名实现动态路由 默认情况下gateway会根据注册中心注册的服务列表以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能server:port:80spring:application:name:wuzxgatewayprofiles:active:sitcloud:nacos:discovery:serveraddr:wuzx。cool:30000config:serveraddr:wuzx。cool:30000fileextension:yamlgateway:discovery:locator:enabled:true开启从注册中心动态创建路由的功能,利用微服务名进行路由loadbalancer:retry:enabled:trueroutes:id:paymentrouth路由的id,没有固定规则但要求唯一,建议配合服务名uri:http:localhost:8001匹配后提供服务的路由地址uri:lb:cloudpaymentservicepredicates:pathpaymentget断言,路径相匹配的进行路由id:paymentrouth2uri:http:localhost:8001uri:lb:cloudpaymentservicepredicates:pathpaymentlb断言,路径相匹配的进行路由6、自定义过滤器 两个接口介绍:globalfilter,ordered 功能:全局日志记录统一网关鉴权鉴权认证author吴志旋自定义filter需要实现Ordered和GlobalFilterOrdered优先级越小优先级越大Slf4jComponentAllArgsConstructorpublicclassAuthFilterimplementsGlobalFilter,Ordered{privatefinalAuthPropertiesauthProperties;privatefinalObjectMapperobjectMapper;privatefinalAntPathMatcherantPathMatchernewAntPathMatcher();OverridepublicMonoVoidfilter(ServerWebExchangeexchange,GatewayFilterChainchain){Stringpathexchange。getRequest()。getURI()。getPath();if(isSkip(path)){returnchain。filter(exchange);}ServerHttpResponserespexchange。getResponse();StringheaderToken;StringparamToken;if(StringUtils。isAllBlank(headerToken,paramToken)){returnunAuth(resp,缺失令牌,鉴权失败);}StringauthStringUtils。isBlank(headerToken)?paramToken:headerToken;StringtokenJwtUtil。getToken(auth);ClaimsclaimsJwtUtil。parseJWT(token);if(claimsnull){returnunAuth(resp,请求未授权);}returnchain。filter(exchange);}privatebooleanisSkip(Stringpath){}OverridepublicintgetOrder(){return100;}}