目录

  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网关


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

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

二)application配置文件


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_02


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

三)Application启动


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_03


注解@EnableDiscoveryClient

四)Controller


网关和注册中心之间的关系 网关管理注册未注册_gateway配置_04


两个接口微服务

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


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_05


goods-provider注册成功。

微服务消费者

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

一)application配置文件


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_06


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

二)Application启动


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_07


注解@EnableDiscoveryClient

三)Configuration


网关和注册中心之间的关系 网关管理注册未注册_网关和注册中心之间的关系_08


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

四)Controller


网关和注册中心之间的关系 网关管理注册未注册_gateway网关_09


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

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


网关和注册中心之间的关系 网关管理注册未注册_网关和注册中心之间的关系_10


微服务网关

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

一)POM


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_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 nacos注册服务_15


在刷新


网关和注册中心之间的关系 网关管理注册未注册_网关和注册中心之间的关系_16


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

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


网关和注册中心之间的关系 网关管理注册未注册_gateway配置_17


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

访问

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

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


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_18


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_19


上面介绍了结合注册中心,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 nacos注册服务_20


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

1、AddRequestHeader GatewayFilter Factory


网关和注册中心之间的关系 网关管理注册未注册_gateway配置_21


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

2、RewritePath GatewayFilter Factory

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


网关和注册中心之间的关系 网关管理注册未注册_gateway nacos注册服务_22


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

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

自定义GatewayFilter

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


网关和注册中心之间的关系 网关管理注册未注册_gateway网关_23


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


网关和注册中心之间的关系 网关管理注册未注册_gateway网关_24


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


网关和注册中心之间的关系 网关管理注册未注册_gateway配置_25


可以看到请求耗时。

自定义过滤器工厂

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

代码如下:


网关和注册中心之间的关系 网关管理注册未注册_网关和注册中心之间的关系_26


网关和注册中心之间的关系 网关管理注册未注册_网关和注册中心之间的关系_27


配置文件


网关和注册中心之间的关系 网关管理注册未注册_gateway网关_28


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

启动效果和上面的一致。

自定义GlobalFilter

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


网关和注册中心之间的关系 网关管理注册未注册_网关和注册中心之间的关系_29


启动请求


网关和注册中心之间的关系 网关管理注册未注册_gateway配置_30


网关和注册中心之间的关系 网关管理注册未注册_gateway动态路由_31


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


网关和注册中心之间的关系 网关管理注册未注册_gateway网关_32


路由正常。

总结

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


---End---

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