Spring 云网关--安全和其他配置
Spring Cloud Gateway-安全及其他配置
Spring Cloud Gateway作为网关,除了提供了内置的一些常用的服务转发能力和报文修改能力以外,还有一些其他的能力,比如安全、监控等。
本节为大家介绍安全及其他配置。
TLS及SSL配置
网关通过配置Spring Server的相关参数即可方便的实现监听HTTPS请求,如下示例:
server:
ssl:
enabled: true
key-alias: mykey
key-store-password: ******
key-store: classpath:mykeystore.p12
key-store-type: PKCS12
同时网关可以支持将请求路由到HTTP服务以及HTTPS服务,如果需要路由到HTTPS服务,可以通过以下配置实现信任服务提供方的任何证书:
spring:
cloud:
gateway:
httpclient:
ssl:
useInsecureTrustManager: true
在一些对于安全要求较高的场景中,不允许直接使用不安全的可信管理器,那么就要用安全的可信管理器,如下配置:
spring:
cloud:
gateway:
httpclient:
ssl:
trustedX509Certificates:
- service1.pem
- service2.pem
在路由转发时用了SSL协议时,我们可以对TLS握手相关参数进行配置,如下:
spring:
cloud:
gateway:
httpclient:
ssl:
handshake-timeout-millis: 10000
close-notify-flush-timeout-millis: 3000
close-notify-read-timeout-millis: 0
网关配置
在前边的几篇文章中为大家介绍了Spring Cloud Gateway的很多配置参数和配置方式,那么这些配置是怎么加载生效的呢?
其实Spring Cloud Gateway的配置参数是通过一组RouteDefinitionLocator实例来加载生效的,默认是通过PropertiesRouteDefinitionLocator采用Spring Boot的@ConfigurationProperties机制来加载的,之前介绍的各种在application.yml中的配置都是通过这种方式来加载的。
但是在一些场景中,大家需要自定义参数配置来源,比如从数据库中加载配置,从Redis中加载配置,或者从其他来源加载配置,在这种情况下则需要用户自行实现RouteDefinitionLocator接口逻辑。
路由元数据
在application.yml中配置路由信息时,除了断言与过滤器以外,还可以配置附加的元数据,用于一些特殊用途,配置方式与获取方式如下:
spring:
cloud:
gateway:
routes:
- id: myroute
uri: https://127.0.0.1:8080
metadata:
ignoredHost: 127.0.0.1
Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
// 获取全部元数据
route.getMetadata();
// 获取指定元数据
route.getMetadata(someKey);
Http超时时间配置
在配置SSL时介绍了TSL握手相关的超时配置,另外还有路由转发时http请求相关的超时时间connect-timeout、response-timeout。
这两个参数可以配置全局生效,也可以配置到具体的路由:
spring:
cloud:
gateway:
httpclient:
connect-timeout: 1000 #时间单位为ms
response-timeout: 5s #全局配置需带时间单位
routes:
- id: myRoute
uri: http://127.0.0.1
predicates:
- name: Path
args:
pattern: /delay/{timeout}
metadata:
response-timeout: 200 #时间单位为ms,不能指定时间单位
connect-timeout: 200 #时间单位为ms
除了可以通过application.yml配置以外,也可以在通过java代码设置路由时配置:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
return routeBuilder.routes()
.route("test1", r -> {
return r.host("localhost").and().path("/test")
.filters(f -> f.addRequestHeader("test", "xxxx"))
.uri("http://127.0.0.1:8080")
.metadata(RESPONSE_TIMEOUT_ATTR, 200)
.metadata(CONNECT_TIMEOUT_ATTR, 200);
})
.build();
}
在配置具体路由时如果配置response-timeout为-1,则会使全局的配置无效。
Java方式配置路由
通过Fluent Java API代码的方式配置路由:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, ThrottleGatewayFilterFactory throttle) {
return builder.routes()
.route(r -> r.host("localhost").and().path("/image/png")
.filters(f ->
f.addResponseHeader("X-TestHeader", "foobar"))
.uri("http://127.0.0.1:8080")
)
.route(r -> r.path("/image/webp")
.filters(f ->
f.addResponseHeader("X-AnotherHeader", "baz"))
.uri("http://127.0.0.1:8081")
.metadata("key", "value")
)
.route(r -> r.order(-1)
.host("localhost").and().path("/get")
.filters(f -> f.filter(throttle.apply(1,
1,
10,
TimeUnit.SECONDS)))
.uri("http://127.0.0.1:8082")
.metadata("key", "value")
)
.build();
}
对接注册中心
用户还可以通过配置DiscoveryClient适配Eureka、Consul或者Zookeeper注册中心,实现服务地址自动发现。
只需要配置spring.cloud.gateway.discovery.locator.enabled=true
Netty访问日志配置
用户可以在Java System Property中配置-Dreactor.netty.http.server.accessLogEnabled=true
来开启Netty日志。
日志可通过logback.xml配置如下:
<appender name="accessLog" class="ch.qos.logback.core.FileAppender">
<file>access_log.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="accessLog" />
</appender>
<logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
<appender-ref ref="async"/>
</logger>
跨资源共享(CORS)配置
可以通过以下参数配置CORS:
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "http://www.mydomain.com"
allowedMethods:
- GET
add-to-simple-url-handler-mapping: true
Actuator API
用户可以通过配置开启/gateway端点来实现对Spring Cloud Gateway的监控,配置如下:
management.endpoint.gateway.enabled=true
management.endpoints.web.exposure.include=gateway
通过GET请求/actuator/gateway/globalfilters
可以获取所有全局过滤器。
通过GET请求/actuator/gateway/routefilters
可以获取所有配置到具体路由的过滤器。
通过POST请求/actuator/gateway/refresh
可以刷新路由缓存。
通过GET请求/actuator/gateway/routes
可以获取所有路由配置。
通过GET请求/actuator/gateway/routes/{id}
可以获取指定路由配置。
通过DELETE请求/gateway/routes/{id}
可以删除指定路由配置。
通过POST请求/gateway/routes/{id}
可以创建新的路由,post的请求报文为:
{
"id": "first_route",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/first"}
}],
"filters": [],
"uri": "https://www.uri-destination.org",
"order": 0
}
集群实例路由定义同步
在集群部署的情况下,用户需要实现不同实例之间的路由数据同步,这时我们可以通过配置spring.cloud.gateway.redis-route-definition-repository.enabled=true
来实现。
问题处理
有时为了定位问题,我们需要知道网关接收到的数据和发出去的数据,这时我们可以通过配置spring.cloud.gateway.httpserver.wiretap=true
和spring.cloud.gateway.httpclient.wiretap=true
来实现对出入数据的监控。
推荐阅读
-
[Spring Cloud] (4) 构建 Vue2 以与网关和微服务通信,并配置跨域 - 前端登录界面
-
主流云原生微服务 API 网关成熟度和安全功能对比分析
-
Spring 云网关--安全和其他配置
-
2022-01-24-安全网关配置模式(腾讯云 IPAAS)
-
一篇解释 API 网关核心功能的文章,即 nginx,无非是增加了安全、流量控制、转换、版本控制和其他功能。
-
保证 Spring 云网关网关安全 (II)
-
微服务网关和用户识别、用于网关安全认证的 JWT+Spring Security
-
小红书大产品部架构 小红书产品概览--经过性能、稳定性、成本等多个维度的详细评估,小红书最终决定选择基于腾讯云星海自研硬件的SA2云服务器作为主力机型使用。结合其秒级的快速扩缩、超强兼容和平滑迁移能力,小红书在抵御上亿次用户访问、保证系统稳定运行的同时,也实现了成本的大幅降低。 星海SA2云服务器是基于腾讯云星海的首款自研服务器。腾讯云星海作为自研硬件品牌,通过创新的高兼容性架构、简洁可靠的自主设计,结合腾讯自身业务以及百万客户上云需求的特点,致力于为云计算时代提供安全、稳定、性能领先的基础架构产品和服务。如今,星海SA2云服务器也正在为越来越多的企业提供低成本、高效率、更安全的弹性计算服务。 以下是与小红书SRE总监陈敖翔的对话实录。 问:请您介绍一下小红书及其主要商业模式? 小红书是一个面向年轻人的生活方式平台,在这里,他们发现了向上、多元的真实世界。小红书日活超过 3500 万,月活跃用户超过 1 亿,日均笔记曝光量达 80 亿。小红书由社交平台和在线购物两大部分组成。与其他线上平台相比,小红书的内容基于真实的口碑分享,播种不止于线上,还为线下实体店赋能。 问:围绕业务发展,小红书的系统架构经历了怎样的变革和演进? 系统架构变化不大,影响最深的是资源开销。过去三年,资源开销大幅增加,同比增长约 10 倍。在此背景下,我们努力进行优化,包括很早就开始使用 K8S 进行资源调度。到 18 年年中,绝大多数服务已经完全实现了容器化。 问:目前小红书系统架构中的计算基础设施建设和布局是怎样的? 我们目前的建设方式可以简单描述为星型结构。腾讯云在上海的一个区是我们的计算中心,承载着我们的核心数据和在线业务。在外围,我们还有两个数据中心进行计算分流,同时承担灾备和线上业务双活的角色。 与其他新兴电子商务互联网公司类似,小红书的大部分计算能力主要用于线下数据分析、模型训练和在线推荐等平台。随着业务的发展,对算力的需求也在加速增长。
-
iOS 云包装如何设置通用链接和其他功能配置
-
用于统一身份验证和网关身份验证的 Spring 云网关 + Spring 安全 OAuth2 + JWT