什么是网关

在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平台无关的服务协议作为各个单元间的通讯方式。

换句话说就是网关为所有的请求提供了统一的入口,方便我们对服务请求和响应做统一管理。

为什么要用网关

API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。

图一:

什么是gateway

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

gateway工作原理

图二:

客户端向Spring Cloud网关发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的过滤器链发送请求。过滤器由虚线分隔的原因是,过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“前置”过滤器逻辑,然后发出代理请求。发出代理请求后,将执行“后”过滤器逻辑。

路由规则

路由和过滤器是gateway中非常重要的两个概念,gateway本身提供了非常丰富的路由规则和多种过滤器来适配我们的需求。gateway提供了11种路由规则,分别是:

  • 后置路由谓词工厂

该谓词匹配在当前日期时间之后发生的请求。参数名为 After

  • 前置路由谓词工厂

该谓词匹配当前日期时间之前发生的请求。参数名为 Before

  • 时间段路由谓词工厂

该谓词匹配在datetime1之后和datetime2之前发生的请求。参数名为 Between

  • cookie路由谓词工厂

该谓词匹配具有给定名称的cookie,并且值匹配正则表达式。参数名为 Cookie

  • 标头路由谓词工厂

该谓词与具有给定名称的标头匹配,并且值与正则表达式匹配。参数名为 Header

  • 主机路由谓词工厂

该谓词是指由路由进行匹配,匹配多个路由时用,隔开。参数名为 Host

  • 方法路由谓词工厂

该参数是一个或多个要匹配的HTTP方法。参数名为 Method

  • 路径路由谓词工厂

该谓词是指在请求路径上加一个前缀,以此来匹配。参数名为 Path

  • 查询路由谓词工厂
  • RemoteAddr路由谓词工厂
  • 重量路线谓词工厂

其中,我们比较常用的就是路径路由谓词工厂,配合StripPrefix GatewayFilter工厂,实现我们的路由匹配转发。

路径路由谓词工厂配置如下:

spring:cloud:gateway:discovery:locator:enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由routes:# 路由id,建议配合服务名- id: demo_route #匹配路由名uri: lb://demo-provider predicates:# 断言,路径相匹配的进行路由- Path=/demo/** 

配置的含义就是,如果请求路径中是/demo/**,则转发到demo-provider服务。

网关过滤器

在spring cloud gateway 2.2.2.RELEASE版本中,已经默认实现了30种过滤器。

过滤器工厂 作用 参数

AddRequestHeader 为原始请求添加Header Header的名称及值

AddRequestParameter 为原始请求添加请求参数 参数名称及值

AddResponseHeader 为原始响应添加Header Header的名称及值

DedupeResponseHeader 剔除响应头中重复的值需要去重的 Header名称及去重策略

Hystrix 为路由引入Hystrix的断路器保护 HystrixCommand的称

CircuitBreaker 为路由引入Resilience4J断路器保护 CircuitBreaker的名称

FallbackHeaders 为fallbackUri的请求头中添加具体的异常信息 Header的名称

MapRequestHeader 更新原始请求中的Header Header的值

PrefixPath 为原始请求头添加前缀 前缀路径

RedirectTo 将原始请求重定向到指定的url http状态码及重定向url

RemoveRequestHeader 为原始请求删除某个Header Header名称

这里比较常用的如第25种,配置如下:

spring:cloud:gateway:discovery:locator:enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由routes:# 路由id,建议配合服务名- id: demo_route #匹配路由名uri: lb://demo-provider predicates:# 断言,路径相匹配的进行路由- Path=/demo/** filters:- StripPrefix=1

一般情况下我们配合path路由使用,这里的意思是假如,我们的demo-provider服务种有一个/test的接口,实际上我们的请求路径经过网关时应该时/demo/test,这样就能把这个路由分发到demo-provider服务中,但是分发过去的路由是/demo/test,和我们实际的/test接口不一样。这时候我们用StripPrefix=1,来截取掉一级路由,这样转发过去的路由就是/test了。

自定义网关过滤器

除了上面提供的30种过滤器外,我们还可以实现自定义的过滤器。

1. 实现GatewayFilter接口和Ordered接口

gatewayFilter接口是为了实现请求过滤,ordered接口是为了给过滤器设定优先级,值越大级别越低。

想要实现一个自定义的过滤器,无非就是两个步骤:1.实现过滤器,2.将过滤器添加到具体路由上。

public class TokenGatewayFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("这里处理自身逻辑");return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}
@Configuration
class RouteConfiguration{@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder){return builder.routes().route( r->r.path("/demo/**").uri("lb://demo-provider ").filter(new TokenGatewayFilter()).id("demo_route ")).build();}
}

2.继承AbstractGatewayFilterFactory类

@Component
public class TokenCheckGatewayFilterFactory extends AbstractGatewayFilterFactory<TokenCheckGatewayFilterFactory.Config> {public TokenCheckGatewayFilterFactory() {super(Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("enabled");}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {system.out.println("这里处理自身逻辑")return chain.filter(exchange);};}public static class Config {// 控制是否开启认证private boolean enabled = true;public Config() {}public boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled = enabled;}}
}
这里我们可以直接在application.yml中为需要过滤的路由添加这个过滤器。
spring:cloud:gateway:routes:- id: demo_route # 路由id,建议配合服务名uri: lb://demo-provider #匹配路由名predicates:- Path=/demo/** # 断言,路径相匹配的进行路由filters:- TokenCheck=true

需要注意的是,这个地方自定义的过滤器名称必须是XXGatewayFilterFactory,并且配置文件中配置过滤器时名字必须时这个XX

当然,我们也可以为每个路由都添加这个过滤器,可以直接这样写配置,而不用在每个路由上都去写。

spring:cloud:gateway:default-filters:- TokenCheck=true

3.实现GlobalFilter和ordered

这个GlobalFilter从名字中就可以看出,是一个全局过滤器,也就是说实现这个接口后,所有的请求都会被过滤,我们就不需要在去找往某个路由中加过滤器了。

@Component
public class TokenGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("这里处理自身逻辑");return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

以上就是实现自定义网关过滤器的三种方式了。实际开发中根据需求来实现合适的过滤器就可以了。

gateway动态路由_Java如何用Spring Cloud奇淫小技巧 来使用gateway作为服务网管相关推荐

  1. Spring Cloud Gateway 动态路由管理,一点都不吹,应该没有比这更好的管理系统了吧

      本文介绍的 Spring Cloud Gateway 动态路由.不比其他博客通篇 copy 的 Gateway 动态路由,直接上干货!!!为你们提供了一套完整的动态路由管理系统.文末附本文全套代码 ...

  2. gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了

    前言 当我们的网关Gateway程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问,网关 ...

  3. gateway动态路由_微服务中的网关技术:Gateway

    技术/杨33 一.Gateway是什么 为微服务提供一种简单有效的统一的API路由管理方式. Gateway是基于WebFlux框架实现的,而WebFlux框架底层使用了高性能的Reactor模式通讯 ...

  4. Nacos + Spring Cloud Gateway动态路由配置

    前言 Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦复杂的环境切换提供了方便:同时也很好支持动态路由的配置,只需要简单的几步即可.在国产的注册中心.配置中心中比较突出, ...

  5. Spring Cloud Gateway动态路由实现

    Gateway上线部署分析 当你的网关程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问 ...

  6. spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定

    一.微服务网关Spring Cloud Gateway 1.1 导引 文中内容包含:微服务网关限流10万QPS.跨域.过滤器.令牌桶算法. 在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuu ...

  7. Gateway网关简介及使用。Spring Cloud Alibaba---Gateway概述、简单示例。什么是Gataway网关?网关能干什么?Spring Cloud如何搭建一个网关。

    一.什么是网关: 在微服务架构里,每一个微服务都是一个个体,各个服务可以被独立的设计.开发.测试.部署和管理.这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设 ...

  8. spring cloud 快速上手系列 -> 04-网关 Gateway -> 041-空的工程

    spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 04-网关 Gateway 041-空的工程 1,说明 网 ...

  9. gateway动态路由_spring-cloud-gateway简介

    概述 API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求.如果让客户端直接与各个微服务通信,会有以下的问题: 客户端 ...

最新文章

  1. python括号匹配问题_支持通配符的括号匹配问题源码+详细流程代码(python)
  2. php开启错误日志,PHP开启error_log 错误日志
  3. 删除git所有历史记录 仅保留当前文件
  4. data 谷歌浏览器更改user 路径_chrome修改默认用户目录
  5. Bailian3164 奇偶排序【排序】
  6. 机翻测评 | 友商翻译 VS 火山翻译-中译英语向
  7. 默认锁屏壁纸无效问题
  8. Word表格中的文字垂直、纵向居中
  9. 修改postgresql库表的owner
  10. 人人都能写游戏系列(三)Unity 3D平衡球游戏
  11. 【第一个Vue上手小项目Day4】史上最简单的Element-table表格+Pagination 分页(前后端结合)
  12. drools决策表的简单使用
  13. c++---constructor(ctor,构造函数)
  14. 计算机趣事 英语作文,寒假趣事英语作文4篇
  15. vscode中输入的中文变繁体的问题
  16. 2800首无损格式经典歌曲分享
  17. MySQL之window安装包安装
  18. 总结2012年世界经济形势主要特征
  19. VRBT视频彩铃解决方案
  20. Hive SQL经典面试题:统计连续登陆的三天及以上的用户

热门文章

  1. python 类不实例化方法:@staticmethod或@classmethod
  2. BottomupSort算法 c++代码实现
  3. 在开发环境中,自己搭建一个ssl环境(小例子)
  4. jqGrid编辑—公共规则【附视频、ppt、源码】
  5. jquery实现输入框动态增减
  6. 美国只有两样东西比中国贵
  7. 无废话WPF系列19:MVVM简单介绍
  8. ORACLE数据库恢复
  9. layer的msg函数_layer弹出信息框API
  10. linux 获取命令行返回的数据_Linux | 活用CLI命令行进行数据处理与探索