电脑与信息技术2016年12月收稿日期:2016-08-17作者简介:黄小锋(1981-),男,湖北荆州人,高级工程师,博士,主要研究方向:电力系统自动化、电力系统优化调度;张晶(1984-),女,河北保定人,工程师,硕士,主要研究方向:企业信息化、企业级应用开发平台。微服务框架介绍与实现黄小锋1,张晶2(1.中国电建集团国际工程有限公司,北京100048;2.京中电普华信息技术有限公司,北京100192)摘要:相对于传统单块架构,微服务框架具有技术选型灵活、独立按需扩展、可用性高等优点,更适合当前互联网时代需求。但微服务架构的应用也会引入新的问题,如跨进程通讯、服务注册发现等。文章在对传统框架和微服务框架进行分析比较的基础上,给出了微服务框架的一种实现方案。该方案设计了微服务框架的整体架构,对微服务框架引入的关键问题给出了解决方案。采用该实现方案进行业务系统开发,开发人员只需要关注微服务内部业务功能的开发,微服务之间的注册、发现、监控由微服务框架完成,简化了系统开发的难度,提高开发效率。关键词:微服务框架;服务注册;服务发现中图分类号:TP311.5文献标识码:AIntroductionAndImplementationofMicroserviceArchitectureHUANGXiao-feng1,ZHANGJing2(1.PowerChinaInternationalgrouplimited,Beijing100048,China;2.BeijingChinaPowerInformationTechnologyCo.Ltd,Beijing100192,China)Abstract:Comparedwithtraditionalmonolithicarchitecture,micro-servicearchitecturehasmanyadvantages,suchasflexibletechnologyselection,independentscalability,highavailabilityandsoon,moresuitableforthecurrentneedsoftheInternetage.Butmicro-servicearchitecturewillalsointroducenewproblems,suchasinter-processcommunication,serviceregistration,servicediscovery.Onthebasisofanalysisandcomparisonbetweenthetraditionalframeworkandmicro-serviceframework,thispapershowsoneimplementationofmicro-serviceframework.First,wedesignedthecomponentofamicro-servicesarchitectureframework,thengavethesolutionsofsomekeyissuesthatmicro-servicearchitectureintroduces.Withthisimplementation,developersonlyneedtofocusonthedevelopmentofbusinessfunctions,serviceregistration,discovery,monitoringprovidedbytheframeworktosimplifythedifficultyofsystemdevelopmentandimprovedevelopmenteffectiveness.Keywords:microservicearchitecture;serviceregistration;servicediscover文章编号:1005-1228(2016)06-0014-03传统信息化系统的典型架构是单块架构,即将应用程序的所有功能都打包成一个应用,每个应用是最小的交付和部署单元,应用部署后运行在同一进程中。典型的单块架构应用,如基于传统J2EE平台所构建的产品或者项目,它们存在的形态一般是WAR包或者EAR包。单块架构应用具有IDE友好、易于测试和部署等优势,但是,随着互联网的迅速发展和企业应用范围的扩展,单块架构表现出一些不足[1]:·代码庞杂,难于理解,新人上手困难;·维护困难,一般需要专门的维护团队,而且应用越大,则维护人员越多,团队管理成本也越高;·功能升级困难:系统中任何程序的改变,都需要对整个系统重新测试并部署;·技术堆栈固化:只能采用统一的技术平台或产品来解决所有问题,尝试新技术的代价太高;·扩展困难:单块架构系统由于单进程的局限性,水平扩展时只能基于整个系统进行扩展,无法针对某一个功能模块按需扩展。如何找到一种更有效的、更灵活、更适应当前互联网时代需求的系统架构方式,成为大家关注的焦点。随着微服务架构的出现以及在国内外的成功应用,基于微服务框架构建系统应用成为一种新的选择。Vol.24No.6Dec.2016第24卷第6期2016年12月电脑与信息技术ComputerandInformationTechnology第24卷第6期1微服务架构微服务架构是一种架构模式,采用一组服务的方式来构建一个应用,服务独立部署在不同的进程中,不同服务通过一些轻量级交互机制来通信,例如RPC、HTTP等,服务可独立扩展伸缩,每个服务定义了明确的边界,不同的服务甚至可以采用不同的编程语言来实现,由独立的团队来维护[2]。相对于传统的单体应用架构,微服务架构通过将功能分解到各个离散的服务实现对应用系统的解耦,具有明显的优势[3][4]:·复杂度可控:每一个微服务专注于单一功能,代码量小、复杂度低,服务之间通过接口通信,服务边界清晰。·技术选型灵活:可以针对不同的业务服务特征选择不同的技术平台或产品,有针对性的解决具体的业务问题。·独立部署:微服务运行在独立的进程中,当某个微服务发生变更时,可独立进行部署,无需编译、部署整个应用,使得服务发布更高效,同时降低对生产环境所造成的风险,缩短应用交付周期。·扩展:每个服务可以根据实际需求独立进行扩展。·容错:在微服务架构下,故障被隔离在微服务内部。可通过超时重试、多副本策略等机制实现应用层面的容错,避免全局不可用。采用微服务架构也会引入新的问题:基于微服务架构的应用是分布式系统,服务独立运行在不同的进程中,需要有进程间通讯机制来支撑服务之间的交互;应用由多个服务构成,每个服务可以有多个实例,当一项服务存在于多个主机节点时,需要一套服务发现机制,使服务调用端可以获取正确的服务地址。这些都是在微服务框架实现时需要解决的问题。2微服务框架设计2.1整体架构微服务框架的整体架构,如图1所示。图1整体架构图微服务框架包括集成开发工具、基础开发框架、服务运行管理、部署监控工具等四部分。集成开发工具:提供微服务的快速开发能力,内置丰富的平台开发工具包,主要包括项目创建向导、可视化界面设计器、编码与调试辅助工具、快速打包工具等功能组件。基础开发框架:提供微服务开发的基础组件,包括展现组件、序列化组件、日志管理组件、IOC组件、持久化组件、服务通信组件、缓存组件、嵌入式组件、和权限管理组件等,整合开源成熟框架,屏蔽底层技术细节。服务运行管理:提供微服务运行时服务注册、服务发现、服务路由及限流容错功能。部署监控:提供微服务快速部署和监控功能,降低部署成本、提高批量部署效率,建立一套独立的监控、告警、快速分析和定位问题的机制,提高运维服务水平。2.1服务注册发现微服务架构是由一系列职责单一的细粒度服务构成的分布式网状结构,一个服务可以多实例并存,这就引入了服务注册发现问题,服务提供者要注册发布服务地址,服务消费者要能发现目标服务,同时服务提供者一般以集群方式提供服务,也就引入了负载均衡问题。目前主要的服务注册发现方案有两种:(1)提供者服务发现在服务提供者和服务消费者之间有一个独立的负载均衡器,负载均衡器上有所有服务的地址映射表。当服务消费者调用某个目标服务时,向负载均衡器发送请求,负载均衡器根据策略做负载均衡后将请求转发到目标服务。这种方式实现简单,服务消费者无需实现服务发现逻辑,但系统中需要维护一个高可用的负载均衡组件。另外,负载均衡组件在服务消费者和服务提供者之间增加了一跳,有一定性能开销。(2)消费者服务发现服务消费者要访问某个服务时,通过内置的负载均衡组件向服务注册表查询目标服务地址列表,然后以某种负载均衡策略选择一个目标服务地址,最后向目标服务发起请求。这一方案需要一个服务注册表配合服务注册和发现,一般采用高可用、分布式一致的组件如Zookeeper、Consul、Etcd等来实现。原理如图2所示。图2消费者服务发现和方案一相比,该方案将服务发现能力分散到每一个服务消费者的进程内部,同时服务消费方和服务黄小锋等:微服务框架介绍与实现·15·电脑与信息技术2016年12月提供方之间是直接调用,没有额外开销,性能比较好。微服务框架在实现时采用消费者服务发现的方式。3框架实现3.1基础框架目前流行的开源微服务框架主要有Dropwizard和SpringBoot。两个框架在实现技术上存在一定差异[5],见表1。表1Dropwizard和SpringBoot对比Dropwizard简单轻量,但第三方集成力度不足,社区支持薄弱,很多关键特性如依赖注入需要开发者自己实现;Springboot聚焦于Spring应用,可以借力Spring家族体系的其它成员,完成通信、数据访问等功能,体系强大,社区活跃。SpringBoot带来了一系列的生态圈的集成,为微服务开发提供了基础。因此选择SpringBoot作为基础框架。3.2服务注册发现消费者服务发现需要一个服务注册表,采用开源组件Consul来实现。相对于Zookeeper、Etcd等其它服务注册组件,Consul具有以下优点[6]:支持多数据中心下分布式高可用的服务发现和配置共享;成员管理和消息广播采用Gossip协议,去中心化;支持健康检查,允许键值对存储;支持ACL访问控制。服务注册发现的架构如图3所示。图3服务注册发现架构图微服务启动时,将服务信息注册到consulClient,consulClient将注册信息提交给consulServer,con-sulServer将信息提交给consulLeader,consulLeader将自身的数据复制给其他的consulServer,实现所有服务信息同步。当微服务B访问微服务A时,首先从con-sulServer上获取微服务A所有可用的服务地址,根据负载均衡策略选择一个进行访问,访问的过程中通过熔断器来进行超时容错处理。Consul采用Go语言进行编写,引入开源的con-sul-client库实现Java对Consul的访问。在微服务启动的时候进行服务注册,注册代码如图4所示。图4服务注册代码4结束语本文对目前流行的微服务框架进行分析,提出了一种微服务框架的实现方案。该方案设计了微服务框架的功能架构,重点分析了微服务架构所带来的服务注册、服务发现问题,并给出了实现方案。基于该微服务框架进行业务系统开发,开发人员只需要关注微服务内部业务功能的开发,微服务之间的注册、发现及监控部署由微服务框架完成,简化了系统开发难度,提高开发效率。参考文献:[1]ChrisRichardson.IntroductiontoMicroservices[EB/OL].,2015-05-19.[2]MartinFowler,JamesLewis.Microservices[EB/OL].[3]KetanP