Portal-Gateway路由网关
1.1整体设计
- Portal-Gateway的应用场景:用户已登录,请求其他服务。
- 客户端的请求到达网关,网关会调用gateway系统进行请求身份合法性的验证:
- 验证不通则直接拒绝,并返回401;
- 如果通过验证,则转发到具体服务。
Portal-Gateway的架构图如下所示:
1.2 gateway实现
主要实现的功能有:
- 区分暴露接口(即对外直接访问)和需要合法身份登录之后才能访问的接口
- 需要合法身份登录之后才能访问的接口,根据传入的Access token进行构造头部,头部主要包括userId等信息,可根据自己的实际业务在auth服务中进行设置。
- 需要暴露接口设置permitAll(),其余接口进入身份合法性校验的流程,调用auth服务,如果通过则正常继续转发,否则抛出异常,返回401。
绘制的流程图如下:
1.2.1 permitAll实现
对外暴露的接口可以直接访问,这可以依赖配置文件,而配置文件又可以通过配置中心进行动态更新,所以不用担心有hard-code的问题。经过permitall配置的路径
在配置文件中定义需要permitall的路径:
auth:permitall:-pattern: /login/**-pattern: /web/public/**
服务启动时,读入相应的Configuration,下面的配置属性读取以auth开头的配置:
@Bean @ConfigurationProperties(prefix = "auth") public PermitAllUrlProperties getPermitAllUrlProperties() {return new PermitAllUrlProperties(); }
1.2.2 自定义RemoteTokenServices实现
ResourceServerTokenServices
接口其中的一个实现是RemoteTokenServices
。
RemoteTokenServices
主要是查询auth服务的/check_token
端点以获取一个token的校验结果。如果有错误,则说明token是不合法的。Spring Cloud Security添加如下默认配置,对应auth服务中的相应端点。
properties: sso: loginUrl: https://myrtc.egoonet.com/sso # 单点登录地址 ssoInternal: https://myrtc.egoonet.com/sso # 单点中心内网负载地址,SAML协议可不填security:oauth2:client:client-id: portal # 客户端ID (单点中心提供) client-secret: oauth_client_secret # 客户端秘钥 (单点中心提供) resource:user-info-uri: ${properties.sso.loginUrl}/if/sso/user/me # 获取当前用户信息地址token-info-uri: ${properties.sso.ssoInternal}/oauth/check_token# 验证token地址
1.2.3 Router的实现
词汇表主要包含以下3个组成部分:
- Route 路由:gateway的基本构建模块。它由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则匹配到该路由。
- Predicate 断言:这是一个Java 8 Function Predicate。输入类型是 Spring Framework
ServerWebExchange
。这允许开发人员可以匹配来自HTTP请求的任何内容,例如Header或参数。 - Filter 过滤器:这些是使用特定工厂构建的 Spring Framework
GatewayFilter
实例。所以可以在返回请求之前或之后修改请求和响应的内容。
客户端向Spring Cloud Gateway发出请求。如果Gateway Handler Mapping确定请求与路由匹配,则将其发送到Gateway Web Handler。此handler通过特定于该请求的过滤器链处理请求。图中filters被虚线划分的原因是filters可以在发送代理请求之前或之后执行逻辑。先执行所有“pre filter”逻辑,然后进行请求代理。在请求代理执行完后,执行“post filter”逻辑。
路由规则都可以配置,具体使用可以参考一下Spring Cloud Gateway 2.1.0 中文官网文档。
1.3 gateway配置和使用
由于项目使用maven模块化配置,Springboot版本为:2.1.3.RELEASE
, SpringCloud版本为:Finchley.RELEASE。
gateway支持两种方式提供路由服务,其一是配置文件启用,其二则是通过代码达到目的。
1.3.1 pom配置
要在项目中引入gateway,需要引用 group org.springframework.cloud
和 artifact id为spring-cloud-starter-gateway
starter。最新的Spring Cloud Release 构建信息,请参阅Spring Cloud Project page。
如果应用了该starter,但由于某种原因不希望启用网关,请进行设spring.cloud.gateway.enabled=false
。
重要 Spring Cloud Gateway依赖Spring Boot和Spring Webflux提供的Netty runtime。它不能在传统的Servlet容器中工作或构建为WAR
请注意:不要引入spring-boot-starter-web
包,会导致Gateway启动抛出异常
1.3.2 application.yml
配置实现
spring:cloud:gateway:routes:# This route rule used to forward request to activity server- id: activity-routeuri: lb://activitypredicates:- Path=/activity/**filters:- StripPrefix=1
注意:Gateway默认转发是全路径的,设置StripPrefix=1
表示从二级url路径转发,即http://localhost:port/activity/test
将会转发到http://{activity}/test
1.3.2 代码实现
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route(r -> r.path("/activity/**").filters(f -> f.stripPrefix(1).filter(new TestGetWayFilter()).addResponseHeader("X-Response-Default-Foo", "Default-Bar")).uri("lb://activity").order(0).id("activity-route")).build();}
1.4 应用案例
1.4.1 案例1-通过使用Java正则表达式灵活地重写请求路径
包含一个 regexp
正则表达式参数和一个 replacement
参数. 通过使用Java正则表达式灵活地重写请求路径。
对于请求路径/foo/bar
,将在发出下游请求之前将路径设置为/bar
。注意,由于YAML规范,请使用 $\
替换 $
。
cloud:gateway:routes:- id: service_path_routeuri: http://222.73.213.174:10013predicates:- Path=/foo/**filters:- RewritePath=/foo/(?<segment>.*), /$\{segment}
该配置主要包含id、uri、predicates和fileters。
实现功能:
- 接口请求Potal-Gateway:http://ip:9099/foo/v1/WorkOrder/select
- 路径中包含foo,Potal-Gateway会对foo进行过滤,使用fileters中的规则对其进行url替换
- 最终由Potal-Gateway转发地址请求:http://222.73.213.174:10013/v1/WorkOrder/select
1.4.2 案例2-Cookie 路由断言 Factory
Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含次cookie名称且正则表达式为真的将会被匹配。
application.yml spring:cloud:gateway:routes:- id: cookie_routeuri: http://example.orgpredicates:- Cookie=chocolate, ch.p
1.4.3 案例3-Header 路由断言 Factory
Header 路由断言 Factory有两个参数,header名称和正则表达式。请求包含次header名称且正则表达式为真的将会被匹配。
application.yml. spring:cloud:gateway:routes:- id: header_routeuri: http://example.orgpredicates:- Header=X-Request-Id, \d+
1.4.4 案例4-路由断言 Factory
Host 路由断言 Factory包括一个参数:host name列表。使用Ant路径匹配规则,.
作为分隔符。
spring:cloud:gateway:routes:- id: host_routeuri: http://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org
1.4.5 案例5-Method 路由断言 Factory
Method 路由断言 Factory只包含一个参数: 需要匹配的HTTP请求方式
application.yml. spring:cloud:gateway:routes:- id: method_routeuri: http://example.orgpredicates:- Method=GET
所有GET请求都将被路由
1.4.6 案例6-Path 路由断言 Factory
Path 路由断言 Factory 有2个参数: 一个Spring PathMatcher
表达式列表和可选matchOptionalTrailingSeparator
标识 .
application.yml. spring:cloud:gateway:routes:- id: host_routeuri: http://example.orgpredicates:- Path=/foo/{segment},/bar/{segment}
例如: /foo/1
or /foo/bar
or /bar/baz
的请求都将被匹配
URI 模板变量 (如上例中的 segment
) 将以Map的方式保存于ServerWebExchange.getAttributes()
key为ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE
. 这些值将在GatewayFilter Factories使用以下方法来更方便地访问这些变量。
Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange); String segment = uriVariables.get("segment");
1.4.7 案例7-Query 路由断言 Factory
Query 路由断言 Factory 有2个参数: 必选项 param
和可选项 regexp
.
application.yml. spring:cloud:gateway:routes:- id: query_routeuri: http://example.orgpredicates:- Query=baz
则包含了请求参数 baz
的都将被匹配。
application.yml. spring:cloud:gateway:routes:- id: query_routeuri: http://example.orgpredicates:- Query=foo, ba.
如果请求参数里包含foo
参数,并且值匹配为ba.
表达式,则将会被路由,如:bar
and baz
Portal-Gateway路由网关相关推荐
- Gateway 路由网关
Gateway 路由网关 1-Gateway 概述 1.1-是什么 1.2-能干嘛 1.3-Why Gateway 2-Gateway 核心 2.1-核心概念 2.2-工作流程 3-Gateway 配 ...
- SpringCloud之 Gateway路由网关
文章目录 Gateway 路由网关 一.部署网关
- gateway路由网关,zuul的替代品
zuul1 low, zuul2 还没长大呢,不敢用. gateway 基于netty, spring flux, reactor 异步非阻塞, 快呀. 与spring良好整合, spring社区的呢 ...
- Spring Gateway路由网关
文章目录 简介 routes 路由服务 配置文件方式 Java DSL方式 predicates 路由断言 filters 过滤功能 自定义过滤器 简介 https://mp.weixin.qq.co ...
- GateWay路由网关的概述与入门详解
一.概述简介 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/h ...
- SpringCloud-getway路由网关
配置以及整个项目代码请到gitee查看https://gitee.com/xwb1056481167/spring-cloud/ 服务网关 SpringCloud中集成的Zuul版本,采用的是Tom ...
- SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤
说在前面 全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制,监控,限流等等. 创建路由网关(Gateway)启动服务cloud-ac ...
- SpringCloud Alibaba微服务实战(六) - 路由网关(Gateway)
什么是 Spring Cloud Gateway? Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Re ...
- SpringCloud-07-新一代路由网关Spring Cloud Gateway
服务网关Gateway 1. 概述简介 1. SpringCloud Gateway是什么? 服务网关还可以用Zuul网关,但是Zuul网关由于一些维护问题,所以这里我们学习Gateway网关,Spr ...
- 第九章:路由网关(Zuul)的使用
2019独角兽企业重金招聘Python工程师标准>>> 第九章:路由网关(Zuul)的使用 前言 介绍完分布式配置中心,结合前面的文章.我们已经有了一个微服务的框架了,可以对外提供a ...
最新文章
- console.log 如何打印对象
- 一起谈.NET技术,WCF的问题和Using语句块
- tool class
- 我知道乐观锁,但是我的确不知道CAS啊,到底什么是CAS
- Oracle RAC万能集群测试大全 支持11g/12c/18c/19c版本
- 2014025631嵌入式程序设计第一周学习总结
- 2018年华为软件精英挑战赛-初赛赛题
- 央行数字货币:第三方支付产业新变量
- HTTP、HTTPS常用的默认端口号
- 初识XUL用户界面UI开发
- Vuex模块化用法 跨模块调用方法
- 小米平板2刷android,小米平板2怎么刷回MIUI 小米平板2刷回MIUI教程
- java版精简搜狗皮肤
- Excel报表的导出
- 给定C语言数据结构,给定C语言的数据结构struct T { int w; union T { char c;int i;double d;)U; };...
- 中国科学院计算机博士范,范可(中科院研究员)_百度百科
- 科普大佬说 | 智能仿生机器鱼
- Netty ChannelGroup自动移除InActive的Channel实现
- HCSC: Hierarchical Contrastive Selective Coding
- 电商仓储云仓储到底是什么?
热门文章
- 【数据治理】数据分析八大模型:OGSM模型
- Android高级控件(四)——VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷
- 【雷达】基于RD、RMA、CS三种算法实现雷达成像附matlab代码
- 2019年11月14日
- window10或XP 定时换壁纸,添加计划到windows任务里,cmd换壁纸
- 计算机word做课程表实验报告,《用Word制作课程表》“学讲方式”案例分析
- 傅里叶变化(一)—— 复数
- Wordpress中文章的特色图像Featured Image究竟存在哪里?
- DHCP简单拓扑图演示
- Internet History, Technology and Security (Week5.1)