微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

【原创】 老顾聊技术 2019-09-23 18:59:58

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工


目录

  1. 前言
  2. 注册中心
  3. 什么是Nacos
  4. 微服务提供者
  5. 微服务消费者
  6. 微服务网关
  7. Filter过滤器
  8. Gateway Filter
  9. 自定义Gateway Filter
  10. 自定义过滤器工厂
  11. 自定义GlobalFilter
  12. 总结

前言

前两篇介绍了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配置

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第1张图片

 

这边需要提醒的一点就是,因为采用了注册中心为阿里的,所以我们这里采用的机制都是SpringCloud Alibaba的框架

其实用什么框架不主要,最主要知道Gateway的基本原理就行了,换框架也影响不大。

二)application配置文件

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第2张图片

 

nacos.discovery.server-addr指向Nacos注册中心

三)Application启动

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第3张图片

 

注解@EnableDiscoveryClient

四)Controller

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第4张图片

 

两个接口微服务

启动工程后,访问Nacos管理控制台

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第5张图片

 

goods-provider注册成功。

微服务消费者

在增加个消费者,也就是调用接口方。POM配置和提供者一样

一)application配置文件

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第6张图片

 

nacos.discovery.server-addr指向Nacos注册中心

二)Application启动

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第7张图片

 

注解@EnableDiscoveryClient

三)Configuration

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第8张图片

 

创建一个名为 NacosConsumerConfiguration 的 Java 配置类,主要作用是为了注入 RestTemplate

四)Controller

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第9张图片

 

采用RestTemplate调用方式,这边还故意增加了获取ip和端口的;因为我们会启动多个消费者,端口9091和9092。

查看控制台,实例数为2,说明消费者由2个实例

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第10张图片

 

微服务网关

我们主角出现了,看看怎么弄

一)POM

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第11张图片

 

二)application配置文件

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第12张图片

 

注意gateway:discovery:locator:enabled:true这样就可以利用微服务名进行路由

因为消费者我们启动多个实例,不可能我们人工指定去请求哪个IP的消费者,应该是由框架去解决,框架中实现负载均衡,可以按照不同的负载均衡算法进行路由

三)Application启动

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第13张图片

 

启动查看Nacos控制台

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第14张图片

 

整个工程设置结束,看看效果,访问

http://localhost:8080/goods-consumer/echo/app/name

返回

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

 

在刷新

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

 

端口9091和9092依次显示,我们发现就是依次调用了2个微服务消费者实例接口。不过我们发现在请求的URL地址中,把服务名暴露出来了goods-consumer,有点变扭。

是不是可以不需要输入微服务名称呢?当然可以,我们修改一下配置文件

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第15张图片

 

在路由配置中采用lb://goods-consumer方式表明使用微服务名进行路由

访问

http://localhost:8080/echo/app/name

多次刷新,效果一样;不过这样的URL,就舒服多了。

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

 

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

 

上面介绍了结合注册中心,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工厂

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第16张图片

 

官方文档中都给出来这些过滤器的用法,在这里老顾只介绍2个案例。

1、AddRequestHeader GatewayFilter Factory

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第17张图片

 

过滤器工厂会在匹配的请求头加上一对请求头,名称为X-Request-Goods,值为third

2、RewritePath GatewayFilter Factory

在Nginx服务启中有一个非常强大的功能就是重写路径,Spring Cloud Gateway默认也提供了这样的功能,这个功能是Zuul没有

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第18张图片

 

所有的/foo/**开始的路径都会命中配置的router。

请求http://localhost:8080/foo/echo/app/name会转到http://localhost:8080/echo/app/name,结果如下

自定义GatewayFilter

Spring Cloud Gateway内置了过滤器工厂,足够大部分场景使用,而且我们可以实现GatewayFilter和Ordered这两个接口来自定义过滤器。代码如下:

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第19张图片

 

上述代码中,getOrder()方法是来给过滤器设定优先级别的,值越大则优先级越低。此过滤器就是记录请求耗时。需要将自定义的GatewayFilter注册到router中,代码如下:

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第20张图片

 

启动请求http://localhost:8080/echo/app/name

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

 

可以看到请求耗时。

自定义过滤器工厂

自定义GatewayFilter又有两种实现方式,一种是上面的直接实现GatewayFilter接口,另一种是自定义过滤器工厂(继承AbstractGatewayFilterFactory类) , 选择自定义过滤器工厂的方式,可以在配置文件中配置过滤器了。

代码如下:

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第21张图片

 

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第22张图片

 

配置文件

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第23张图片

 

为什么是Customer属性,那是有个规范,就是工厂类要以GatewayFilterFactory为结尾,前面的名称为配置文件的属性,所以配置文件中就用Customer作为属性。值true赋值给的对象就CustomerGatewayFilterFactory中的config内部类,设置true就是对enable进行赋值。

启动效果和上面的一致。

自定义GlobalFilter

下面的我们自定义一个GlobalFilter,去校验所有请求的请求参数中是否包含“token”,如何不包含请求参数“token”则不转发路由,否则执行正常的逻辑

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第24张图片

 

启动请求

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?_第25张图片

 

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

 

以上请求没有参数token,无法转发路由。看看下面我们带上参数token

微服务网关Gateway在实战中如何结合注册中心,定义过滤器?

 

路由正常。

总结

因为篇幅有限,老顾今天把Gateway的核心的过滤器简要的介绍了,小伙伴需要详细了解的话,可以自行学习。老顾过段时间会输出SpringCloud Alibaba视频课程,会详细介绍,谢谢!!


---End---

最近老顾上传了微服务网关的分享课程,请大家多多支持

推荐阅读

1、Gateway网关系列(二):SpringCloud Gateway入门实战,路由规则

2、Gateway网关系列开篇:SpringCloud的官方网关Gateway介绍

3、API网关在微服务架构中的应用,这一篇就够了

4、学习Lambda表达式看这篇就够了,不会让你失望的哦(续篇)

5、Lambda用在哪里?几种场景?

6、为什么会出现Lambda表达式,你知道吗?

7、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用

8、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构

9、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足

10、阿里P7二面:聊聊零拷贝的原理

11、秒杀系统的核心点都在这里,快来取

12、你了解如何利用token方式实现分布式Session吗?

13、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂

14、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调

15、企业实战Redis全方面思考,你思考了吗?

16、面试题:Thread的start和run的区别

17、面试题:什么是CAS?CAS的作用以及缺点

18、如何访问redis中的海量数据?避免事故产生

19、如何解决Redis热点问题?以及如何发现热点?

20、如何设计API接口,实现统一格式返回?

21、你真的知道在生产环境下如何部署tomcat吗?

22、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案

23、分享大厂分布式唯一ID设计方案,快来围观

24、你想了解一线大厂的分布式唯一ID生成方案吗?

25、你知道如何处理大数据量吗?(数据拆分篇)

26、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

27、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

28、你了解大型网站的页面静态化吗?

29、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

30、你知道怎么解决DB读写分离,导致数据不一致问题吗?

31、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

32、你真的知道怎么使用缓存吗?

33、如何利用锁,防止缓存击穿?重构思想的重要性

34、海量订单产生的业务高峰期,如何避免消息的重复消费?

35、你知道如何保障生产端100%消息投递成功吗?

36、微服务下的分布式session该如何管理?

37、阿里二面:filter、interceptor、aspect应如何选择?很多人中招

38、互联网架构重要组员CDN,很多高级开发都没有实操过,来看这里

39、阿里二面:CDN缓存控制原理,看看能不能难住你

你可能感兴趣的:(微服务网关Gateway在实战中如何结合注册中心,定义过滤器?)