牛倩
摘要:基于Scala语言设计并实现了一个框架。该框架适用于面向服务体系结构的分布式系统快速搭建基于Scala和Java的服务。通过该框架搭建的服务程序,可以通过服务名访问服务、自动记录日志信息、通过浏览器查看服务的状态和统计信息、自动负载均衡、自动加载配置文件。
关键词:面向服务体系结构;分布式;服务程序框架;Scala;Thrift;Zookeeper
中图分类号:TP39 文献标识码:A 文章编号:1009-3044(2016)08-0079-02
1 概述
面向服务的体系结构(即SOA,Service-Oriented Architecture)是一类分布式系统的体系结构,是构造分布式系统中应用程序的方法[1]。SOA作为一个技术架构,决定了不依赖某个特定的技术和平台环境来实现[2]。应用系统SOA架构建设的必要性体现在三个方面:1)解决应用系统信息孤岛问题;2)解决应用系统紧耦合问题;3)解决应用系统资源复用低问题[3]。本文将为面向服务体系结构的分布式系统设计实现一个可以快速搭建服务的框架,从而把更多的经历集中在服务本身的功能上。使基于该框架的服务可以支持通过服务名访问服务、跨程序语言的RPC、服务负载均衡、服务日志记录、服务配置信息自动加载等功能。
2 相关技术简介
2.1 Thrift
Thrift是Facebook实现的一种高效的、支持多种编程语言的远程服务调用的框架[4]。它结合了功能强大的软件堆栈和代码生成引擎,通过定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器就可以生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
2.2 Zookeeper
ZooKeeper是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等[5]。
2.3 Scala
Scala是一种可伸缩式编程语言。它有以下几个优点[6]:1)与Java无缝兼容;2)支持类型推理;3)良好的并发性和分布式操作机制和性能;4)更灵活的更多样的模式匹配机制;5)完全的面向对象程序设计语言,函数也是对象,可以在程序的任何地方使用函数,甚至把函数传递到任何地方。已经有很多公司在使用Scala语言来开发分布式系统,包括Twitter、LinkedIn、Intel等等[7]
2.4 Ostrich
Ostrich是Twitter用于监控服务器性能的一个Scala库,主要功能是收集、展示统计信息,同时也提供了关闭服务器、重新加载配置、监测服务器有效性等简易控制功能,以及获取线程、GC以及Profile等调试和性能信息[8]。通过这个框架可以很方便地观测到系统内各个服务的状态及统计信息。
3 需求分析
本框架的主要目的是实现系统内服务启动关闭时的一系列任务管理。这样,使用本框架,开发者就可以很便捷的搭建一个服务器,然后把主要经历放在服务本身的功能上。为了达到这一目的,我们的框架包括以下功能:
1)自动加载Config文件;规定统一文件格式(Scala Class)
2)利用Zookeeper的域名服务功能自动管理系统中的服务。通过服务的名字来访问服务集群,而不是Host+IP的形式访问单个服务.
3)通过指定Thrift文件来自动创建Thrift服务端;并创建基于B\S架构管理服务用来记录统计信息和服务的状态。
4)通过指定Thrift文件来自动创建Thrift客户端。
5)支持可选择的服务端负载均衡策略;包括通过服务名字随机访问和通过服务名字访问指定序号的服务。
6)通过代理技术,实现对接口的自动记录日接口访问信息的功能。并且可以配置记录日志的详细程度。
7)通过代理技术,实现对异常的统一处理,并且支持可配置的异常处理策略。
8)支持自动调用以上功能的接口,使用户可以只通过Thrift文件、Config文件即可简单的通过一个方法就可以启动服务。
4 设计与实现
本框架一共设计并实现了11个类。各类的名字功能及关系,见表1。
由于篇幅有限,本文只列出EasyThriftServiceBuilder和EasyThriftClientBuilder中的类的参数表(见代码1)和EasyThriftServiceBuilder.build函数的实现方法(代码2)。
代码2是EasyThriftServiceBuilder中build函数的实现。Build函数主要做了下面的工作:1)设置Service的代理(addProxySupport);2)根据配置文件创建Thrift Service(TThreadPoolServer);3)创建EasyThriftService。EasyThriftService会自动注册服务名、创建服务监控程序、根据config文件设置负载均衡、根据config文件记录log信息等功能。
5 测试与验证
首先我们定义了简单的Thrift文件test.thrift和Config文件testConfig.scala。调用EasyThriftServiceBuilder.build函数创建服务端和调用EasyThriftClientBuilder.build函数创建客户端。并测试了客户端和服务端的基于服务名的访问。一切正常,满足需求规格说明。随后将该框架应用于基于Scala语言的面向服务的分布式的系统内的服务上,运行良好,达到预期目标。
6 结论
本文描述了为面向服务的分布系统设计了一种服务框架,并基于Scala语言实现了支持跨语言的该服务框架。利用该框架,用户可以便捷的创建基于服务名访问的Thrift服务器和客户端。并且通过浏览器观测服务的状态和统计信息。
参考文献:
[1] Papazoglou M P. Service-Oriented Computing: Concepts, Characteristics and Directions[J]. Web Information Systems Engineering. wise .proceedings of the Fourth International Confer, 2003.
[2] 中国知网. 面向服务的架构[EB/OL]. http://epub.cnki.net/kns/brief/default_result.aspx.
[3] 黄嘉东, 徐兵元, 叶向阳. 企业级应用系统SOA架构建设研究与实践[J]. 中国高新技术企业, 2016(2).
[4] Apache. Apache Thrift-Home[EB/OL]. http://thrift.apache.org/.
[5] Apache. Apache Zookeeper-Home[EB/OL]. http://zookeeper.apache.org/.
[6] ?cole Polytechnique Fédérale de Lausanne(EPFL). The Scala Programming Language[EB/OL]. http://www.scala-lang.org/.
[7] ?cole Polytechnique Fédérale de Lausanne(EPFL). WHAT IS SCALA?[ EB/OL]. http://www.scala-lang.org/what-is-scala.html.
[8] Twitter. Ostrich [EB/OL]. https://github.com/twitter/ostrich.