SOA 服务化和微服务架构已经发展多年,市场上已经有很多成熟的商业和开源产品,我们没有必要从头搭建一套服务化管理和治理平台,完全可以基于开源服务化框架进行定制化,以适应我们的业务需要。
本节介绍各种流行的 RPC 框架、服务化管理和治理、微服务框架,并通过讲解其特点来帮助我们做技术选型。
本节介绍简单的远程服务调用的技术栈。
自 JDK1.4 开始, JDK 内置了远程服务调用的技术栈,可以帮助开发者创建基于 Java 到 Java 的分布式调用架构,一个 Java 进程内的服务可以调用其他 Java 进程内的服务,使用 JDK 内置的序列化和反序列化协议。
RMI 是 JEE 规范中 EJB 远程调用的基础,然而, JDK 内置的 RMI 服务并没有得到广泛应用,几乎没有哪家公司采用这种方式来构建服务化平台。
原因如下。
l RMI 采用 JDK 自带的专用序列化协议,不能跨语言。
l 使用了底层的网络协议,不如基于文本的 HTTP 可读,也不如 HTTP 被广泛认可和应用。
l 开源框架的飞速发展,严重削弱了 JDK 资深技术的流行程度。
Hessian 及 Burlap 都是 Caucho 公司提供的开源的远程调用协议,基于 HTTP 传输,防火墙通常会设置在某个端口上以允许特定的 HTTP 通信。其中, Hessian 将对象序列化成与语言无关的二进制协议;而 Burlap 将对象序列化成与语言无关的 XML 数据,数据是可读的。两者都是与语言无关的,可以在多种语言的服务中互相调用。
Hessian 及 Burlap 都适合传输较小的对象,对较大、复杂的对象,无论是在序列化方式上还是在传输通道上都没有 RMI 有优势。
由于服务化架构中大量的服务调用都是大规模、高并发的短小请求,因此, Hessian 和 Burlap 协议在服务化架构中得到了广泛应用。
Spring HTTP Invoker 重用了 JDK 内置的对象序列化技术传输对象,这与 RMI 的原理一致,但是,它通过 HTTP 通道传输数据,在效率上应该略低于 RMI ,并且由于使用了 JDK 内置的序列化机制,因此也是不能跨语言的。
本节介绍 SOA 服务化时代的服务化框架和平台。
Dubbo 是阿里巴巴开源的一个分布式服务框架,不但提供了高性能和透明化的 RPC 远程服务调用,还提供了基本的服务监控、服务治理和服务调度等能力。它默认支持多种序列化协议和通信编码协议,默认使用 Dubbo 协议传输 Hessian 序列化的数据。 Dubbo 使用 ZooKeeper 作为注册中心来注册和发现服务,并通过客户端负载均衡来路由请求,负载均衡算法包括:随机、轮询、最少活跃调用数、一致性哈希等。它基于 Java 语言,不能与其他语言的服务化平台互相调用。 Dubbo 服务框架在互联网企业得到了广泛应用,几乎每个中小型公司都开始使用 Dubbo 完成服务化的使命。
然而, Dubbo 也有如下缺点。
l Dubbo 开发得较早,近些年已经没有开发者维护和升级。
l 早期留下的 Bug 一直没有得到修复,需要使用者自己发现和修复。
l Dubbo 没有经过全面优化,在服务量级到达一定程度时,会出现通知系统携带过多的冗余信息,在极端情况下会导致网络广播风暴。
l Dubbo 服务框架是 SOA 服务化时代的产物,对微服务化提出的各种概念如熔断、限流、服务隔离等没有做精细的设计和实现。
l Dubbo 的监控和服务治理模块比较简单,难以满足复杂业务的需求。
HSF ( High Speed Framework ,好舒服)是淘宝内部大规模使用的一款高性能服务框架,也是一款为企业级互联网架构量身定制的分布式服务框架。 HSF 以高性能网络通信框架为基础,提供了诸如服务发布与注册、服务调用、服务路由、服务鉴权、服务限流、服务降级和服务调用链路跟踪等一系列久经考验的功能特性。
HSF 与 Dubbo 均来自阿里巴巴,但是并不开源,只在阿里巴巴内部使用,在外部很少有相关的资料, HSF 据说性能要比 Dubbo 高,但是与业务系统耦合重,无法抽取并开源。
Thrift 是 Facebook 实现的一种高性能并且支持多语言的远程服务调用框架,由 Apache 开源。它采用中间的接口描述语言定义并创建服务,支持跨语言服务开发和调用,并且包含中间的接口描述语言与代码生成和转换工具,支持包括 C++ 、 Java 、 Python 、 PHP 、 Ruby 、 Erlang 、 Perl 、 Haskell 、 C# 、 Cocoa 、 Smalltalk 等在内的流行语言,传输数据时采用二进制序列化格式,相对于 JDK 本身的序列化、 XML 和 JSON 等,尺寸更小,在互联网高并发、海量请求和跨语言的环境下更有优势。
由于 Thrift 具有跨语言和高性能等优点,在互联网企业里颇受欢迎,如果正在建设跨语言的服务化平台,则 Thrift 是首选。
Axis 是 Apache WebService 项目中的子项目,最初起源于 IBM 的“ SOAP4J ”,应该属于最早的一批用于构造基于 Web Service 应用的框架。
前面章节提到 Web Service 使用 SOAP 协议,而 SOAP 协议通常使用 HTTP 传输 XML 格式的数据,因为性能低下,而且 SOAP 协议有复杂和臃肿等缺点,所以现在几乎没有企业采用这种框架做服务化了。
Mule ESB 是 MuleSoft 公司出品的基于 Java 语言的企业服务总线产品,它可以把多个复杂的异构系统通过总线模式集成在一起,并让它们之间可以互相通信,包括 JMS 、 WebService 、连接数据库的 JDBC 、 HTTP 和历史遗留系统等。
它的优点是可以把现有的不同技术栈的历史遗留系统与新增的服务化系统通过总线进行串联和编排,来满足日新月异的业务功能需求。
本节主要介绍近年流行的 Spring Cloud 系列的微服务框架。
通 过使用 Spring Boot 可以很容易地创建独立的、具有高品质的基于 Spring 的应用程序,基于 Sping Boot 创建的应用可以随时随地启动和运行,一般只需要较少的配置和搭建环境的工作量。
在 JEE 时代,企业级开发涉及的通用功能被提取到了容器层实现,例如: Tomcat Web 容器负责管理服务的启动、停止、监控、配置和日志等,应用开发人员只要按照规范将应用打包成 War ,并发布到 Tomcat Web 容器中,就可以对外提供服务了,这一时代的应用是包含在容器内的。
应用包含在容器内的架构如图 1-37 所示。
图 1-37
Spring Boot 的思路正好相反,它将容器嵌入自启动的 Jar 包中,在 Spring Boot 应用启动时,内部启动嵌入的容器,例如: Tomcat 、 Jetty 和 Netty 等,然后通过内嵌的服务器将应用中提供的服务暴露。
Spring Boot 的容器包含在应用内的架构如图 1-38 所示。
图 1-38
Spring Boot 这种设计在微服务架构下有如下明显的优点。
l 可以创建独立、自启动的应用程序。
l 不需要构建 War 包并发布到容器中,构建和维护 War 包、容器的配置和管理也是需要成本的。
l 通过 Maven 的定制化标签,可以快速创建 Spring Boot 的应用程序。
l 可以最大化地自动化配置 Spring ,而不需要人工配置各项参数。
l 提供了产品化特点,例如:性能分析、健康检查和外部化配置。
l 全程没有 XML 配置,也不需要代码生成。
Spring Boot 是 Spring Cloud 构建微服务架构的重要基础。
Netflix 由 Netflix 公司开发且合并到 SpringCloud 项目中,主要提供了服务发现、断路器和监控、智能路由、客户端负载均衡、易用的 REST 客户端等服务化必需的功能。
其中 Hystrix 框架提供了微服务架构所需的容错机制的解决方案和设计模式,这些设计模式的原理在 1.3.5 节已经详细介绍了。 Hystrix 大大简化了微服务下容错机制的实现,包括服务分组和隔离、熔断和防止级联失败、限流机制、失效转移机制和监控机制等。
Spring CloudNetflix 集成了 Spring Boot 对微服务敏捷启动和发布的功能,以及 Netflix 提供的微服务化管理和治理的能力,成为一个完美的微服务解决方案。在 Spring Cloud Netflix 平台下,开发人员通过几个简单的注解配置即可完成一个大规模分布式系统的发布工作。
Spring Cloud Netflix 包括服务发现组件 Eureka 、容错性组件 Hystrix 、智能路由组件 Zuul 和客户端负载均衡组件 Ribbon 。
Spring Cloud Netflix 的整体架构如图 1-39 所示。
图 1-39
结合图 1-39 ,我们看到 Netflix 中的交互流程如下。
l 服务在 Eureka 服务器实例上注册。
l Zuul 作为一个特殊的服务在 Eureka 上注册并发现服务。
l Zuul 作为网关,将发现的服务导出给 PC 网站、 App 和开放平台使用。
l RestTemplace 和 FeignClient 使用简单的服务调用的方法调用服务 1 、服务 2 等。
在这个微服务的使用流程中, Netflix 具有如下特点。
l 服务在 Eureka 实例中注册,由 Spring 管理的 Bean 来发现和调用。
l 通过配置的方式可以启动嵌入式的 Eureka 服务器。
l Feign 客户端通过声明的方式即可导入服务代理。
l Zuul 使用 Ribbon 服务实现客户端的负载均衡。
l 通过声明的方式即可插入 Hystrix 的客户端。
l 通过配置的方式即可启动 Hystrix 面板服务器。
l 在 Spring 环境中可以直接配置 Netflix 的组件。
l Zuul 可以自动注册过滤器和路由器,形成一个反向代理服务器。
l Hystrix 面板可以对服务的状态进行监控,并提供了容错机制。
Spring Cloud Netflix 是当前最流行的微服务架构的落地和实现,由于发布的时间较晚,理念较新,如果读者所在的公司允许一定的试错成本,则也是一个不错的选择。
推荐一起学习《分布式服务架构:原理、设计与实战》一书,它是一本不可多得的理论与实践相结合的架构秘籍,是作者多年工作经验积累的结晶。京东购买请扫描下方二维码。
如果你想成为优秀的架构师
在【云时代架构】精品群 免费 进!
我在【云时代架构】技术社区,你在哪里?
还等什么,赶快加入 【云时代架构】 技术社区!
请猛扫下面二维码。
云时代架构
做互联网时代最适合的架构
开放、分享、协作
快速关注,请猛扫下面二维码!
简书博客 云时代架构