69

微服务系列(七):服务化管理和治理框架的技术选型

 6 years ago
source link: http://mp.weixin.qq.com/s/3YwCeAN-hYMGs1qEyENKBw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

SOA服务化和微服务架构已经发展多年,市场上已经有很多成熟的商业和开源产品,我们没有必要从头搭建一套服务化管理和治理平台,完全可以基于开源服务化框架进行定制化,以适应我们的业务需要。

本节介绍各种流行的RPC框架、服务化管理和治理、微服务框架,并通过讲解其特点来帮助我们做技术选型。

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容器中,就可以对外提供服务了,这一时代的应用是包含在容器内的。

应用包含在容器内的架构如图1-37所示。

Image

图1-37

Spring Boot的思路正好相反,它将容器嵌入自启动的Jar包中,在Spring Boot应用启动时,内部启动嵌入的容器,例如:Tomcat、Jetty和Netty等,然后通过内嵌的服务器将应用中提供的服务暴露。

Spring Boot的容器包含在应用内的架构如图1-38所示。

Image

图1-38

Spring Boot这种设计在微服务架构下有如下明显的优点。

l  可以创建独立、自启动的应用程序。

l  不需要构建War包并发布到容器中,构建和维护War包、容器的配置和管理也是需要成本的。

l  通过Maven的定制化标签,可以快速创建Spring Boot的应用程序。

l  可以最大化地自动化配置Spring,而不需要人工配置各项参数。

l  提供了产品化特点,例如:性能分析、健康检查和外部化配置。

l  全程没有XML配置,也不需要代码生成。

Spring Boot是Spring Cloud构建微服务架构的重要基础。

2. Netflix

Netflix由Netflix公司开发且合并到SpringCloud项目中,主要提供了服务发现、断路器和监控、智能路由、客户端负载均衡、易用的REST客户端等服务化必需的功能。

其中Hystrix框架提供了微服务架构所需的容错机制的解决方案和设计模式,这些设计模式的原理在1.3.5节已经详细介绍了。Hystrix大大简化了微服务下容错机制的实现,包括服务分组和隔离、熔断和防止级联失败、限流机制、失效转移机制和监控机制等。

3. Spring Cloud Netflix

Spring CloudNetflix集成了Spring Boot对微服务敏捷启动和发布的功能,以及Netflix提供的微服务化管理和治理的能力,成为一个完美的微服务解决方案。在Spring Cloud Netflix平台下,开发人员通过几个简单的注解配置即可完成一个大规模分布式系统的发布工作。

Spring Cloud Netflix包括服务发现组件Eureka、容错性组件Hystrix、智能路由组件Zuul和客户端负载均衡组件Ribbon。

Spring Cloud Netflix的整体架构如图1-39所示。

Image

图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是当前最流行的微服务架构的落地和实现,由于发布的时间较晚,理念较新,如果读者所在的公司允许一定的试错成本,则也是一个不错的选择。

推荐一起学习《分布式服务架构:原理、设计与实战》一书,它是一本不可多得的理论与实践相结合的架构秘籍,是作者多年工作经验积累的结晶。京东购买请扫描下方二维码。

Image

如果你想成为优秀的架构师

在【云时代架构】精品群免费进!

我在【云时代架构】技术社区,你在哪里?

还等什么,赶快加入【云时代架构】技术社区!

请猛扫下面二维码。

云时代架构



做互联网时代最适合的架构

开放、分享、协作

快速关注,请猛扫下面二维码!


Image Image 

简书博客                      云时代架构


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK