JHipster API网关
JHipster可以生成API网关。网关是普通的JHipster应用程序,因此您可以在该项目上使用常规的JHipster选项和开发工作流,但它也充当微服务的入口。更具体地说,它为所有微服务提供HTTP路由和负载均衡,服务质量,安全性和API文档。
目录
架构图
HTTP请求使用网关进行路由
启动网关和微服务后,它们将在registry中注册自己(使用src/main/resources/config/application.yml
文件中的eureka.client.serviceUrl.defaultZone
项)。
网关将使用其应用程序名字自动将所有请求代理到微服务:例如,注册微服务app1
时,该请求在网关上的/services/app1
URL上可用。
例如,如果您的网关运行在localhost:8080
上,则可以指向http://localhost:8080/services/app1/api/foos来获取微服务app1
服务的foos资源。
如果您尝试使用Web浏览器执行此操作,请不要忘记REST资源在JHipster中是默认保护的,因此您需要发送正确的JWT标头(请参见下面的安全性要点),或在微服务的MicroserviceSecurityConfiguration
类删除这些URL安全保护。
如果有多个运行同一服务的实例,则网关将从JHipster Registry获取这些实例,并将:
- 使用Spring Coud Load Balancer负载均衡HTTP请求。
- 使用Netflix Hystrix提供断路器,以便快速,安全地删除发生故障的实例。
每个网关都有一个特定的”admin > gateway”菜单,可以在其中监视打开的HTTP路由和微服务实例。
如果有多个运行同一服务的实例,则网关将从JHipster Registry获取这些实例,并将: 使用Netflix Ribbon负载均衡HTTP请求。
安全
在此安全文档页面上详细介绍了标准JHipster安全选项。毕竟,保护微服务架构具有一些特定的调整和选项,在此进行详细介绍。
JWT(JSON Web令牌)
JWT(JSON Web令牌)是一种行业标准、易于使用的方法,用于保护微服务体系结构中的应用程序。
JHipster使用Okta提供的JJWT library来实现JWT。
令牌由网关生成,并发送到底层微服务:由于它们共享一个公共密钥,因此微服务能够验证令牌并使用该令牌对用户进行身份验证。
这些令牌是自我描述的:它们具有身份验证和授权信息,因此微服务不需要查询数据库或外部系统。这对于确保可扩展的体系结构很重要。
- 为了确保安全,必须在所有应用程序之间共享JWT秘密令牌。
- 对于每个应用程序,默认令牌是唯一的,由JHipster生成。它存储在
.yo-rc.json
文件中。 - 使用
src/main/resources/config/application.yml
文件中的jhipster.security.authentication.jwt.secret
密钥配置令牌。 - 要在所有应用程序之间共享此密钥,请将密钥从网关复制到所有微服务,或使用JHipster Registry的Spring Config Server或JHipster的Consul K / V存储的特定配置进行共享。这是人们使用这些中心配置服务器的主要原因之一。
- 推荐的做法是在开发和生产中使用其他密钥。
OpenID Connect
JHipster提供了OpenID Connect支持,如我们的OpenID Connect文档中所述。
选择此选项时,默认情况下将使用Keycloak,并且可能要使用Docker Compose运行完整的微服务架构:请确保阅读我们的Docker Compose文档,并为Keycloak配置正确的/etc/hosts
。
使用OpenID Connect时,JHipster网关会将OAuth2令牌发送到微服务,该微服务将接受这些令牌,因为它们也已连接到Keycloak服务。
与JWT不同,这些令牌不是自我描述的,而是有状态的,这导致以下问题:
微服务中的性能问题:由于查找当前用户的安全信息非常普遍(否则,从一开始我们就不会使用任何安全选项),几乎每个微服务都会调用OpenID Connect服务器来获取该数据。因此,在正常设置中,每个微服务都会在每次收到请求时进行这些调用,这将很快会导致性能问题。
- 如果在生成JHipster微服务时选择了缓存选项(这里是使用缓存文档),则将生成特定的
CachedUserInfoTokenServices
Spring Bean,它将缓存这些调用。正确设置后,这将消除性能问题。 - 如果您需要在“user info”请求获取更多信息,请使用
src/main/resources/application.yml
配置文件中的标准Spring Boot配置键值security.oauth2.resource.userInfoUri
对其进行配置。
自动文档
网关暴露了它所代理服务的Swagger API,许多工具依赖此特性,例如Swagger UI和swagger-codegen。
网关的”admin > API”菜单具有特定的下拉列表,其中显示了网关的API以及已注册的微服务中的所有暴露API。
使用此下拉列表,所有微服务API文档已经自动生成,并可以通过网关对其进行测试。
使用安全的API时,安全令牌会自动添加到Swagger UI界面,因此所有请求都可以直接使用。
限速
这是一项高级特性,它使用Bucket4j和Hazelcast提供微服务上的服务质量。
网关提供速率限制功能,因此可以限制REST请求的数量:
- 通过IP地址(对于匿名用户)
- 通过用户登录(对于已登录的用户)
然后,JHipster将使用Bucket4j和Hazelcast请求计数,并在超出限制时发送HTTP 429(请求过多)错误。每个用户的默认限制是每小时100,000个API调用。
这是一项重要功能,可以保护微服务架构免于被特定用户的请求所淹没。
网关在保护REST端点安全时,可以完全访问用户的安全信息,因此可以扩展它,以根据用户的安全角色提供特定的速率限制。
要启用速率限制,请打开application-dev.yml
或application-prod.yml
文件,并将enabled
设置为true
:
jhipster:
gateway:
rate-limiting:
enabled: true
数据存储在Hazelcast中,因此,只要配置了Hazelcast分布式缓存,便可以扩展网关,该网关可以直接使用:
- 默认情况下,所有网关都配置了Hazelcast
- 如果使用JHipster Registry,则网关的所有实例都应自动在分布式缓存中注册自己
如果要添加更多规则或修改现有规则,则需要在RateLimitingFilter
类中对其进行编码。修改示例可能是:
- 降低HTTP调用的限制
- 增加每分钟或每天限制
- 取消“admin”用户的所有限制
访问控制策略
默认情况下,所有已注册的微服务都可以通过网关来访问。如果要排除通过网关公开访问的特定API,可以使用网关的特定访问控制策略过滤器。可以使用application-*.yml
文件中的jhipster.gateway.authorized-microservices-endpoints
密钥对其进行配置:
jhipster:
gateway:
authorized-microservices-endpoints: # Access Control Policy, if left empty for a route, all endpoints will be accessible
app1: /api,/v2/api-docs # recommended dev configuration
例如,如果您只希望微服务bar
的 /api/foo
API端点可用:
jhipster:
gateway:
authorized-microservices-endpoints:
bar: /api/foo