什么是微服务?
微服务是一种开发软件的架构和组织方法,其中软件由通过明确定义的 API 进行通信的小型独立服务组成。这些服务由各个小型独立团队负责。
微服务架构使应用程序更易于扩展和更快地开发,从而加速创新并缩短新功能的发版时间。
单体式应用程序与微服务架构
通过单体式应用程序,所有进程紧密耦合,并可作为单项服务运行。这意味着,如果应用程序的一个进程遇到需求峰值,则必须扩展整个架构。随着代码库的增长,添加或改进整体式应用程序的功能变得更加复杂。这种复杂性限制了试验的可行性,并使实施新概念变得困难。单体式应用程序增加了应用程序可用性的风险,因为许多依赖且紧密耦合的进程会扩大单个进程故障的影响。
使用微服务架构,将应用程序构建为独立的组件,并将每个应用程序进程作为一项服务运行。这些服务使用轻量级 API 通过明确定义的接口进行通信。这些服务是围绕业务功能构建的,每项服务执行一项功能。由于它们是独立运行的,因此可以针对各项服务进行更新、部署和扩展,以满足对应用程序特定功能的需求。
微服务特点
敏捷性:
微服务促进若干小型独立团队形成一个组织,这些团队负责自己的服务。各团队在小型且易于理解的环境中行事,并且可以更独立、更快速地工作。这缩短了开发周期时间。您可以从组织的总吞吐量中显著获益。
灵活扩展:
通过微服务,您可以独立扩展各项服务以满足其支持的应用程序功能的需求。这使团队能够适当调整基础设施需求,准确衡量功能成本,并在服务需求激增时保持可用性。
轻松部署:
微服务支持持续集成和持续交付,可以轻松尝试新想法,并可以在无法正常运行时回滚。由于故障成本较低,因此可以大胆试验,更轻松地更新代码,并缩短新功能的发版时间。
弹性:
服务独立性增加了应用程序应对故障的弹性。在整体式架构中,如果一个组件出现故障,可能导致整个应用程序无法运行。通过微服务,应用程序可以通过降低功能而不导致整个应用程序崩溃来处理总体服务故障。
技术异构性:
不同服务内部的开发技术可以不一致,你可以用java来开发helloworld服务A,用golang来开发helloworld服务B,大家再也不用为哪种语言是世界上最好的语言而争论不休。
隔离性:
一个服务不可用不会导致另一个服务也瘫痪,因为各个服务是相互独立和自治的系统。这在单体应用程序中是做不到的,单体应用程序中某个模块瘫痪,必将导致整个系统不可用,当然,单体程序也可以在不同机器上部署同样的程序来实现备份,不过,同样存在上面说的资源浪费问题。
什么是RPC?
RPC 的概念就是远程过程调用。我们本地的函数调用,就是A方法调B方法,然后得到调用的结果,RPC就是让你像本地函数调用一样进行跨服务之间的函数调用。
互联网发展到现在,我们都在讲微服务,服务都拆分为微服务了,那么相关依赖的调用,就会变成跨服务之间的调用,而微服务之间的通信方式之一就是RPC。
RPC框架的重点功能
数据序列化
序列化就是将数据结构或对象转换成二进制的过程,也就是编码的过程,序列化后数据才方便进行网络传输;反序列化就是在序列化过程中所生成的二进制转换成数据结构或者对象的过程,将二进制转换为对象后业务才好进行后续的逻辑处理。
常见的序列化协议如下:
- ProtoBuf(IDL)
- JSON
- XML
常见的 RPC 框架如 gRPC、Thrift、Dubbo、RPCX 、Motan 等会支持上述协议中的大部分,尤其是 ProtoBuf 和 JSON 。
目前从性能上和使用广泛度上来看,现在一般推荐使用 ProtoBuf,当然很多自研的框架里面他们也会自己实现他们自己的序列化协议。
网络传输(网络通信)
目前来说,常见的通信传输方式包括 :TCP、UDP、HTTP(HTTP2.0)、QUIC 协议,TCP 是大部分框架都会默认支持的,额外这里要说明一下,RPCX 支持 QUIC 而 gRPC 支持 HTTP2.0。
RPC 调用方式
- 同步 RPC:最常用的服务调用方式,发起调用请求后同步等待结果,符合我们开发的一贯认知和习惯。开发简单、容易维护、容易理解。
- 异步 RPC:客户端发起服务调用之后,不同步等待响应,而是注册监听器或者回调函数,待接收到响应之后发起异步回调,驱动业务流程继续执行,实现起来相对复杂,但是高并发场景下性能会更好。
- 并行 RPC:并行服务调用,一次 I/O 操作,可以发起批量调用,这个并行的批量请求一般是通过协程来实现,然后同步等待响应;
服务治理
但是在实际应用中,为保证服务的稳定性,安全性,远程过程调用的时候还需要考虑服务的路由、负载均衡、高可用等问题,而保障服务之间的调用就需要进行服务治理;
服务治理基本就涵盖:服务注册和发现、限流、降级、熔断、重试、失败处理、负载均衡等各种服务治理策略。
常见的RPC微服务框架
Dubbo:是阿里开发对外开源,仅支持 Java 语言。
Motan:新浪内部使用的 RPC 框架,仅支持 Java 语言。
Tars:腾讯内部使用的 RPC 框架,仅支持 C++ 语言。
Spring Cloud:国外 Pivotal 公司 仅支持 Java 语言
gRPC:Google对外开源的跨语言RPC框架,支持多种语言。
Thrift:由Facebook开发的内部系统跨语言的RPC框架,支持多种语言。