Portal-Gateway的架构图如下所示:
主要实现的功能有:
绘制的流程图如下:
对外暴露的接口可以直接访问,这可以依赖配置文件,而配置文件又可以通过配置中心进行动态更新,所以不用担心有hard-code的问题。经过permitall配置的路径
在配置文件中定义需要permitall的路径:
auth: permitall: - pattern: /login/** - pattern: /web/public/**
服务启动时,读入相应的Configuration,下面的配置属性读取以auth开头的配置:
@Bean @ConfigurationProperties(prefix = "auth") public PermitAllUrlProperties getPermitAllUrlProperties() { return new PermitAllUrlProperties(); }
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地址
词汇表主要包含以下3个组成部分:
ServerWebExchange
。这允许开发人员可以匹配来自HTTP请求的任何内容,例如Header或参数。GatewayFilter
实例。所以可以在返回请求之前或之后修改请求和响应的内容。
客户端向Spring Cloud Gateway发出请求。如果Gateway Handler Mapping确定请求与路由匹配,则将其发送到Gateway Web Handler。此handler通过特定于该请求的过滤器链处理请求。图中filters被虚线划分的原因是filters可以在发送代理请求之前或之后执行逻辑。先执行所有“pre filter”逻辑,然后进行请求代理。在请求代理执行完后,执行“post filter”逻辑。
路由规则都可以配置,具体使用可以参考一下Spring Cloud Gateway 2.1.0 中文官网文档。
由于项目使用maven模块化配置,Springboot版本为:2.1.3.RELEASE
, SpringCloud版本为:Finchley.RELEASE。
gateway支持两种方式提供路由服务,其一是配置文件启用,其二则是通过代码达到目的。
要在项目中引入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启动抛出异常
application.yml
配置实现spring: cloud: gateway: routes: # This route rule used to forward request to activity server - id: activity-route uri: lb://activity predicates: - Path=/activity/** filters: - StripPrefix=1
注意:Gateway默认转发是全路径的,设置StripPrefix=1
表示从二级url路径转发,即http://localhost:port/activity/test
将会转发到http://{activity}/test
@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(); }
包含一个 regexp
正则表达式参数和一个 replacement
参数. 通过使用Java正则表达式灵活地重写请求路径。
对于请求路径/foo/bar
,将在发出下游请求之前将路径设置为/bar
。注意,由于YAML规范,请使用 $\
替换 $
。
cloud: gateway: routes: - id: service_path_route uri: http://222.73.213.174:10013 predicates: - Path=/foo/** filters: - RewritePath=/foo/(?.*), /$\{segment}
该配置主要包含id、uri、predicates和fileters。
实现功能:
Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含次cookie名称且正则表达式为真的将会被匹配。
application.yml spring: cloud: gateway: routes: - id: cookie_route uri: http://example.org predicates: - Cookie=chocolate, ch.p
Header 路由断言 Factory有两个参数,header名称和正则表达式。请求包含次header名称且正则表达式为真的将会被匹配。
application.yml. spring: cloud: gateway: routes: - id: header_route uri: http://example.org predicates: - Header=X-Request-Id, \d+
Host 路由断言 Factory包括一个参数:host name列表。使用Ant路径匹配规则,.
作为分隔符。
spring: cloud: gateway: routes: - id: host_route uri: http://example.org predicates: - Host=**.somehost.org,**.anotherhost.org
Method 路由断言 Factory只包含一个参数: 需要匹配的HTTP请求方式
application.yml. spring: cloud: gateway: routes: - id: method_route uri: http://example.org predicates: - Method=GET
所有GET请求都将被路由
Path 路由断言 Factory 有2个参数: 一个Spring PathMatcher
表达式列表和可选matchOptionalTrailingSeparator
标识 .
application.yml. spring: cloud: gateway: routes: - id: host_route uri: http://example.org predicates: - 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使用以下方法来更方便地访问这些变量。
MapuriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange); String segment = uriVariables.get("segment");
Query 路由断言 Factory 有2个参数: 必选项 param
和可选项 regexp
.
application.yml. spring: cloud: gateway: routes: - id: query_route uri: http://example.org predicates: - Query=baz
则包含了请求参数 baz
的都将被匹配。
application.yml. spring: cloud: gateway: routes: - id: query_route uri: http://example.org predicates: - Query=foo, ba.
如果请求参数里包含foo
参数,并且值匹配为ba.
表达式,则将会被路由,如:bar
and baz