微服务网关Gateway在实战中如何结合注册中心,定义过滤器?
目录
- 前言
- 注册中心
- 什么是Nacos
- 微服务提供者
- 微服务消费者
- 微服务网关
- Filter过滤器
- Gateway Filter
- 自定义Gateway Filter
- 自定义过滤器工厂
- 自定义GlobalFilter
- 总结
前言
前两篇介绍了Gateway的简单用法,今天老顾分享一些Gateway的高阶知识点。
注册中心
在微服务中,如商品服务,肯定是集群部署的。那Gateway怎么路由到多个商品服务呢?
还有服务注册中心里面往往注册了很多服务,如果每个服务都需要单独配置的话,这将是一份很枯燥的工作。Gateway 提供了一种默认转发的能力,只要将Gateway 注册到服务中心,Gateway 默认就会代理服务中心的所有服务。
我们先来搞定一个注册中心,老顾这里将介绍Nacos注册中心,为什么呢?Spring Cloud Netflix系列Eureka宣布进入维护阶段;另一个因为将来老顾会介绍SpringCloud Alibaba系列课程,这里预先分享个引子。
什么是 Nacos
Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
鼎鼎大名的阿里公司出品,并且应用于生产环境,性能不是个问题。
Nacos vs Spring Cloud
相对于 Spring Cloud Eureka 来说,Nacos 更强大。
Nacos = Spring Cloud Eureka + Spring Cloud Config
Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。
通过Nacos Server和spring-cloud-starter-alibaba-nacos-config实现配置的动态变更
通过Nacos Server和spring-cloud-starter-alibaba-nacos-discovery实现服务注册与发现
这里我们忽略不介绍Nacos如何安装,以后老顾会介绍,小伙伴也可以自行学习
微服务提供者
我们先弄个简单的提供者,提供一个接口
一)pom配置
这边需要提醒的一点就是,因为采用了注册中心为阿里的,所以我们这里采用的机制都是SpringCloud Alibaba的框架
其实用什么框架不主要,最主要知道Gateway的基本原理就行了,换框架也影响不大。
二)application配置文件
nacos.discovery.server-addr指向Nacos注册中心
三)Application启动
注解@EnableDiscoveryClient
四)Controller
两个接口微服务
启动工程后,访问Nacos管理控制台
goods-provider注册成功。
微服务消费者
在增加个消费者,也就是调用接口方。POM配置和提供者一样
一)application配置文件
nacos.discovery.server-addr指向Nacos注册中心
二)Application启动
注解@EnableDiscoveryClient
三)Configuration
创建一个名为 NacosConsumerConfiguration 的 Java 配置类,主要作用是为了注入 RestTemplate
四)Controller
采用RestTemplate调用方式,这边还故意增加了获取ip和端口的;因为我们会启动多个消费者,端口9091和9092。
查看控制台,实例数为2,说明消费者由2个实例
微服务网关
我们主角出现了,看看怎么弄
一)POM
二)application配置文件
注意gateway:discovery:locator:enabled:true这样就可以利用微服务名进行路由
因为消费者我们启动多个实例,不可能我们人工指定去请求哪个IP的消费者,应该是由框架去解决,框架中实现负载均衡,可以按照不同的负载均衡算法进行路由。
三)Application启动
启动查看Nacos控制台
整个工程设置结束,看看效果,访问
http://localhost:8080/goods-consumer/echo/app/name
返回
在刷新
端口9091和9092依次显示,我们发现就是依次调用了2个微服务消费者实例接口。不过我们发现在请求的URL地址中,把服务名暴露出来了goods-consumer,有点变扭。
是不是可以不需要输入微服务名称呢?当然可以,我们修改一下配置文件
在路由配置中采用lb://goods-consumer方式表明使用微服务名进行路由
访问
http://localhost:8080/echo/app/name
多次刷新,效果一样;不过这样的URL,就舒服多了。
上面介绍了结合注册中心,Gateway如何路由到微服务接口
Filter过滤器
Spring Cloud Gateway的Filter的生命周期不像Zuul的那么丰富,它只有两个:“pre” 和 “post”。
PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、记录调试信息等。
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
Spring Cloud Gateway的Filter分为两种:GatewayFilter 与 GlobalFilter。
GlobalFilter会应用到所有的路由上,而GatewayFilter将应用到单个路由或者一个分组的路由上。
Spring Cloud Gateway内置了9种 GlobalFilter,比如 Netty Routing Filter、LoadBalancerClient Filter、Websocket Routing Filter 等。
根据名字即可猜测出这些Filter的作用,具体大家可以参考官网
Gateway filter
过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。过滤器的作用域为特定路由。Spring Cloud Gateway包含许多内置的GatewayFilter工厂。
官方文档中都给出来这些过滤器的用法,在这里老顾只介绍2个案例。
1、AddRequestHeader GatewayFilter Factory
过滤器工厂会在匹配的请求头加上一对请求头,名称为X-Request-Goods,值为third。
2、RewritePath GatewayFilter Factory
在Nginx服务启中有一个非常强大的功能就是重写路径,Spring Cloud Gateway默认也提供了这样的功能,这个功能是Zuul没有
所有的/foo/**开始的路径都会命中配置的router。
请求http://localhost:8080/foo/echo/app/name会转到http://localhost:8080/echo/app/name,结果如下
自定义GatewayFilter
Spring Cloud Gateway内置了过滤器工厂,足够大部分场景使用,而且我们可以实现GatewayFilter和Ordered这两个接口来自定义过滤器。代码如下:
上述代码中,getOrder()方法是来给过滤器设定优先级别的,值越大则优先级越低。此过滤器就是记录请求耗时。需要将自定义的GatewayFilter注册到router中,代码如下:
启动请求http://localhost:8080/echo/app/name
可以看到请求耗时。
自定义过滤器工厂
自定义GatewayFilter又有两种实现方式,一种是上面的直接实现GatewayFilter接口,另一种是自定义过滤器工厂(继承AbstractGatewayFilterFactory类) , 选择自定义过滤器工厂的方式,可以在配置文件中配置过滤器了。
代码如下:
配置文件
为什么是Customer属性,那是有个规范,就是工厂类要以GatewayFilterFactory为结尾,前面的名称为配置文件的属性,所以配置文件中就用Customer作为属性。值true赋值给的对象就CustomerGatewayFilterFactory中的config内部类,设置true就是对enable进行赋值。
启动效果和上面的一致。
自定义GlobalFilter
下面的我们自定义一个GlobalFilter,去校验所有请求的请求参数中是否包含“token”,如何不包含请求参数“token”则不转发路由,否则执行正常的逻辑。
启动请求
以上请求没有参数token,无法转发路由。看看下面我们带上参数token
路由正常。
微服务网关Gateway在实战中如何结合注册中心,定义过滤器?相关推荐
- SpringCloud 微服务网关Gateway 动态路由配置
概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...
- Spring Cloud之(十八)微服务网关GateWay
十八.微服务网关GateWay Zuul 1.x 是一个基于阻塞 IO 的 API Gateway 以及 Servlet:直到 2018 年 5 月,Zuul 2.x(基于Netty,也是非阻塞的,支 ...
- SpringCloud—— 微服务网关GateWay
目录 1.GateWay网关概述 1.1.什么是GateWay? 1.2.为什么要使用微服务网关? 1.3.Zuul与GateWay网关的区别? 2.快速入门 2.1.创建项目 2.2.配置yml文件 ...
- 微服务网关Gateway实战
1. 什么是Spring Cloud Gateway 网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等. Spring Cloud Gateway 是Spring Cloud官方推出的第二 ...
- SpringCloud 微服务网关Gateway介绍及简单路由配置
概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...
- SpringCloud Alibaba 微服务 — 微服务网关 Gateway
一.Spring Cloud Gateway 简介 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.x.Spring Boot 2.x.Spring WebFl ...
- 微服务网关GateWay 过滤+路由+限流
文章目录 1 微服务网关概述 2 微服务网关微服务搭建 3 微服务网关跨域 4 微服务网关过滤器 5 微服务网关限流 5.1 思路分析 5.2 令牌桶算法 5.3 网关限流代码实现 1 微服务网关概述 ...
- 微服务网关Gateway
使用场景 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的微服务,增加了客户端 ...
- 微服务网关Gateway(七)
前言 zuul目前已经出现了分歧,zuul 升级到 Zuul2的时候出现了内部分歧,并且导致Zuul的核心人员的离职,导致Zuul2一直跳票,等了两年,目前造成的局面是Zuul已经没人维护,Zuul2 ...
- Spring Cloud 微服务网关Gateway组件
一.网关介绍 大家都知道在微服务架构中,一个系统会被拆分为多个微服务,那么作为客户端如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用. 这样的架构会存 ...
最新文章
- 关闭eslint检查2020_2020 vscode配置eslint保存后自动fix
- 改编码格式_编码不规范,同事真的会两行泪?
- xface 远程桌面 无法使用tab键盘
- 让小乌龟可以唱歌——对Python turtle进行拓展
- conda - 虚拟环境,常用指令
- 娱乐项目和女朋友哪个重要?
- NYNU_省赛选拔题(10)
- CAM350 10.5完美精减版
- 【计算机网络】计算机网络基础知识笔记
- 【游戏开发实战】权游红袍女在火中看到了什么,我看到了...(Unity | 粒子系统 | 火焰特效 | ParticleSystem | 手把手制作)
- 微信公众平台接口调试工具json格式不对怎么搞_微信支付、支付宝最全接入指引,看完立刻就可以上手!...
- CodeWarrior for S12(X) V5.1 Special详细安装过程
- 【心理学硕士论文】内观认知疗法对手机成瘾倾向的影响研究(节选)
- 又冒出来了不错的创意
- 华为Mate20系列赢得各界盛誉,棋圣聂卫平也对其AI性能称赞
- 让卫浴间四季花香 最懂你的智能马桶 ——安华智能坐便器aB13017-1众测报告
- Linux查看主机信息及修改主机名hostname
- 区块链技术研究热点有哪些
- Java中HashMap底层实现原理
- ICP 问题之 SVD
热门文章
- time clock getrusage clock_gettime gettimeofday timespec_get 对比
- Stacked injection--堆叠注入--堆查询注入
- LigerUI之Grid使用详解(三)——字典数据展示
- Java/Hbase + C云平台架构设计_十项法则
- MATLAB命令窗常用命令
- linux上禅道源码安装步骤
- VIM命令记录和cscope结合使用
- ffmpeg1.2的filter分析
- libxml主要函数说明 (二)
- 定时器函数执行原理揭秘