JHipster API网关 The JHipster API Gateway
JHipster可以生成API网关。网关是一个正常的JHipster应用程序,所以您可以使用该项目中通常的JHipster选项和开发工作流程,但它也充当您的微服务器的入口。更具体地说,它为所有微服务提供HTTP路由和负载平衡,服务质量,安全性和API文档。
Summary
- HTTP路由 HTTP routing
- 安全 Security
- 自动文档 Automatic documentation
- 速率限制 Rate limiting
- 访问控制策略 Access control policy
HTTP使用网关请求路由 HTTP requests routing using the gateway
当启动网关和微服务器时,他们将在注册表中注册 (using the eureka.client.serviceUrl.defaultZone
key in the src/main/resources/config/application.yml
file).
网关将使用其应用程序名称自动代理对微服务的所有请求: for example, when microservices app1
is registered, it is available on the gateway on the /app1
URL.
例如,如果您的网关正在运行 localhost:8080
, 你可以通过http://localhost:8080/app1/rest/foos 获得app1
微服务提供的foos
的资源。 如果您尝试使用Web浏览器执行此操作,请勿忘记在JHipster中默认情况下保护REST资源,因此您需要发送正确的JWT标题(请参阅下面的安全性), 或删除这些安全性微服务器MicroserviceSecurityConfiguration
类中的URL 。
如果有几个相同服务的实例运行,则网关将从JHipster注册表中获得这些实例,并将:
- 使用 Netflix Ribbon负载平衡HTTP请求。
- 使用 Netflix Hystrix, 提供断路器,以便快速安全地删除故障实例。
每个网关都有一个特定的“管理>网关”菜单,可以监视打开的HTTP路由和微服务实例。
安全 Security
JWT(JSON Web令牌) JWT (JSON Web Token)
JWT(JSON Web Token)是用于在微服务架构中保护应用程序的行业标准,易于使用的方法。
JHipster使用Okta提供的 JJWT library来实现JWT。
Tokens 由网关生成,并发送到基础的微服务器,因为它们共享一个公用密钥,微服务器能够验证令牌,并使用该令牌对用户进行身份验证。
这些令牌是自给自足的:它们具有认证和授权信息,因此微服务器不需要查询数据库或外部系统。这对于确保可扩展架构非常重要。
为了安全起见,JWT秘密令牌必须在所有应用程序之间共享。
- 对于每个应用程序,默认令牌是唯一的,并由JHipster生成。它存储在
.yo-rc.json
文件中. - Tokens are configured with the
jhipster.security.authentication.jwt.secret
key in thesrc/main/resources/config/application.yml
file. - 要在所有应用程序之间共享此密钥,请将密钥从您的网关复制到所有微服务器, 或使用JHipster Registry的Spring Config Server进行共享。
- 一个好的做法是在开发和生产中有不同的关键。
OAuth2
此功能目前在BETA中,因此其文档尚未完成。
JHipster提供了基于Spring Security生成“UAA”(用户帐户和身份验证)服务器的选项。该服务器提供用于保护网关的OAuth2令牌。
You will find all UAA-related information on our specific Using UAA for Microservice Security documentation page.
然后,网关使用Spring Security的JWT实现将JWT令牌发送到微服务器。
自动文档 Automatic documentation
网关公开了它所代理的服务的Swagger API定义,以便您可以从Swagger UI和swagger-codegen等所有有用工具中受益。
网关的“admin> API”菜单有一个特定的下拉列表,显示了网关的API和注册的微服务器中的所有API。
使用此下拉列表,所有微服务API都将自动记录,并从网关进行测试。
使用安全API时,安全令牌将自动添加到Swagger UI界面中,因此所有请求都可以开箱即用。
速率限制 Rate limiting
这是一个使用 Bucket4j 和 Hazelcast 提供微服务服务质量的高级功能。
网关提供速率限制功能,因此可以限制REST请求的数量:
- 通过IP地址(匿名用户)
- 通过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
类中编写它们。修改的例子可以是:
- Lowering the limit of HTTP calls
- Adding limits per minute or per day
- Removing all limits for "admin" users
访问控制策略 Access control policy
By default all registered microservices are available through the gateway. If you want to exclude a specific API from being exposed through the gateway, you can use the gateway's specific access control policy filter. It is configurable using the jhipster.gateway.authorized-microservices-endpoints
key in the application-*.yml
files:
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
For example, if you only want the /api/foo
endpoint of microservice bar
to be available:
jhipster:
gateway:
authorized-microservices-endpoints:
bar: /api/foo