Istio与SpringCloud对比
Istio 数据平面的高性能智能网络代理,它是基于 Envoy 改进的 Istio-Proxy,控制和协调了被代理服务的所有网络通信,同时也负责收集和上报相关的监控数据。也就是说,代理服务跟外界的所有网络请求都会经过该网络代理,所以网络代理可以代替代理服务实现熔断和限流等功能。
如上图所示,当httpbin 服务调用 Java API 提供的网络 RESTful 接口时,其发送的网络请求会经过它们各自的网络代理 proxy,那么 httpbin的代理就可以为其提供服务熔断相关的机制,当调用 Java API 持续出错时,就不再将网络请求发送出去,而是直接本地返回默认数值。
而 Java API 的网络代理可以为其提供限流功能,当 httpbin 的请求流量过大时,Java API 的网络代理会对其中一部分请求进行限流,直接返回默认的响应,只将部分请求转发给 Java API 进行处理。
对比一下使用Service Mesh 方式和使用 Hystrix 类通用组件的优缺点。
Service Mesh 是“黑盒”的熔断工具,而 Hystrix 等通用组件则可以被看成是“白盒”的熔断工具。 具体判断标准是看二者到底是通过外部监控系统监控服务网络请求情况,还是在服务内部监控服务的请求响应情况。如下图所示,Service Mesh 是独立于服务实例之外的存在,通过代理所有服务实例的网络请求来监控响应信息实现熔断机制;而 Hystrix 等通用组件,则是在服务实例中发挥作用,作为服务实例进行网络请求的基础层之一,来监控网络请求信息。
Service Mesh 是无侵入地实现熔断,而 Hystrix 等通用组件则需要侵入具体服务业务代码中。 Service Mesh 通过在网络层面配置熔断策略,可以在不更改服务代码的情况下为服务实例提供熔断保护,其对服务来说几乎是无感和透明的。通过这个方法,Service Mesh 适用于任何语言或者框架开发的服务,并且开发人员也不必为每个服务单独配置或重新编程,减少了开发人员的工作量。Hystrix等通用组件需要更改服务的具体代码来引入其第三方依赖库,这些通用组件目前也只支持几类较为主流的编程语言,适用性不如 Service Mesh高。除此之外,开启或关闭熔断机制需要重新部署或者重启服务实例,这对高可用的服务系统来说代价很高。
Service Mesh 熔断机制能提供的回退行为较为有限,而 Hystrix 等通用组件提供了较为丰富的回退实现。 正是因为 Service Mesh 是无侵入的,所以它只能在系统触发熔断机制时,通过 Proxy 返回 HTTP 503 错误,期望应用服务在应对503错误时进行各类回退操作。 而 Hystrix等通用组件在其 API 层面提供了多种的回退操作实现,这样可以实现各种不同类型的回退操作,比如单一的默认值、使用缓存结果或者去调用其他服务等。
总体来说,Istio是使用了 Proxy 作为服务的网络层面的代理来实现熔断机制的,不依赖底层具体的代码和技术栈,而且在部署后也可以进行重新配置和部署。Hystrix等通用组件则需要在代码级别实现熔断机制,因此它需要在开发阶段时就做出具体熔断配置等决策,后期变更配置成本比较高。