Spring之Gateway网关
创始人
2024-02-01 20:37:50
0

前言

        什么是网关?简单理解就是我们所有服务的入口,当我们使用了微服务以后,每个服务都会有一个对应的接口,比如我们有用户服务,订单服务等等,如果没有网关的话,那么前端是这样调用的

        很明显app和h5需要知道所有微服务的地址,显然会让前端变得很复杂,同时也不太安全,那如果有网关后是怎么样的呢?如下

这样一来,所有流量就会从网关进来了,当然了网关会存在单点故障问题,这个可以通过负载均衡就可以解决了

网关核心概念 

        路由:路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。通过ID使用微服务名称,因为微服务一般就是全局统一的

        断言:简单了解就是对参数、请求头,URI等的判断

        Filter:拦截器,对请求进行拦截处理等,跟mvc的拦截器差不多

网关工作原理

网关的使用 

spring网关的官方api文档:spring gateway

        网关的使用其实非常简单,只需要做以下的两步即可

1. 引入maven依赖


org.springframework.cloudspring-cloud-starter-gateway

com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery

       2. 配置yml文件

server:port: 9999
spring:application:name: gateway#配置nacos注册中心地址cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:#设置路由:路由id、路由到微服务的uri、断言routes:- id: user_route   #路由ID,全局唯一,建议配置服务名uri: lb://user  #lb 整合负载均衡器ribbon,loadbalancerpredicates:- Path=/user/**   # 断言,路径相匹配的进行路由

 3. 定义springBoot配置类启动即可使用了

网关使用遇到的问题

 首先,你在使用网关的时候需要排除webmvc,因为网关是基于webflux实现的,所以必须排除这个,否则启动不了


org.springframework.cloudspring-cloud-starter-gatewayorg.springframeworkspring-webmvc

 其次,不知道为啥我启动的时候报下面的错

***************************
APPLICATION FAILED TO START
***************************Description:An attempt was made to call a method that does not exist. The attempt was made from the following location:org.springframework.cloud.gateway.config.GatewayAutoConfiguration$NettyConfiguration.buildConnectionProvider(GatewayAutoConfiguration.java:798)The following method did not exist:reactor.netty.resources.ConnectionProvider$Builder.evictInBackground(Ljava/time/Duration;)Lreactor/netty/resources/ConnectionProvider$ConnectionPoolSpec;The method's class, reactor.netty.resources.ConnectionProvider$Builder, is available from the following locations:jar:file:/E:/javaEvn/mvn-need/io/projectreactor/netty/reactor-netty/0.9.10.RELEASE/reactor-netty-0.9.10.RELEASE.jar!/reactor/netty/resources/ConnectionProvider$Builder.classThe class hierarchy was loaded from the following locations:reactor.netty.resources.ConnectionProvider.Builder: file:/E:/javaEvn/mvn-need/io/projectreactor/netty/reactor-netty/0.9.10.RELEASE/reactor-netty-0.9.10.RELEASE.jarreactor.netty.resources.ConnectionProvider.ConnectionPoolSpec: file:/E:/javaEvn/mvn-need/io/projectreactor/netty/reactor-netty/0.9.10.RELEASE/reactor-netty-0.9.10.RELEASE.jarAction:Correct the classpath of your application so that it contains a single, compatible version of reactor.netty.resources.ConnectionProvider$BuilderProcess finished with exit code 1

看报错信息就是说找不到类之类的,所以尝试了几个解决方案

  1. 删除maven对应的依赖,因为有时可能因为网络问题引起jar包有问题,但是无法解决
  2. 看网上说可能是版本不匹配的问题,官网的推荐是版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub,
  3. 但是我的版本也是没问题,都是匹配的

Hoxton.SR12
2.2.8.RELEASE
spring-boot-starter-parent
2.3.12.RELEASE

最后实在没办法了,找到了网关启动类GatewayAutoConfiguration,里面有个方法叫org.springframework.cloud.gateway.config.GatewayAutoConfiguration.NettyConfiguration#buildConnectionProvider的builder.evictInBackground(pool.getEvictionInterval());报错了,这也是上面报错的原因,所以就尝试了一下对reactor.netty.resources.ConnectionProvider依赖进行了升级,如下

io.projectreactor.nettyreactor-netty0.9.25.RELEASE

这样一来,就可以解决了,但是官网推荐的版本匹配岂不是有问题吗,这个有待于后续的研究

这个问题解决以后,gateway就可以正常启动了

断言工具

        我们常用的是Path断言,断言就是个判断

predicates:- Path=/user/**   # 断言,路径相匹配的进行路由

其他更多的可以查看官网:spring 断言类

如果提供的不够还可以进行自定义,找一个参考就行了,命令也是要按照规范来即可

GatewayFilter拦截链

网关提供了GatewayFilter接口,默认提供了很多实现,当然我们也可以自己进行实现,然后放到容器中,他就会走我们的逻辑了,比如我定义了一个拦截器的实现,如下

@Component
public class ZxcGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {@Overridepublic GatewayFilter apply(NameValueConfig config) {return new GatewayFilter() {@Overridepublic Mono filter(ServerWebExchange exchange,GatewayFilterChain chain) {String name = config.getName();String value = config.getValue();System.out.println(name);System.out.println(value);return chain.filter(exchange);}};}
}

注意:名字要规范ZxcGatewayFilterFactory,Zxc为你使用的名字,后面的格式是固定的,然后放到ioc容器中就可以了,然后是在yml配置中进行配置,如下

gateway:#设置路由:路由id、路由到微服务的uri、断言routes:- id: user_route   #路由ID,全局唯一,建议配置服务名uri: lb://user  #lb 整合负载均衡器ribbon,loadbalancerfilters:- Zxc=zxc,tttpredicates:- Path=/user/**   # 断言,路径相匹配的进行路由

spring提供了多个GatewayFilterFactory,地址:Spring GatewayFilterFactory

配置比较简单,不过这种是局部配置的,我们一般会使用全局的,如下

GlobalFilter

这个是全局的,spring一样提供了很多,地址:Spring GlobalFilter

如果这些还不够,我们可以自己再提供一些实现,如下面定义了校验权限和校验白名单的类

@Component
public class AuthGlobalFilter implements GlobalFilter {@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("token");ServerHttpResponse response = exchange.getResponse();if(token == null) {return response.writeWith(Mono.just(response.bufferFactory().wrap("没有权限".getBytes())));}return chain.filter(exchange);}
}
package com.zxc.gateway.filter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class WhiteGlobalFilter implements GlobalFilter {@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {//todo 校验白名单逻辑return chain.filter(exchange);}
}

然后只要把实现类放到ioc容器中即可,以上都是网关提供的一些扩展点

网关限流整合

官网提供的

基于redis+lua脚本方式采用令牌桶算法实现了限流

具体文档为:gateway基于 redis+lua 限流

整合sentinel限流

参考地址

网关限流 · alibaba/Sentinel Wiki · GitHub

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...