目录

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

这边需要提醒的一点就是,因为采用了注册中心为阿里的,所以我们这里采用的机制都是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在实战中如何结合注册中心,定义过滤器?相关推荐

  1. SpringCloud 微服务网关Gateway 动态路由配置

    概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...

  2. Spring Cloud之(十八)微服务网关GateWay

    十八.微服务网关GateWay Zuul 1.x 是一个基于阻塞 IO 的 API Gateway 以及 Servlet:直到 2018 年 5 月,Zuul 2.x(基于Netty,也是非阻塞的,支 ...

  3. SpringCloud—— 微服务网关GateWay

    目录 1.GateWay网关概述 1.1.什么是GateWay? 1.2.为什么要使用微服务网关? 1.3.Zuul与GateWay网关的区别? 2.快速入门 2.1.创建项目 2.2.配置yml文件 ...

  4. 微服务网关Gateway实战

    1. 什么是Spring Cloud Gateway 网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等. Spring Cloud Gateway 是Spring Cloud官方推出的第二 ...

  5. SpringCloud 微服务网关Gateway介绍及简单路由配置

    概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...

  6. SpringCloud Alibaba 微服务 — 微服务网关 Gateway

    一.Spring Cloud Gateway 简介 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.x.Spring Boot 2.x.Spring WebFl ...

  7. 微服务网关GateWay 过滤+路由+限流

    文章目录 1 微服务网关概述 2 微服务网关微服务搭建 3 微服务网关跨域 4 微服务网关过滤器 5 微服务网关限流 5.1 思路分析 5.2 令牌桶算法 5.3 网关限流代码实现 1 微服务网关概述 ...

  8. 微服务网关Gateway

    使用场景 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的微服务,增加了客户端 ...

  9. 微服务网关Gateway(七)

    前言 zuul目前已经出现了分歧,zuul 升级到 Zuul2的时候出现了内部分歧,并且导致Zuul的核心人员的离职,导致Zuul2一直跳票,等了两年,目前造成的局面是Zuul已经没人维护,Zuul2 ...

  10. Spring Cloud 微服务网关Gateway组件

    一.网关介绍 大家都知道在微服务架构中,一个系统会被拆分为多个微服务,那么作为客户端如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用. 这样的架构会存 ...

最新文章

  1. 关闭eslint检查2020_2020 vscode配置eslint保存后自动fix
  2. 改编码格式_编码不规范,同事真的会两行泪?
  3. xface 远程桌面 无法使用tab键盘
  4. 让小乌龟可以唱歌——对Python turtle进行拓展
  5. conda - 虚拟环境,常用指令
  6. 娱乐项目和女朋友哪个重要?
  7. NYNU_省赛选拔题(10)
  8. CAM350 10.5完美精减版
  9. 【计算机网络】计算机网络基础知识笔记
  10. 【游戏开发实战】权游红袍女在火中看到了什么,我看到了...(Unity | 粒子系统 | 火焰特效 | ParticleSystem | 手把手制作)
  11. 微信公众平台接口调试工具json格式不对怎么搞_微信支付、支付宝最全接入指引,看完立刻就可以上手!...
  12. CodeWarrior for S12(X) V5.1 Special详细安装过程
  13. 【心理学硕士论文】内观认知疗法对手机成瘾倾向的影响研究(节选)
  14. 又冒出来了不错的创意
  15. 华为Mate20系列赢得各界盛誉,棋圣聂卫平也对其AI性能称赞
  16. 让卫浴间四季花香 最懂你的智能马桶 ——安华智能坐便器aB13017-1众测报告
  17. Linux查看主机信息及修改主机名hostname
  18. 区块链技术研究热点有哪些
  19. Java中HashMap底层实现原理
  20. ICP 问题之 SVD

热门文章

  1. time clock getrusage clock_gettime gettimeofday timespec_get 对比
  2. Stacked injection--堆叠注入--堆查询注入
  3. LigerUI之Grid使用详解(三)——字典数据展示
  4. Java/Hbase + C云平台架构设计_十项法则
  5. MATLAB命令窗常用命令
  6. linux上禅道源码安装步骤
  7. VIM命令记录和cscope结合使用
  8. ffmpeg1.2的filter分析
  9. libxml主要函数说明 (二)
  10. 定时器函数执行原理揭秘