JHipster API网关

JHipster可以生成API网关。网关是普通的JHipster应用程序,因此您可以在该项目上使用常规的JHipster选项和开发工作流,但它也充当微服务的入口。更具体地说,它为所有微服务提供HTTP路由和负载均衡,服务质量,安全性和API文档。

目录

  1. 架构图
  2. HTTP路由
  3. 安全
  4. 自动文档
  5. 限速
  6. 访问控制策略

架构图

Diagram

HTTP请求使用网关进行路由

启动网关和微服务后,它们将在registry中注册自己(使用src/main/resources/config/application.yml文件中的eureka.client.serviceUrl.defaultZone项)。

网关将使用其应用程序名字自动将所有请求代理到微服务:例如,注册微服务app1时,该请求在网关上的/services/app1URL上可用。

例如,如果您的网关运行在localhost:8080上,则可以指向http://localhost:8080/services/app1/api/foos来获取微服务app1服务的foos资源。 如果您尝试使用Web浏览器执行此操作,请不要忘记REST资源在JHipster中是默认保护的,因此您需要发送正确的JWT标头(请参见下面的安全性要点),或在微服务的MicroserviceSecurityConfiguration类删除这些URL安全保护。

如果有多个运行同一服务的实例,则网关将从JHipster Registry获取这些实例,并将:

每个网关都有一个特定的”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微服务时选择了缓存选项(这里是使用缓存文档),则将生成特定的CachedUserInfoTokenServicesSpring 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界面,因此所有请求都可以直接使用。

限速

这是一项高级特性,它使用Bucket4jHazelcast提供微服务上的服务质量。

网关提供速率限制功能,因此可以限制REST请求的数量:

  • 通过IP地址(对于匿名用户)
  • 通过用户登录(对于已登录的用户)

然后,JHipster将使用Bucket4jHazelcast请求计数,并在超出限制时发送HTTP 429(请求过多)错误。每个用户的默认限制是每小时100,000个API调用。

这是一项重要功能,可以保护微服务架构免于被特定用户的请求所淹没。

网关在保护REST端点安全时,可以完全访问用户的安全信息,因此可以扩展它,以根据用户的安全角色提供特定的速率限制。

要启用速率限制,请打开application-dev.ymlapplication-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/fooAPI端点可用:

jhipster:
    gateway:
        authorized-microservices-endpoints:
            bar: /api/foo