网关简介
网关用来拦截所有从客户端访问的请求,进行身份的验证以及具体服务的路由,再就是负载均衡,服务限流等功能:
网关就是对服务的一种保护,保护服务的访问量以及敏感数据权限管理等。
网关可以用gateway和zuul来实现:
搭建网关
创建新的项目并继承付父项目引入依赖:
网关是作为一个服务要注册到nacos的,所以要引入nacos客户端依赖并注册到nacos。
在此项目的配置文件中,将服务注册到nacos,并且配置路由的相关信息:
其中routes中要写一个对象,其中uri可以写路径,或者些lb类型路径,lb类型路径能够提供负载均衡功能,而路径只是单纯的访问没有负载功能。
配置中还要存在断言集合,也就是路径在符合某种格式的前提下访问到uri所指定的服务中去。
未来访问的时候,都要从网关端口去访问,而不直接访问服务了。
网关中并没有任何业务实现,只是将请求分发到其他服务中:
小总结:
断言工厂
断言也就是路径在符合某种格式的前提下访问到uri所指定的服务中去。
断言工厂的具体配置内容可以在Spring官网上查看:
同一个服务可以有多个路由方式:
如果任何一个工厂断言不符合都无法正常访问,当所有都不符合则404返回,多个符合的情况下以靠前的条件为准。
路由/网关过滤器
介绍
过滤器工厂主要就是对请求及响应做操作,可以操作请求头请求体等内容,并且过滤器工厂有很多个:
具体的过滤器工厂可以从Spring官网查看:
实践
在控制层中可以通过注解获取请求头信息
其中requestheaderi表示从请求头中获取信息,required表示此参数不是必填的,也就是可以不携带此请求头。
如果对所有的服务都添加同一个请求头,可以使用默认过滤器来完成:
小总结:
全局过滤器
全局过滤器也是用于处理所有进入网关的请求和响应,实际上和上文的默认过滤器是一样的。区别在于全局过滤器可以自定义代码实现,而上文的过滤器是固定的处理逻辑。
具体的实现方案就是实现GlobalFilter接口:
exchange表示请求上下文,请求和响应都可以从中获取,chain就是过滤器中的过滤链,可以放行此过滤。
进行判断用户身份:
下文是过滤器的整体代码,其中request对象通过exchenge来获得,其中getFirst方法表示获取到第一个匹配的参数。
当鉴权失败的时候,可以直接返回setConplete方法,但是为了严谨,在请求头中添加了StatusCode为未登录401状态:
代码编写完成之后,还要对此类进行配置:
compnent表示注册为组件,order是用来对过滤器进行排序的。
过滤排序
一种方式是通过Order注解来完成,还有一种方式可以继承Orderd接口,实现其中的方法来返回排序数字。
全局过滤器一定要有order顺序!!!
小总结:
多种过滤器执行顺序
上文讲了三中过滤器,一个是服务路由过滤器,一个默认过滤器(在路由过滤器里讲的),还有全局过滤器。
在请求路由后,因为只有发送请求来确定路由后才能确定走哪条过滤器。执行顺序如下图:
虽然三种过滤器都是不同类型的,但是还是可以存在于一个过滤器链路中的。
其中路由过滤器和默认过滤器配置方式相似,最终产生的对象都由AddRequestHeaderGatewayFilterFactory来生产,都叫GateWayFilter。
后来的全局过滤器会经过FilteringWebHandler类中的GatewayFilterAdapter进行适配:
此类通过适配器模式将全局过滤器GlobalFilter转换成了GatewayFilter进行适配,并将过滤器加入了过滤链中。
所谓的声明顺序,也就是路由过滤器和默认过滤器在filters属性中添加的元素的顺序:
当不同类型的过滤器的order值相同时,将采用以下执行顺序:
cors跨域配置
cors的本质就是浏览器跨域前询问目标服务器是否可以跨域,然后再决定是否进行访问。
跨域只需要从gateway做配置即可:
询问是否跨域的请求是options类型,其中add to simple url handler mapping表示放开询问请求。
跨域有效期内,浏览器无需再次询问,可以直接跨域,这样可以解决频繁询问导致的多次请求缓慢的问题。
原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/270443.html