微服务框架比较

常用微服务框架比较

从功能层面来说,对开发者有感知的功能有:服务实现,服务暴露(注解或配置,服务调用(注解或配置,服务治理等。从选型角度会关注以下几点:易用性(开发易用性和开箱即用、性能、功能、扩展性等。

  • 关键流程:服务暴露,服务注册,服务发现,服务调用,服务治理。
  • 关键知识点:序列化,网络通信,服务路由,负载均衡,服务限流,熔断,降级等服务治理。

对比总结

Dubbo/HSF

Dubbo Architecture

Dubbo提供了面向接口的远程方法调用。应用开发者定义接口,编写服务并暴露。Client端通过接口进行调用。Dubbo注册服务的维度是接口维度,每个接口会在注册中心写入一条数据。Dubbo支持条件路由,脚本路由,Tag路由等。这些路由规则都是强依赖于IP地址。

Spring Cloud

Spring Cloud通过Rest形式进行网络调用。应用开发者可以自己编写暴露Rest服务,如Spring MVCSpring Cloud里的服务注册是应用维度(EurekaClient端和Server端通过约定的方式进行通信。

Spring Cloud提供了一套标准API,而其中Netflix是其中的佼佼者,对这套API进行了实现,对大部分开发者来说,可以回直接依赖和使用Netflix,所以可以说是Netflix提供成了Spring Cloud的核心。但是作为商业公司对开源投入往往会多变,如Eureka已经体制维护。

gRPC

gRPC是一个基于HTTP/2协议设计的RPC框架,它采用了Protobuf作为IDLgRPC作为端到端的通信方案,可以解决现在的多语言问题。gRPC本身不提供服务注册,服务治理的功能。但现在可以看到gRpc有趋势往这方面扩展的野心。

Kubernetes

Kubernetes体系里暂时没有公允的通信框架,一般推荐gRPC作为RPC框架。Kubernetes体系下,默认情况下,PodIP是变化的,所以PodPod之间需要通信的话,有几种方式:

  • Service + DNS:新建一个Service,可以通过标签选择到一组pod列表,这个service对应一个不变的集群IPClient端通过DNS方式或者直接访问集群IP。这个集群IP,约等于实现了负载均衡(iptable方式

  • Headless Service:Headless Service和上面的Service的区别是,它不提供集群IP,通过主机名的形式获取一组IP列表,Client端自己决定访问哪个Pod

Istio + Envoy

Istio

Istio的控制层会向KubernetesApi Server请求并监听Pod信息,Service信息等信息。这样Istio中就有了完整的Kubernetes集群中的PodService等的完整信息。如果Kubernetes集群中有信息变更,Istio中也可以得到通知并更新对应的信息。

Envoy作为Proxy一个最常见的实现,以Envoy作为例子简单介绍。Envoy通过查询文件或管理服务器来动态发现资源。对应的发现服务及其相应的Api被称作xDS。协议内容包括LDS、RDS、CDS等等。

DubboSpring Cloud

  • 服务发现统一:Dubbo改造成应用维度的服务注册。

  • 打通调用:Dubbo实现中,支持将以Rest协议进行暴露,并且让Spring Cloud识别。