API 网关
来源:JHipster |
时间:2018-11-04
|
|

架构图

这里写图片描述

使用网关进行HTTP请求路由

当网关和微服务启东时,他们会自己注册到注册中心(使用src/main/resources/config/application.yml文件的键eureka.client.serviceUrl.defaultZone

网关会使用每个微服务应用名称,自动的代理所有的请求。比如,当微服务app1注册了,通过网关可以通过/app1的URL来访问

比如,你的网关运行在localhost:8080,你可以通过http://localhost:8080/app1/rest/foos获取app1上的foos资源。如果你在web浏览器上尝试,不要忘记jhipster对于REST资源的安全的控制。因此,你需要发送正确的JWT请求头(下个小节详细解释),或者在微服务的MicroserviceSecurityConfiguration移除对这些URL的安全控制。

如果有多个相同服务实例运行时,网关可以从注册中心获取这些实例,然后:

  • 使用Netflix Ribbon进行HTTP请求负载

  • 使用Netflix Hystrix提供一个断路器,当实例失败时,快速安全的移除

每个网关都有一个特定的admin > gateway菜单,在这里可以打开http路由和监控每个微服务

安全

JHipster标准的安全选项在安全的章节有详细说明。然而,确保一个微服务体系有一些特定的调优和选项,这儿将详细解释:

JWT(JSON Web Token)

JWT是一个工业标准,为微服务架构的安全提供了易于使用的方法

JHipster使用JJWT libary,它由Okta提供,实现了JWT

通过网关生成token,然后发送给位于网关之下的微服务:这些微服务共享一个安全密钥,微服务能够使用其验证token,并且使用这个token能对用户进行认证

这些Token将会提供一些重要的信息(自给自足的信息):它们具有授权和认证信息,因此每个微服务不需要查询数据库或者扩展系统。这对于微服务的水平伸缩架构时比较重要的。

为了安全工作,一个JWT密钥令牌需要在所有的应用之间共享:

  • 每个应用通过jhiposter生成的默认令牌是唯一的。存储在.yo-rc.json文件中

  • 令牌在src/main/resources/config/application.yml文件的jhipster.security.authentication.jwt.secret键值配置

  • 共享这些key在你的所有应用之间,从你的网关复制key到所有的微服务中或者使用注册中心的spring config server共享(使用指定的配置在consul中)。这也是人们为什么使用中心配置服务的原因。

  • 一个最佳实践是在生产环境和正式环境使用不同的key

OpenId Connect

jhipster提供了OpenId连接的支持,详细的在OpenID章节详细解释。

当我们选择openid的选项的时候,你将默认使用Keycloak,并且很可能你的微服务应用完全使用docker compose:请确认读了我们的docker compose文档和正确的在你的/ets/hosts配置了Keycloak

当使用OpenId连接的时候,jhipster网关将发送OAuth2的令牌给微服务,他们将会接收这些令牌并连接到keycloak.

不同JWT,这些Token并不能自给自足,主要由两个原因:

  • 微服务中红的性能问题:由于查询当前用户信息是非常常见的需求,每个微服务调用OpenId连接服务器获取这些信息。在正常的设置中,每个微服务都会调用,每次请求很快会造成性能问题。

    • 如果你选择了缓存的选项,将会生成一个CachedUserInfoTokenServicesspring bean,她将会缓存这些调用。适当的调休会降低一些性能的问题。

    • 如果你想通过这次的userinfo请求获取更多的信息时,可以在src/main/resources/application.yml使用标准的spring boot配置键security.oauth2.resource.userInfoUri

  • 认证在Keycloak和应用之间不自动同步,请注意在标准的openid连接工作流中,我们希望在这个问题上进行一些具体的改进。结果如:

    • 当一个用户签出应用时,如果他刷新了浏览器会自动再次登录:因为他仍然登录了Keycloak,而Keycloak提供了自动认证

    • 当用户在session在Keycloak中失效是,用户依然在登录应用,他将仍可以使用应用。这是因为OpenId连接是一个状态机,应用并不能立即知道当前会话失效

Jhipster UAA

jhipster提供了一个生成基于spring security的UAA服务选项,这个服务为网关的安全提供了OAuth2的令牌

你将会在后续的章节发现UAA的文档。

网关使用Spring Security的JWT实现发送JWT令牌到微服务,这基本与上边描述的JWT配置相同

自动生成文档

网关公开了微服务定义的swagger api,这样你就可以从一些工具中获得收益如swagger UI和swagger-codegen

网关的admin > API下拉菜单,展示了网关api和api来自与哪个微服务。

使用这个下拉列表,所有的微服务API将会被自动的记录下来,并且可以从网关进行测试。

当使用一个安全控制的API,swaggerui会自动的添加安全令牌,因此一切请求开箱即用

限速

这是一个先进的功能,它使用Bucket4j个Hazelcast来保障微服务的质量

网关提供了一些限速功能,一些REST请求可以被限制:

  • 通过IP限制(针对匿名用户)

  • 通过用户的登录(显示登录用户)

jhipster使用bucket4j和hazelcast来估算请求总量,当超过限制时会发送HTTP响应码429(太多请求),默认每个用户每小时调用10万次API

这是一个重要的功能,保证了微服务体系不会被一些特定的用户的请求淹没.

网关可以保护REST的端点,他可以完全获取用户的安全信息。因此很容易的扩展,根据用户的安全角色提供特定的速率限制。

启用速率限制,打开application-dev.yml或者application-prod.yml文件并设置enabledtrue:

jhipster:
    gateway:
        rate-limiting:
            enabled: true1234

数据存储在Hazelcast中,因此只要配置了Hazelcast分布式缓存就可以对网关进行扩容,这些是开箱即用的:

  • 所有网关默认都有Hazelcast配置

  • 如果你使用jhipster注册中心,所有的网关实例应该自动的注册到分布式缓存

如果你想要添加更多的规则或者修改已存在的规则,你需要在RateLimitingFilter编码。例如可以修改:

  • 降低HTTP调用限制

  • 添加每分钟或者每天的限制

  • 移除对amdin用户的所有限制

访问控制策略

默认通过网关可以访问所有注册的微服务。如果你想通过网关排除指定的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 configuration12345

例如,你仅想使bar微服务的/api/foo端点可用:

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


提交
查看更多评论
没有更多评论