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

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

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


目录

  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配置

08c2da8f13e703ff0b07387db959a33d.png

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

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

二)application配置文件

7d5c1c7bf0ce72f5683cfd2d7be8a253.png

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

三)Application启动

82ca6173134229c5e181c076627ba049.png

注解@EnableDiscoveryClient

四)Controller

db40f5af6146ba7948e2959b8d542aee.png

两个接口微服务

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

42f01b6f6d0857d062d4eed2e7bbe3bb.png

goods-provider注册成功。

微服务消费者

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

一)application配置文件

0dbc35b368678802fd4c050321249fca.png

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

二)Application启动

dce2b9dac9c20384a5a97bab8337b0c8.png

注解@EnableDiscoveryClient

三)Configuration

ddfa1c329ea850620c9423a7d8de89a1.png

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

四)Controller

92e8c37ebdc879f25190fa1d13e1b908.png

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

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

a48e7220990650b97731d0d257b5c15f.png

微服务网关

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

一)POM

fa44c7bd65749158a939c1f0ab554eb5.png

二)application配置文件

90da5ea6b58f9d7025109c36c3fa0cf9.png

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

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

三)Application启动

ffdbb5366751b901f3e2efb4c7170bc7.png

启动查看Nacos控制台

4ebccd54c3e947475114fed31faabac3.png

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

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

返回

15390dd4521e72a0f3118443ae8cc7b2.png

在刷新

ad345d2b32572d16d4bba656da53e19b.png

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

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

d89fe1bb34d39c322caee419755cfd0c.png

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

访问

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

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

0d7b7946aaa1828cb594243efc38be0a.png
b70e9d90b1e0812d86223aa2358a5bff.png

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

8998847432e1b3f6901a21d2e5909add.png

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

1、AddRequestHeader GatewayFilter Factory

cb5a0c812aa6a20b0aabafac5a3d99b8.png

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

2、RewritePath GatewayFilter Factory

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

351a7b62c93144caafb70216d0d2558d.png

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

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

自定义GatewayFilter

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

53b649e37970c2f1224c95b7d901e2ea.png

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

fdc16212c8e5090520ea29ad79f63644.png

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

de6608021c0716a9928db7157b2fe4b5.png

可以看到请求耗时。

自定义过滤器工厂

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

代码如下:

7a02e63f1287ba1314e7922f9ffb729c.png
c4efcafbece05bc5232ad345f08c5a89.png

配置文件

238a71188f4d695d2574b0ad55688d74.png

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

启动效果和上面的一致。

自定义GlobalFilter

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

bb0656a7135c6bf88f524789e2d5d83e.png

启动请求

540a1d7e4f029d839d6ffb2334ba0a25.png
ef107e04abf3d5352551dff6efb38868.png

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

b73c3574531b9c16485bc31ee72fcabb.png

路由正常。

总结

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


---End---

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值