微服务技术构建大规模web系统的研究

2017-08-24 14:18张峰
科技创新与应用 2017年22期
关键词:微服务

张峰

摘 要:微服务是近两年流行起来的最优秀的web系统架构。文章由分析架构演变到引出微服务架构的内容、优点和架构设计的最佳实践等,得出微服务未来必然有很好的发展结论。

关键词:微服务;软件架构;敏捷;Spring Cloud

中图分类号:TP311 文献标志码:A 文章编号:2095-2945(2017)22-0048-02

1 概述

随着互联网越来越深入人们生活,web系统在人们生活中有着举足轻重的地位。web技术正以前所未有的速度发生着巨大变革,服务端技术微服务架构+虚拟化已经兴起。本文从web系统架构演变入手,讨论兴起的微服务技术和相关的架构及开源项目。讨论适合小团队的微服务开发架构体系,分析微服务技术应用系统的趋势。

2 web系统架构演变

web系统最早出现在1980万维网的发明者蒂姆·伯纳斯-李(Tim Berners-Lee)设计的ENQUIRE项目上。从此web技术经历了几次改变。从网络结构和软件架构上看,web系统架构粗略经历了以下阶段:

第一阶段单机构建模式。最早的软件开发基本上是C/S即客户端服务器模式。单机构建模式即一台服务器承担所有访问请求和数据计算任务。这通常受单台服务器计算能力和IO瓶颈的制约。但这个阶段已经形成了应用系统和数据库系统两部分的工作模式,这个模式通常在小规模企业及单店规模适用。

第二阶段应用与数据库服务器分离。以Oracle数据库为代表的DBMS系统规模越来越大,消耗系统资源越来越多。于是应用系统和数据库系统分离为各自部署到独立的服务器中。两台硬件服务器之间的网络连接要可靠、快速、容错。这个阶段还增加了页面缓存、页面片段缓存、数据内存缓存等在应用服务器和数据库之间。

第三阶段应用服务器集群。随着web系统访问量逐步增高,应用服务器计算资源逐步耗尽,只有增加应用系统的服务器才能解决。随着独立计算资源的扩展,他们之间的协调带来了好多问题。Oracle从10g通过CRS开始支持集群。解决了的用户访问压力,但需要做的就是硬件的投入。

第四阶段微服务架构与虚拟化。现在以亚马逊为代表的大量的微服务架构应用系统开始呈现高速的发展趋势。服务化架构的演进也经历了几个阶段:MVC、RPC、SOA,现在到了微服务。近年来微服务成为大规模、高服务质量web系统解决方案之一。

3 微服务基础理论和基础架构选型

微服务一词来源于一篇著名的博文Microservices,作者是Martin Fowler。是一种软件设计风格,每个服务都独立存储数据、独立按业务功能模块开发、测试及部署,系统间通过通信协议关联起来组成完整的应用系统。通常服务之间的通信协议采用RESTful API,也是高并发大型应用系统的必然发展结果。拆分单体所面临的问题增加很多,为解决这些问题在微服务理论框架下引申出非常多的概念,下面以不同角度认识微服务架构体系。

首先,微服务的九大特性[1]。Martion Fowler在Microservices一文中提炼出,这是了解微服务的最重要内容。

服务组件化:微服务的对立面就是单体结构,将单体拆分后组件化。

按业务组织团队:微服务化后每一个或一个可用域可以是一个团队开发。

做“产品”的态度:软件工程项目需要反复调优不断优化以适应业务弹性的环境。

智能端点与哑管道(Smart endpoints and dumb pipes):单体的内部模块调用常用的是函数调用和RPC方式,而微服务是更粗粒度的通信协议建立关系。

去中心化治理:微服务采用分散的管理方式,每个微服务团队内部有充分自由自组织技术栈。

去中心化管理数据:数据库可以分散到各个微服务中去,同时被透明化不可以被访问。所以彻底的微服务化所有的信息传递只有微服务接口一个通道。

基础设施自动化:当服务数量快速增加軟件开发要保持快速迭代必须要做到自动化,另外近两年DevOps在大陆也逐渐获得广泛认可,这是微服务化重要保证。

容错设计:服务间调用允许出错,在此方面必须表现出弹性。

演进式设计:没有完美的程序,在软件的生命周期中把这当成必然并支持不断演进式设计开发,不断完善而非一次完成。

其次,微服务架构技术选型。当前比较流行的微服务架构技术体系有三种:Dubbo;Spring Cloud:Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具[2](例如配置管理,服务发现,断路器,智能路由,微代理,控制总线);Netflix的Karyon/Ribbon。几年前Netflix就把它的几乎整个微服务框架栈开源,Spring将其吸收进Spring cloud中。所以基本上是两种阿里的Dubbo和Spring Cloud。建议采用Spring cloud,这是目前比较受认可的微服务架构技术主流。

第三,Spring cloud开发基础构件介绍。Spring boot:是Pivotal团队开发的能够简化便利地使用Spring创建和开发应用的框架[3],它是Spring cloud的基础。Spring MVC、H5、Bootstrap:这些是web展现层和控制层框架,虽然同类技术很多但这些逐渐占据主流。JPA、Spring data:这是推荐使用的数据持久层框架,在持久层使用Spring data技术实现JPA,引擎通常使用Hibernate。Docker、K8S:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。通常一个Docker包含一个服务。k8s是Google的Kubernetes,在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能。微服务正是由于容器技术的突破才迅速发展起来。Mysql、Redis:Mysql是开源数据库,但其在互联网的表现非常优秀,因为其小巧灵活常被部署到Docker中。Redis是一个key-value存储系统,和Memcached类似。

第四,微服务应用六大关键技术。完整的微服务架构包含很多的功能点,如果选出最为关键的几项而且忽略掉常见的一般单体系统也具有的关键技术,应该是以下六点:服务注册和发现、负载均衡、断路保护、微服务网关、分布式/版本化配置、消息驱动和总线。在微服务架构体系中还有很多关键技术和相应的实现组件,数量之多常常让人觉得难以学习,微服务化的道路不簡单。

4 大型网站的微服务架构设计

首先,微服务化设计方式:需要对业务进行拆分,要做好微服务的分层,要分布式的部署和调用。其次功能完整性和职责单一性。第三是迭代演进不要想着一次成功。最后是接口API的版本优先考虑兼容性。

其次,业务模型设计。微服务业务开发三个难题-拆分、事务、查询,其中业务拆分受架构本身和人的因素两方面影响。在业务模块拆分上可以采用以下方式。总体上分表现层、业务服务层、公共服务层、服务监控与治理层、实体和接口层和资源层。发布上可以采用多种协议,建议是RESTful API的形式。资源层是数据库、Redis、File system、cache等。

第三,技术模型设计和物理结构。在spring cloud 的解决方案中主要组件部署关系是浏览器访问API网关,通过客户端负载均衡到达服务组件,服务组件在此之前就向治理中心和配置中心关联好,Kibana是一个为 Logstash和ElasticSearch提供的日志分析的 Web接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。物理上所有的服务都可以部署到Docker上,而Docker由K8S来管理。整个开发部署环节按DveOps执行。这样形成了物理的服务器变成一种计算资源可以按需求由K8S随意调配,而Docker 可以利用registry搭建本地私有仓库,实现了Docker部署的灵活性和安全性。同时使用Jenkins+Maven+Git搭建持续集成和自动化部署的环境。

5 微服务架构下的团队协作

微服务带来的便捷的同时我们也经常听到一句话“微服务不是免费的午餐”,同时敏捷开发也常见到项目失败的案例。如何提高团队应对微服务挑战的成熟度,对于一个计划实施微服务的团队提出一些建议。

梳理最后一公里和运维的需求。包括基础环境的准备、部署发布、运营监控。基础环境的准备要求能快速响应需求到新功能自动更新,推荐基础设施及代码的实践,考虑构建团队DevOps能力,以实现小步快跑的持续迭代能力。为服务架构最大的挑战是微服务数量庞大,能够快速部署上线对团队的能力提出很高的要求,建议分离生产环境、预发布环境和测试环境。流水线部署,自动化脚本实现快速部署、配置管理、版本管理等,并相应改进微服务化后的奖励机制都是微服务架构下团队协作的重要保障。

6 微服务架构应用发展的展望

微服务架构目前在国外被很多大互联网公司采用[4],如

Google、Twitter, Netflix, Amazon, eBay等。国内采用微服务架构的有淘宝、京东、微博、微信等。微服务会有很大的发展,但同时也要看到微服务架构的一些缺点。如,微服务架构可能带来过多的操作;DevOps是必须的;可能需要付出更多努力;分布式系统可能复杂难以管理;因为分布部署跟踪问题难;当服务数量增加,管理复杂性增加。虽然有这些缺点,当前微服务架构仍是大型网站架构体系发展的趋势,这些问题也会随着社区和大公司的努力逐。

参考文献:

[1]ChrisRichardson,“Microservices Architecture”[EB/OL].http://microservices.io/patterns/microservices.html

[2]张晶,王琰洁,黄小锋.一种微服务框架的实现[J].计算机系统应用,2017(04):82-86.

[3]蒋勇.基于微服务架构的基础设施设计[J].软件,2016(05):93-97.

[4]邓杰文,曹彩凤.微服务若干关键问题研究[J].五邑大学学报(自然科学版),2016(02):49-54.

猜你喜欢
微服务
基于供给侧改革理论的图书馆社交网络微服务研究
微信公众平台在医院图书馆的应用现状调查
基于微信企业号的校园移动服务
从单一模式系统架构往微服务架构迁移转化技术研究
基于微信公众平台的高校图书馆微服务现状及对策