APP下载

基于Spring Cloud服务调用的设计与应用

2019-03-08郭致远魏银珍

网络安全与数据管理 2019年2期
关键词:降级调用客户端

郭致远,魏银珍,

(1.武汉邮电科学研究院,湖北 武汉 430074;2.武汉大学 信息管理学院,湖北 武汉 430074)

0 引言

随着互联网的不断发展,面对用户量急速增长和日益频繁的需求改动,传统的单体应用架构已经难以支撑现有的业务体系,于是分布式应用架构[1]的出现为开发者提供了一种新思路。微服务[2]作为一种颗粒度更小的分布式架构,其思想是通过将一个系统按某种规则划分为多个功能单一的小型服务,这些服务运行在彼此的进程中,服务之间采用轻量级通信协议通信,从而实现系统功能[3]。微服务架构所面临的首要问题是如何实现服务间的远程调用(Remote Process Call,RPC)[4]。目前实现RPC主要有两种方案:基于HTTP和基于TCP协议实现。后者的实现细节相对复杂,而基于HTTP协议的应用相对更加广泛。本文设计的服务调用框架Spring Cloud Feign基于Netflix组件开发,是一款声明式、模板化的HTTP客户端,并且针对于众多Spring用户,Spring Cloud Feign支持Spring MVC[5]注解,使得Feign的使用更加方便。

1 RPC架构

RPC是一种进程间的通信方式,根据协议的不同有多种实现方式,其目的主要是通过屏蔽底层传输和序列化的实现细节来简化远程服务过程调用。

1.1 RPC框架原理

RPC框架的调用原理图如图1所示。

图1 RPC框架原理图

总结实现RPC框架的几个核心点如下:

(1)服务提供方需要以某种形式向调用方提供调用相关信息,如服务接口、数据结构、接口说明文档等相关服务调用信息。

(2)服务代理对象。服务调用者调用远程服务实际上是通过远程服务的本地代理实现,如Java的JDK动态代理将本地调用封装为远程调用。

(3)通信。无论是采用私有二进制协议还是HTTP,只要能实现进程间通信即可。

(4)序列化。远程通信需要将对象转换成二进制码流才能进行网络传输,同时不同的序列化技术支持的数据类型、数据包大小、异常处理等都有很大差别。

1.2 业界主流RPC框架

目前开源的RPC框架有很多,业界主流的几种框架如下:

(1)Apache Thrift。Apache Thrift是由Facebook实现的一种支持多语言的高效服务调用框架,其特点是支持二进制和JSON编码的数据传输协议,对于高并发、大数据量的开发环境更合适。

(2)gRPC。这是Google基于HTTP/2协议开发的一个高性能的开源框架,相对于HTTP/1具有提供头部压缩、双向流等多种特性,从而在移动设备上有更出色的表现。

(3)Hessian。其是由Caucho Technology开发的一款轻量级RPC框架,它的远程过程调用基于动态代理实现,因此具备简单易用、支持多语言、面向接口编程等特点。

1.3 Feign具备的优势

面对市面上众多主流RPC架构,基于Spring Cloud开发的Feign在许多方面有着不俗的表现,总结如下:

(1)支持多语言。Feign基于Spring Cloud实现,因此不同的模块可以使用不同的语言开发,可更好地实现跨平台。

(2)与Spring框架兼容性更好。Feign本身属于Spring框架的一部分,同时Spring Cloud对Feign的加强使得Feign支持Spring MVC注解,因此对于多数Spring开发者是更好的选择。

(3)声明式服务调用。由于Feign基于HTTP协议实现,因此可以更好地形成RESTful接口风格,从而以更简洁明了兼具可读性的方式实现服务间的调用。

在实际开发中,使用Feign作为远程服务调用框架所带来的好处还有很多,相比大型企业根据其自身业务定制的开源服务调用框架,Feign对于多数中小企业也许是更好的选择。

2 相关理论

Feign基于Netflix Feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能之外还提供了一种声明式的Web服务客户端定义方式[6]。在实际的开发过程中存在一个接口被多个服务调用的情况,通常的做法是针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用。由于Feign底层对Ribbon和Eureka进行了封装,使得Feign可以实现以下多种功能[7]:

(1)继承:将接口中的定义从Controller剥离,配合Maven[8]私有仓库实现接口共享,在代码构建期实现接口绑定从而减少客户端接口绑定。

(2)负载均衡:由于Feign是基于Spring Cloud Ribbon实现的,因此可以通过自定义Ribbon参数来实现客户端的负载均衡。

(3)重试机制:Feign默认实现了请求的重试机制,使得客户端在进行服务调用时如果出现失败,可以重复请求。Feign对于重试机制的支持对于实现高可用服务集群有重要意义。

(4)服务保护与容错:Feign通过引入Spring Cloud Hystrix工具提供服务的保护与容错功能,默认情况下,Feign会对客户端所有方法进行封装达到保护的目的。

(5)服务降级:服务降级是Spring Cloud Hystrix提供的一种服务容错功能,可以通过配置@FeignClient中的fallback属性提供一种简单的服务降级处理方式。

(6)请求压缩:由于Spring Cloud采用HTTP协议通信,因此相比TCP性能会有所限制。为了改进服务间通信的效率,Feign提供GZIP对请求和响应进行压缩从而降低了通信过程中的性能损耗达到效率的提升。

Feign通过整合Ribbon、Eureka等多个工具,使用声明式、模板化的HTTP客户端以及对SpringMVC注解的支持使得对Feign的使用更加便捷。

3 服务调用定制化实现

为了在知识管理系统[9]中更好地发挥Feign的功能,需要对Feign进行定制化开发以及配置服务路由、负载均衡、请求压缩等相关信息,服务调用模块在微服务架构中如图2所示。

图2 微服务总体架构图

服务调用可以分为外部调用和内部调用,外部调用需要经过网关的验证、转发等,内部调用则根据路由和负载均衡寻址、GZIP请求压缩来实现。具体实现细节如下。

3.1 整合Feign

首先创建一个SpringBoot[10]工程作为服务调用方Consumer,然后在pom.xml文件中引入相关依赖,如下所示:

spring-cloud-starter-eureka

spring-cloud-starter- feign

引入的核心依赖的作用如下:

(1)spring-cloud-starter-eureka:构建服务治理的基础设施,包含搭建服务注册中心,提供服务注册与发现功能。Eureka采用Java[11]实现,适用于Java编写的分布式系统。

(2) spring-cloud-starter-feign:基于HTTP实现的RPC框架,提供服务调用功能的支持,通过封装Ribbon和Hystrix提供负载均衡与熔断保护功能。

引入依赖后,在应用主类中添加@EnableFeignClients注解开启Spring Cloud Feign的功能支持;在对应的接口上添加@FeignClient注解,绑定对应的提供服务的服务名,然后再用SpringMVC对应的注解绑定该服务提供的REST接口;创建调用类,通过@Autowired将定义的接口注入并创建方法调用;最后在application.properties中指定注册中心地址,定义自身服务的服务名。

通过Feign只需要定义服务绑定接口,以声明式的方法,简单而高效地实现服务调用。

3.2 Ribbon配置

搭建完基本的服务调用体系后,需要考虑为客户端配置负载均衡。可以通过Spring Cloud Ribbon来实现,直接配置Ribbon客户端的各服务调用参数。全局配置的方式较为简单,只需要在配置文件中使用ribbon.=来设置Ribbon的各项参数。

但在多数实际问题中,对于服务调用的方式会做一些调整,以致全局配置不适用。在使用Spring Cloud Feign时,针对各个服务客户端进行个性化配置的方式与使用Spring Cloud Ribbon时的配置方式是一样的,都采用.ribbon.key=value的格式进行设置。其中代表创建Feign客户端时用@FeignClient绑定的对应的服务名。

为了保证服务集群[12]的高可用,Spring Cloud Feign默认实现了请求的重试机制,可以通过设置MaxAutoRetriesNextServer参数来决定重试的次数。需要注意的是Ribbon的超时与Hystrix的超时是不同的,所以Hystrix的超时时间必须大于Ribbon的超时时间,以保证重试机制存在的意义。

3.3 Hystrix配置

除配置用于客户端负载均衡的Ribbon外,要需要对提供服务保护和容错的Hystrix进行配置。和Ribbon相似,Hystrix的全局配置默认采用hystrix.command.default.进行设置,同时需要注意Feign客户端对于Hystrix的支持是否开启,即feign.hystrix.enabled为true时表示开启,否则表示禁用Hystrix。如果只需要针对某个服务客户端禁用Hystrix时,可以使用@Scope(“prototype”)注解构建配置类以及在@FeignClient中通过configuration参数引入该配置类。

在实际应用中根据业务场景的不同往往需要对Hystrix进行定制化,采用hystrix.command.作为前缀,代表方法名。

另外服务降级也是Hystrix提供的重要功能之一,在Spring Cloud Feign中提供了一种简单的方式来实现服务降级:首先构建服务降级类,逻辑为服务降级逻辑;在服务绑定接口中,指定@FeignClient注解fallback属性对应的服务降级类。

3.4 其他配置

Spring Cloud Feign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗[13]。详细参数配置如下:

feign.compression.request.enabled=true

feign.compression.response.enabled=true

同时,还可以进行更多细节的配置,如指定压缩数据类型、数据压缩的上下限等。

4 Feign在知识管理系统中的应用

为了更好地将Spring Cloud Feign应用于实际,本文在一个企业级的知识管理系统中应用微服务架构,系统中各服务的相互调用采用Spring Cloud Feign实现。该系统主要实现了企业内部重要文档的存储和查阅、内部消息的快速传递以及员工之间更好的交流等功能。

通过合理分配资源,构建适用于企业内部体系的应用平台。Feign提供微服务架构中服务之间相互调用,是实现整个微服务架构的基础,以及通过数据压缩减少消耗,提高传输效率。知识管理系统总体架构图如图3所示。

图3 知识库系统架构图

4.1 声明式服务调用

在完成Feign的相关配置后就可以从代码层面实现服务的跨进程调用了,由于Feign是基于应用层协议HTTP实现的,对于开发者来说无需处理丢包补发、数据分段与重组等,从而可以专注于上层应用的设计。由于后台代码量较大且调用其他接口的方式基本相同,因此此处只展示业务的部分代码,具体细节如下:

(1)通过注解指定服务名eureka-client以及对应接口名getName。

@FeignClient("eureka-client")

public interfacegetClient {

@GetMapping("/getName")

Stringconsumer();

}

(2)提供服务的eureka-client以及相应的dc接口。

@GetMapping("/getName")

public String getName() throws Exception{

//业务细节

}

得益于Feign对Eureka、Ribbon组件的整合以及对Spring MVC注解的支持,只需要使用Feign绑定对应服务及接口,便能够以简洁的方式实现服务的跨进程调用。

4.2 服务边界划分

如何确定微服务边界以及划分一直是构建微服务系统的重要环节[14]。在本系统中,通过业务划分将系统分为4个模块:后台管理模块、资源共享模块、员工交流模块和基础服务模块[15]。在微服务架构中,这些服务各自承担自己的功能以及作为服务提供者向外提供服务从而实现系统的整体功能。

后台管理服务。此服务的使用者主要面向后台管理员,管理员具备对用户权限、角色、所属部门等的修改权限。通过对用户赋予不同的角色与权限,从而决定该知识库对用户的开放级别,这样的做法能够保证公司内部知识的安全性。另外后台管理服务中还加入了审批流程,当涉及公司内部重要信息时,管理员的一系列操作需要向上汇报审批,上层通过决策该操作才能生效,否则请求被驳回。

资源共享服务。此服务主要用于公司员工上传下载文档资源,用户在通过权限验证后可以采用不同的文件形式上传或下载对应的资源文件,经过后台审核成功后完成。为了方便用户更好地查找对应资源,该模块提供了全站搜索,用户可通过输入关键字在数据库中匹配到相关资源,最后的结果经过权限过滤后呈现给用户。

员工交流服务。此服务分为论坛和贴吧两部分[16],论坛部分主要提供员工交流功能,员工在此处发表帖子,其他人可以评论点赞等;贴吧部分是给员工提供企业答疑,对于企业存在疑问的部分可以提出问题,其他用户看到给予答复。通过这种方式可以有效完善公司的知识管理系统以及方便公司管理人员发表公告、活动等。

基础服务。此服务是系统的基础部分,负责为系统提供工作流服务、邮件短信服务、报表输出等。工作流用于流程审批,报表用于统计结果的收集与导出,短信邮件用于系统通知或安全验证。

最后所有的服务模块经由API网关按照内部和外部对应规则对接口进行统一封装,然后对外提供服务。

5 结束语

本文首先介绍了RPC及其原理,其次通过对比市面上的主流RPC框架以及其实现难易程度最终确定本次服务调用方案设计采用的技术,即基于Spring Cloud实现一种声明式服务调用方案,随后将其应用在一个企业级知识管理系统中,实现了Feign定制化开发。

结果表明,只需创建接口以及加入注解便可以完成对提供服务接口的绑定,很好地解决了一个接口被多个服务调用的多重依赖情况,有效简化了服务调用客户端的开发流程,提升了系统的开发效率和后期可维护性,基本达到了服务调用框架的预期设计与应用。当然,Spring Cloud Feign作为一款基于HTTP协议实现的RESTful风格的服务调用组件,虽然保证了其简洁明了的调用风格和较高的可读性,但在性能方面与私有的二进制协议实现的RPC框架相比仍然存在较大差距,因此在后续的研究中会考虑在通信协议进行更多的优化或者选择可以兼顾性能与可读性的通信协议。

猜你喜欢

降级调用客户端
你的手机安装了多少个客户端
“人民网+客户端”推出数据新闻
——稳就业、惠民生,“数”读十年成绩单
核电项目物项调用管理的应用研究
吹牛皮
系统虚拟化环境下客户机系统调用信息捕获与分析①
消费降级了吗?
十八大后遭“断崖式降级”的官员
Panda Priorities
新华社推出新版客户端 打造移动互联新闻旗舰
利用RFC技术实现SAP系统接口通信