1 RPC
本节介绍简单的远程服务调用的技术栈。
1. JDKRMI
自JDK1.4开始,JDK内置了远程服务调用的技术栈,可以帮助开发者创建基于Java到Java的分布式调用架构,一个Java进程内的服务可以调用其他Java进程内的服务,使用JDK内置的序列化和反序列化协议。
RMI是JEE规范中EJB远程调用的基础,然而,JDK内置的RMI服务并没有得到广泛应用,几乎没有哪家公司采用这种方式来构建服务化平台。
原因如下。
l RMI采用JDK自带的专用序列化协议,不能跨语言。
l 使用了底层的网络协议,不如基于文本的HTTP可读,也不如HTTP被广泛认可和应用。
l 开源框架的飞速发展,严重削弱了JDK资深技术的流行程度。
2.Hessian及Burlap
Hessian及Burlap都是Caucho公司提供的开源的远程调用协议,基于HTTP传输,防火墙通常会设置在某个端口上以允许特定的HTTP通信。其中,Hessian将对象序列化成与语言无关的二进制协议;而Burlap将对象序列化成与语言无关的XML数据,数据是可读的。两者都是与语言无关的,可以在多种语言的服务中互相调用。
Hessian及Burlap都适合传输较小的对象,对较大、复杂的对象,无论是在序列化方式上还是在传输通道上都没有RMI有优势。
由于服务化架构中大量的服务调用都是大规模、高并发的短小请求,因此,Hessian和Burlap协议在服务化架构中得到了广泛应用。
3. Spring HTTP Invoker
Spring HTTP Invoker重用了JDK内置的对象序列化技术传输对象,这与RMI的原理一致,但是,它通过HTTP通道传输数据,在效率上应该略低于RMI,并且由于使用了JDK内置的序列化机制,因此也是不能跨语言的。
2 服务化
本节介绍SOA服务化时代的服务化框架和平台。
1.Dubbo
Dubbo是阿里巴巴开源的一个分布式服务框架,不但提供了高性能和透明化的RPC远程服务调用,还提供了基本的服务监控、服务治理和服务调度等能力。它默认支持多种序列化协议和通信编码协议,默认使用Dubbo协议传输Hessian序列化的数据。Dubbo使用ZooKeeper作为注册中心来注册和发现服务,并通过客户端负载均衡来路由请求,负载均衡算法包括:随机、轮询、最少活跃调用数、一致性哈希等。它基于Java语言,不能与其他语言的服务化平台互相调用。Dubbo服务框架在互联网企业得到了广泛应用,几乎每个中小型公司都开始使用Dubbo完成服务化的使命。
然而,Dubbo也有如下缺点。
l Dubbo开发得较早,近些年已经没有开发者维护和升级。
l 早期留下的Bug一直没有得到修复,需要使用者自己发现和修复。
l Dubbo没有经过全面优化,在服务量级到达一定程度时,会出现通知系统携带过多的冗余信息,在极端情况下会导致网络广播风暴。
l Dubbo服务框架是SOA服务化时代的产物,对微服务化提出的各种概念如熔断、限流、服务隔离等没有做精细的设计和实现。
l Dubbo的监控和服务治理模块比较简单,难以满足复杂业务的需求。
2. HSF
HSF(High Speed Framework,好舒服)是淘宝内部大规模使用的一款高性能服务框架,也是一款为企业级互联网架构量身定制的分布式服务框架。HSF以高性能网络通信框架为基础,提供了诸如服务发布与注册、服务调用、服务路由、服务鉴权、服务限流、服务降级和服务调用链路跟踪等一系列久经考验的功能特性。
HSF与Dubbo均来自阿里巴巴,但是并不开源,只在阿里巴巴内部使用,在外部很少有相关的资料,HSF据说性能要比Dubbo高,但是与业务系统耦合重,无法抽取并开源。
3.Thrift
Thrift是Facebook实现的一种高性能并且支持多语言的远程服务调用框架,由Apache开源。它采用中间的接口描述语言定义并创建服务,支持跨语言服务开发和调用,并且包含中间的接口描述语言与代码生成和转换工具,支持包括C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk 等在内的流行语言,传输数据时采用二进制序列化格式,相对于JDK本身的序列化、XML和JSON等,尺寸更小,在互联网高并发、海量请求和跨语言的环境下更有优势。
由于Thrift具有跨语言和高性能等优点,在互联网企业里颇受欢迎,如果正在建设跨语言的服务化平台,则Thrift是首选。
4. AXIS
Axis是Apache WebService项目中的子项目,最初起源于IBM的“SOAP4J”,应该属于最早的一批用于构造基于Web Service应用的框架。
前面章节提到Web Service使用SOAP协议,而SOAP协议通常使用HTTP传输XML格式的数据,因为性能低下,而且SOAP协议有复杂和臃肿等缺点,所以现在几乎没有企业采用这种框架做服务化了。
5. Mule ESB
Mule ESB是MuleSoft公司出品的基于Java语言的企业服务总线产品,它可以把多个复杂的异构系统通过总线模式集成在一起,并让它们之间可以互相通信,包括JMS、WebService、连接数据库的JDBC、HTTP和历史遗留系统等。
它的优点是可以把现有的不同技术栈的历史遗留系统与新增的服务化系统通过总线进行串联和编排,来满足日新月异的业务功能需求。
3 微服务
本节主要介绍近年流行的Spring Cloud系列的微服务框架。
1. Spring Boot
通过使用Spring Boot可以很容易地创建独立的、具有高品质的基于Spring的应用程序,基于Sping Boot创建的应用可以随时随地启动和运行,一般只需要较少的配置和搭建环境的工作量。
在JEE时代,企业级开发涉及的通用功能被提取到了容器层实现,例如:Tomcat Web容器负责管理服务的启动、停止、监控、配置和日志等,应用开发人员只要按照规范将应用打包成War,并发布到Tomcat Web容器中,就可以对外提供服务了,这一时代的应用是包含在容器内的。
应用包含在容器内的架构如图所示:
Spring Boot的思路正好相反,它将容器嵌入自启动的Jar包中,在Spring Boot应用启动时,内部启动嵌入的容器,例如:Tomcat、Jetty和Netty等,然后通过内嵌的服务器将应用中提供的服务暴露。
Spring Boot的容器包含在应用内的架构如图所示:
原文链接:https://mp.weixin.qq.com/s/i92uCsaDDe1dTogQmGlQ1Q