当前主流微服务框架
在认识了微服务之后,下面让我们看看当前的主流微服务框架的实现原理。下文主要介绍 Dubbo 与 Spring Cloud,在此基础上,还会说明底层的通信协议。最后,将针对 Spring Boot 与 Spring Cloud 的关系做一个介绍。
Dubbo简介
Dubbo 是比较出名的框架,但这本书不会重点介绍,只做简单说明。
Dubbo框架
相信很多人都听说过 Dubbo 框架,它是开源分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。图 1.9 是 Dubbo 官网上的一幅框架图,我们还是根据图进行说明。
从图 1.9 中可以看出,Dubbo 主要分为四个部分(也有人说三个部分)。在框架中,提供者(Provider)提供服务,并将服务注册进注册中心(Registry),然后消费者(Consumer)可以去注册中心订阅服务。同时,监控器(Monitor)可以进行监控,监控对服务的调用次数与耗时。
Spring Cloud简介
先用一句话描述什么是 Spring Cloud。Spring Cloud 提供全套的分布式系统解决方案,是一个 “全家桶”。它在 Spring Boot 的基础上简化了分布式系统基础设施的开发。如服务发现和服务注册、配置中心、负载均衡、断路器、消息总线、数据监控等,都可以利用 Spring Boot 做到一键启动和部署。
Spring Cloud 并没有做重复性劳动,它只是将开发得比较成熟的服务框架 “拿” 过来,通过 Spring Boot 进行再封装,屏蔽复杂的配置和实现原理,最终做成易部署和易维护的分布式系统开发工具包。Spring Cloud 具有以下特点。
-
做到了良好的开箱即用,可扩展性机制覆盖。
-
包括服务发现和服务注册。
-
服务地址路由。
-
软负载均衡。
-
断路器。
-
分布式消息传递。
HTTP与RPC简介
介绍了 Dubbo 与 Spring Cloud 之后,我们也已经知道 Dubbo 使用 RPC 进行服务之间的调用,以及 Spring Cloud 使用 HTTP 进行服务间通信。那么它们的特点和具体的使用场景是什么?
对比
HTTP 是超文本传输协议;RPC 是远程过程调用,RPC 包含传输协议和编码协议。RPC 也可以用 HTTP 作为传输协议,但一般是用 TCP 作为传输协议,用 JSON 作为编码协议。
RPC 主要用于系统间的服务通信。
使用场景
HTTP 接口的使用场景:接口不多、系统与系统交互较少,是解决信息孤岛问题初期常使用的一种通信手段,这种接口简单、直接、开发方便,而且可以利用现有的 HTTP 进行传输。
然而,如果是一个大型网站,内部子系统较多、服务也非常多,RPC 的好处就显示出来了。RPC 采用的是长连接机制,不必每次通信都进行 3 次握手,大大减少网络开销;其次,RPC 一般都有注册中心,以及丰富的监控管理,如发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
RPC 主要针对大型企业,而 HTTP 主要针对小型企业,因为 RPC 效率更高,而 HTTP 开发迭代会更快。了解它们的使用场景,可以让我们在项目选型中根据需要更好地进行选择。
Spring Boot与Spring Cloud的关系
本书主要介绍微服务,而且是基于 Spring 的,这时就需要介绍 Spring Cloud,并讲解 Spring Cloud 的每一个模块。
Spring Cloud 是一个微服务开发工具包,提供分布式系统的配置管理、服务发现、断路器、智能路由、微代理、控制总线等功能,可降低分布式开发的成本。
首先看 Spring Boot 是什么。Spring Boot 旨在简化创建产品级的 Spring 应用和服务,可简化配置文件,使用嵌入式 Web 服务器,含有诸多开箱即用微服务功能。Spring Boot 是 Spring 提供的一套快速配置,可以基于 Spring Boot 快速开发单个微服务。同时,Spring Boot 也是 Spring 的引导,用于启动 Spring,使我们能够快速学习和使用 Spring。
Spring Boot 与 Spring Cloud 看起来似乎没有联系,其实不然。Spring Cloud 基于 Spring Boot,为微服务体系开发中的框架问题,提供了一整套的解决方案。
所以,Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具。Spring Boot 专注于快速、方便集成的个体,Spring Cloud 关注全局的服务治理框架;Spring Boot 使用默认大于配置的理念,集成方案已经默认选择,不配置也没问题,Spring Cloud 大部分是基于 Spring Boot 来实现的。
因此,微服务离不开 Spring Boot,也离不开 Spring Cloud。