开发者学堂课程【精通Spring Cloud Alibaba:Gateway全局过滤使用方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/634/detail/10117
Gateway 全局过滤使用方法
Getaway 全局过滤使用方法
Gateway 实现拦截功能,较为简单。
在百度中搜索 gateway,找到 gateway 官网后,需要注意的是,学会英文文档是非常重要的。
DOC 就是文档, referenceDOC 是详细文档。
点开文档,网址中讲的就是 gateway 的所有内容,利用好浏览器自带的翻译工具,就可以读懂文档中的内容。
此处就有 gateway 的介绍,能够帮助解决问题,当中的介绍非常详细,包括路线等等。它的路由也可以实现很多功能。
自带的 gatewayfilte r有很多,大概二十多个,都是它内置会帮助自己实现的 filter ,可以自己选择默认过滤器和学习使用全局过滤器,全局过滤器的使用比较简单。
重要的就是一定要学会看文档,文档中的介绍都是非常详细的。如果想在 gateway 中实现一个拦截功能。
没有传递 token 参数的话,不会转发到真实服务地址中。此时只需要学会去看英文文档,答案都能在文档中找到。全局的 filter 表示能够拦截所有的内容。
案例的意思就是定义一个 filter 之后,实现 filter 接口,然后放行,允许转发到真实服务,这样就找到了 API,文档中还存在 land balance lients 过滤器的举例。需要实现功能时,可以照葫芦画瓢。
举例:
专门写一个包来实现拦截整个微服务,只要没有传多个,都能转发到真实的上游服务。首先新建1个包,命名时需要重新命名,命名为 token, filter 有很多,其中 Globalfilter 表示优先级顺序,也可以不去指定优先级顺序,只不过会表示的很乱。
首先重写到 filter 方法,获取到2个参数, serverwebExchange 和 gatewayfilter chain。获取到参数以后,继续写代码。但如何获取参数,不同于之前的是,之前的获取只要拿到 httpserverletrequest 类就行了,这是早期的获取方式。但是此处不存在, Gateway 不存在这个类。只能通过他的 API 来获取。获取方式也较为简单: string token=exchange .getrequest().getqueryparam().getfirst(“token”)。
这个参数就等同于之前通过 quest().getqueryparam() 这个方法来取得的。
接下来的操作是引入 come-lang 包,因为这个包里面有很多有关的 API ,进行判断,可以知道的是,能够调用这个方法就证明可以转发到真实服务。
不调用这个方法就肯定不会走这样的路。所以可以设置 API,通过 Exchange 拿到响应。
拿到响应之后,去设置端口号,设置一个响应状态码。值得注意的是,这里的 response 都是属于它自身的响应。如果 token 不为空,收到响应,设置端口号,响应的内容是 token 是不能为空,需要把它转化成 buffer 形式。可以再进行封装一次。进行完之后,既然能够走到这一步,说明 token 不为空,可以直接转发到真实服务。
转发到真实服务的操作非常简单:return cahin.filter(exchange) ;,能够发现一直在传递计算机命令,而命令绑定到参数之中,加一个 component 即可。
运行后开始访问,显示结果为 token is not null ,加入断点。交换机中有请求,相当于封装了和之前相同的 Request。现在的响应是为空,参数都具备以后设值即可。
加入操作 token=1,实现功能。在实际做的过程中,不可能有直接验证为空这么简单,还需要去验证 token 是否真正有效。如果想实现黑名单白名单也是如此,获取IP 地址,查看库中是否有新的 IP,如果有就不能去调,转化到真实服务,这就是全局的 filter。
该 Gateway 中也有自带的 filter 。