JHipster目前提供了一个选项,用于生成服务网格Istio架构的应用。
快速介绍Istio
Istio是与Kubernetes完全整合的服务网格,它的作用是管理微服务架构中服务之间的所有通信。
这篇文章的重点是要了解它如何能够取代大部分Netflix堆栈工具,例如:Ribbon,Hystrix,Zuul的一部分,并免除了Eureka的服务。直接受益于Kubernetes平台的发现服务。
JHipster如何生成经典微服务架构
JHipster严重依赖Spring Cloud,尤其是Spring Cloud Netflix:
Spring Cloud与Istio共存架构
Istio的操作原理基于在每个Pod内注入代理(在这种情况下,此代理是Envoy)。(然后每个Pod将托管指定微服务及其相同位置的Envoy代理实例)。每个Pod上的传入和传出网络连接集将路由到该代理(通过iptable规则),然后该存根可以独立于托管应用程序应用呼叫和路由策略。
这部分是与JHipster的经典架构竞争,因为负载平衡 服务发现等是由Spring Cloud生态系统管理。但是,当要求在Istio上部署时,JHipster生成器必须足够智能实现两种机制共存:
主要变动是修改Eureka中微服务的注册模式:
最后,我们获得了一个等价的架构:
Envoy代理在调用时显示为绿色,微服务的每个实例向Eureka注册具有相同主机名,Envoy代理将决定将http://productservice/路由到微服务的哪个副本。
对于服务间调用(架构中的Cart到Product),它是相同的:
如果开发人员使用JHipster提供的标准机制:Eureka和Ribbon将付诸实施,但是代理Istio将在负载平衡上有最终决定权,因此,使用单个Http客户端将具有相同的整体效果。
然而,应该注意,Ribbon和Hystrix的存在可能会产生边缘效应:
另一种架构“Istio-native”
谷歌的Ray Tsang( @saturnism )是JHipster的Istio工作的发起者,同时试图确保为Istio生成更合适的架构。架构看起来像这样:
外部调用直接路由到正确的微服务(同时受益于断路和重试),并且服务间调用需要执行简单的http客户端Istio代理的服务。如图中绿色部分。感兴趣的读者阅读Envoy和Hystrix的 比较
但是,这种架构有两个主要影响:
作为应用程序网关的JHipster网关在微服务架构中可以发挥多种作用:调用微服务的路由只是这些角色中的一种。根据需要,应用程序网关必须能够:
可以采用不同的策略以不同的方式处理所有这些方面,但应用程序网关仍然是集中处理它们的最简单方法。
理想的架构
免责声明:目前,JHipster还不能直接生成这个架构。从下面可以看出,这可能涉及对网关生成的代码的特定更改,这只会对此特定情况有意义。
这里的目标是将JHipster网关放在微服务之前,并可能将Spring Cloud Config保留在注册器中,网关保留JHipster Zuul,能提供自定义过滤器功能如 RateLimitingFilter 。但是在Zuul服务器的配置中不会集成Hystrix(或Ribbon),因为这两者与Istio竞争。如果不需要过滤器,可以简单地删除Zuul。
结论
JHipster的微服务架构基于Spring Cloud,特别是Netflix堆栈(虽然也可以使用Consul和Traefik等替代品),这是有道理的。因此,在Istio上应用的这种架构显示出一些局限性是完全正常的。
很难取悦所有人,JHipster已经提供了非常丰富的一种组合,因此维护起来很复杂。
最后但并非最不重要的是,Istio的1.0版本于2018年7月底发布。这是一项非常有前景的技术,但仍然很年轻,鲜为人知。Spring Cloud,尤其是在受到良好控制的环境中,对大多数问题的响应仍然很好。