.NET Core微服务之路:(纯干货)基于gRPC服务发现与服务治理的方案

  • 时间:
  • 浏览:0

  http相对更规范,更标准,更通用,无论哪种语言都支持http协议。肯能你是对外开放API,这些开放平台,内部管理的编程语言多种多样,你无法拒绝对每项语言的支持,相应的,肯能采用http,无疑在你实现SDK然后,支持了所有语言,统统,现在开源后面 件,基本最先支持的好多个协议都蕴含 RESTful。

  在服务消费者和服务提供者之间四个 多独立的LB,通常是专门的硬件设备如 F5,肯能基于软件如 LVS,HAproxy等实现。LB上有所有服务的地址映射表,通常由运维配置注册,当服务消费方调用某个目标服务时,它向LB发起请求,由LB以三种策略,比如轮询(Round-Robin)做负载均衡后将请求转发到目标服务。LB一般具备健康检查能力,能自动摘除不健康的服务实例。 该方案主要难题:

序列化反序列化直接对应守护程序运行运行中的数据类,不才能 解析后在进行映射(XML,JSON后会这些最好的措施 );

  gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的三种数据序列化协议(这些于XML、JSON、hessian)。ProtoBuf才能将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和速率高,语法简单,表达力强。

PB具四个 版本:

基于HTTP/2

优点:

缺点:

  网站系统随着不断的发展,没有繁复,架构的变迁也会从MVC—>SOA—>微服务,从简单到繁复,从集中到分布,服务化框架的引入是SOA—>微服务过程才能 要处理的难题。面对服务的增多,服务分布的部署,服务与服务之间相互的调用,不得不使用服务化框架去处理,著名的dubbo和spring cloud可是我我原本产生的。

  目前gRPC主流分布式方案有没有几种: etcd, zookeeper, consul.

GRPC尚未提供连接池,才能 自行实现;

  gRPC是三种能没有在任何地方运行的现代、开源、高性能远程过程调用(RPC)框架,它使客户端和服务端应用守护程序运行运行透明地通信,并使构建连接的系统更容易。

  HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。能没有节省速率、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,有些的控制信息则用Header 表示。

  3、负载均衡策略为每个服务器地址创建四个 子通道(channel)。

支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),繁复升级;

  针对第四个 方案的缺乏,此方案将LB的功能集成到服务消费方守护程序运行运行里,也被称为软负载肯能客户端负载方案。服务提供方启动时,首先将服务地址注册到服务注册表,同时定期报心跳到服务注册表以表明服务的存活情况表,至少健康检查,服务消费方要访问某个服务时,它通过内置的LB组件向服务注册表查询,同时缓存并定期刷新目标服务地址列表,而且以三种负载均衡策略选着 四个 目标服务地址,最后向目标服务发起请求。LB和服务发现能力被分散到每四个 服务消费者的守护程序运行运行内部管理,同时服务消费方和服务提供方之间是直接调用,没有额外开销,性能比较好。该方案主要难题:

  1、单点难题,所有服务调用流量都经过LB,当服务数量和调用量大的然后,LB容易成为瓶颈,且一旦LB存在故障影响整个系统;

尚未提供“服务发现”、“负载均衡”机制;

IDL使用ProtoBuf

  1、开发成本,该方案将服务调用方集成到客户端的守护程序运行运行里头,肯能有多种不同的语言栈,就要配合开发多种不同的客户端,有一定的研发和维护成本;

多语言支持(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java)

  该方案主要难题:部署较繁复,环节多,出错调试排查难题不方便。

proto文件生成目标代码,简单易用;

支持多种语言(能没有把proto文件看做IDL文件);

  不同之处是将LB和服务发现功能从守护程序运行运行内移出来,变成主机上的四个 独立守护程序运行运行。主机上的四个 肯能多个服务要访问目标服务时,亲戚大伙 都通过同一主机上的独立LB守护程序运行运行做服务发现和负载均衡。该方案也是三种分布式方案没有单点难题,四个 LB守护程序运行运行挂了只影响该主机上的服务调用方,服务调用方和LB之间是守护程序运行运行内调用性能好,同时该方案还繁复了服务调用方,不才能 为不同语言开发客户库,LB的升级不才能 服务调用方改代码。

  该方案是针对第二种方案的缺乏而提出的三种折中方案,原理和第二种方案基本这些。

  1、服务启动后gRPC客户端向命名服务器发出名称解析请求,名称将解析为四个 或多个IP地址,每个IP地址标示它是服务器地址还是负载均衡器地址,以及标示要使用那个客户端负载均衡策略或服务配置。

  2、客户端实例化负载均衡策略,肯能解析返回的地址是负载均衡器地址,则客户端将使用grpclb策略,而且客户端使用服务配置请求的负载均衡策略。

肯能基于HTTP2,绝大部多数HTTP Server、Nginx都尚不支持,即Nginx没有将GRPC请求作为HTTP请求来负载均衡,可是我我作为普通的TCP请求。(nginx1.9版本已支持);

默认不具备动态社会形态(能没有通过动态定义生成消息类型肯能动态编译支持);

  gRPC 一现在开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

  RPC协议性能要高的多,这些Protobuf、Thrift、Kyro等,(肯能算上序列化)吞吐量至少能达到http的二倍(甚至更高)。响应时间也更为出色。千万何必 小看这点性能损耗,公认的,微服务做的比较好的,这些,netflix、阿里,原本都传出过为了提升性能而合并服务。肯能是交付型的项目,性能更为重要,肯能你卖给客户往往靠的可是我我性能上微弱的优势。

  gRPC is a modern, open source, high-performance remote procedure call (RPC) framework that can run anywhere. It enables client and server applications to communicate transparently, and makes it easier to build connected systems.

  在gRPC里客户端应用能没有像调用本地对象一样直接调用另一台不同的机器上服务端应用的最好的措施 ,使得您才能更容易地创建分布式应用和服务。与有些 RPC 系统这些,gRPC 也是基于以下理念:定义四个 服务,指定其才能被远程调用的最好的措施 (蕴含 参数和返回类型)。在服务端实现这些接口,并运行四个 gRPC 服务器来处理客户端调用。在客户端拥四个 多存根才能像服务端一样的最好的措施 。

Netty等有些框架集成;

  gRPC开源组件官方并未直接提供服务注册与发现的功能实现,但其设计文档已提供实现的思路,并在不同语言的gRPC代码API中已提供了命名解析和负载均衡接口供扩展。 

其基本实现原理:

  至于选着 那个版本,跨平台的需求不大搞笑的话,能没有用版本二、大搞笑的话能没有选着 一肯能三。(本文后续选着 二为例)

  2、另外生产环境中,后续肯能要对客户库进行升级,势必要求服务调用方修改代码并重新发布,升级较繁复。

Protobuf二进制可读性差(貌似提供了Text_Fromat功能,没用过);

RESTful : 严格意义上说接口很规范,操作对象即为资源,对资源的三种操作(post、get、put、delete),常见的http api都能没有称为Rest接口。

protobuf二进制消息,性能好/速率高(空间和时间速率都很不错);

  4、当有rpc请求时,负载均衡策略决定那个子通道即grpc服务器将接收请求,当可用服务器为空时客户端的请求将被阻塞。

  gRPC支持多种语言,并才能基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java肯能支持Android开发。

  2、服务消费方、提供方之间增加了一级,有一定性能开销。