如何构建微服务架构

本文讲的是如何构建微服务架构【编者的话】“微服务”的概念兴起于四五年前,近几年尤其火热,各大厂都在进行微服务化改造和微服务建设。最近一年来我们也参与了微服务化的改造大军,这里写下一些做微服务系统设计和开发时的切身感受。

【3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站】本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览;持续集成系统介绍;客户端与服务端的 CI/CD 实践;开发流程中引入 CI、CD;Gitlab 和 CI、CD 工具;Gitlab CI、Drone 的使用以及实践经验分享等。

微服务架构

说起微服务,不得不提那篇经典的文章,来自Martin Flower的《Microservices》,建议多读几遍。Martin Flower是敏捷开发方法创始人之一,《重构》《企业应用架构模式》作者,ThoughtWorks公司的首席科学家。微服务虽然不是在这篇文章中首次提出,但是它将发展多年的微服务架构进行了重要性总结,推动了微服务的流行。

Martin在文章中从多个方面详细阐述了微服务的概念,首先作者对比单体应用的架构,一个单体应用处理请求的所有逻辑都运行在一个单独的进程中,这种情况下,你可以在笔记本上开发、测试、部署都很简单,还可以通过负载均衡进行横向扩展,最后交付给运维团队。单体应用非常成功,但是越来越多的人感觉不妥,尤其是在云中部署的时候,任何微小的变更都要整体重新构建和部署,扩展的时候也需要整体扩展,不能进行部分扩展。这时候微服务架构风格就出现了,它提出将应用程序构建为一套服务,每个服务都可以独立部署和扩展,运行在独立的进程中,服务之间通过RPC调用进行通信。微服务的应用致力于松耦合和高内聚:采用单独的业务逻辑封装,接受请求、处理业务逻辑、返回响应,而且喜欢简单的REST风格,而不喜欢复杂的协议,最终实现敏捷开发。

单体架构和微服务架构图

微服务不是什么框架,也不是什么系统,只是一种架构风格。我们所使用的DSF(华为)、DUBBO(阿里)、Spring Clould(Pivotal)等框架,在介绍中都称是分布式服务框架。这些分布式服务框架都是微服务架构必不可少的基础能力,微服务一定是分布式的。分布式服务的概念比较模糊,只是解决了网站的高并发问题,很多细节问题是微服务帮其明确的。微服务更加强调敏捷和健壮,强调服务的粒度,一个服务只需完成一个单一的、独立的功能,多个微服务组合完成相对复杂的业务系统,以满足需求。而且微服务注重借助于各种中间件进行业务解耦和提高性能,以及提高服务的容错性。

从上面的介绍中我们可以看出,微服务架构有很多优点。例如,服务的拆分将复杂问题简单化;每个服务由专门的团队开发,开发者可以自由选择实现技术,提供API服务;每个微服务都可独立部署,加快了部署速度;每个服务可独立扩展以满足需求。微服务不是免费的午餐,微服务架构也有缺点。微服务概念强调了服务的大小,但是服务变小不是最终目的,微服务的目的是有效地拆分应用,实现敏捷开发和部署;微服务应用都是分布式系统,需要通过RPC进程间通信完成服务调用,这样大大增加了系统的复杂性,因此必须写代码处理由于网络或者服务不可用等导致的调用失败问题,虽然一般框架都支持相关配置,但是在这种情况下微服务显得相对复杂些;在微服务架构的应用中,建议不同的服务使用不同的数据库,这种情况下,一个交易一般会调用多个服务,同时需要修改多个数据库,由于CAP理论和其它的一些因素,并不能实时地保证数据的一致性,因此不得不使用最终一致性的方法,从而对开发者提出了更高的要求和挑战;测试一个微服务架构的应用也是很复杂的任务,首先需要启动和它相关的所有服务(至少需要这些服务的stubs)。最后还是要强调一下,不要低估了微服务架构带来的复杂性,下面介绍一下我们如何应对这样的复杂性。

微服务架构给我们带来方便的同时,也引入一定的系统复杂性,最近几年随着基础设施自动化技术的发展,比如云平台、容器技术,再加上自动化测试与持续集成,减少了构建、发布、运维微服务的复杂性。因此我们的微服务团队应该依赖基础设施自动化技术构建软件,下图说明这种构建的流程:

基本的构建流程

在构建微服务软件时使用的分布式服务框架也拥有很多特性,这些特性提供了很多复杂问题的解决方案,比如异步调用、超时失败策略、故障隔离、健康检查、流量控制以及自定义路由等,这些特性大大减轻了开发者处理逻辑的负担,还有一些高性能、高可用的保障都增加了我们构建微服务的信心。而且经过多年的微服务实践者的摸索,也总结出了很多辅助运维系统,比如统一日志收集(ELK)、服务管理、服务监控和服务治理等,大大减轻了运维的工作,而且能让我们对复杂的微服务系统做到心中有数。

总之,微服务架构入坑容易,坑了呆得舒服难。各种基础设施和配套系统必须跟得上,还得有一个具有微服务特性的团队,才能真正驾驭得了微服务。

两个值得深入的话题:

  1. 微服务与持续集成
  2. 微服务与测试

微服务团队

上一节中说到更适合构建微服务应用的微服务团队,什么时微服务团队?说一个比较现实的问题,当我们做服务拆分的时候,通常管理都会集中在技术层面,涉及到UI团队、服务端业务逻辑团队、数据库团队、测试团队和运维团队。当采用这种标准对团队进行划分时,即使时小小的变更都将导致跨团队项目协作,从而消耗时间和预算审批。这就是 Conway's Law :

设计一个系统的任何组织(广义上)都会产生这样一种设计,其结构是组织交流结构的复制。
——Melvyn Conway, 1967

Melvyn Conway 的意思是设计一个系统的团队结构将决定了一个软件系统的结构,将人员划分为 UI 团队,中间件团队,DBA 团队,那么相应地,软件系统也就会自然地被划分为 UI 界面,中间件系统,数据库。而一个高效的微服务团队会针对这种情况进行改善,微服务团队需要是一个全栈的团队,跨职能的团队,应该包含整个项目周期的所有技能,前后端开发、UI设计、测试、构建部署、上线与运维都是必须技能。

微服务团队除了熟练的业务逻辑开发之外,还需要有DevOps能力、服务的快速构建、良好的团队文化:

  • 首先DevOps能力是保证持续交付和应对复杂运维问题的动力之源,运维人员不懂开发人员的服务设计和调用流程,开发人员不懂产品环境和整体配置结构,开发和运维的融合才能更好的应对微服务架构。正如下面这句话所说的,“你构建,你运维”。

    You build it, you own it. – Amazon CTO

    因此,需要打造DevOps文化,将运维作为需求提前注入到开发流程中。

    DevOps流程

  • 其次保持服务的持续演进,使服务能够快速、低成本地被拆分和合并,以快速响应业务的变化。
  • 同时要保持团队和架构的对齐,微服务看似是技术层面的变革,但它对团队结构和组织文化有很强的要求和影响,识别和构建匹配架构的团队是解决问题的加速器。微服务团队的另一个关键点是持续改进、持续学习和反馈,只有保持这样一个文化氛围,微服务架构才能持续发展下去,保持新鲜的生命力,进而实现我们的初衷。

专业的微服务团队,为微服务保驾护航。

项目的微服务设计实践

我们在各种基础设施不健全的情况下,匆忙进入了微服务改造的深渊。原来的单体应用按照功能拆分成了下面的结构:

微服务下的系统分层

拆分之后,模块突然变多了。将内部业务逻辑和原子功能拆分出来,实现了部分功能的复用,并且对外的接口按类型区分到不同的模块中去了,方便了使用,但是增加了管理的难度。

从上面我们对微服务架构的了解,一个微服务系统会有大量的服务组成,服务之间的层次关系依然是存在的,但是调用顺序上的要求会有所降低,只要满足严格的上层调用下层即可,在某些简单的业务功能上允许跨层调用。

架构对比图

上图是三种架构(集中式、分布式、微服务架构)的形象化展示。可以看到微服务的一个状态,乍看起来有些混乱,如果还按照以前的管理方式维护项目的话,工作量会成指数级增长,人力所无法胜任的工作。

这时候就需要依赖一些分布式服务框架,并建立一些辅助运维系统:

  1. 首先服务之间远程调用,服务的注册和发现机制必须有好的分布式服务框架(类似dubbo)支持,方便做服务之间的调用配置管理。
  2. 部署的服务进程增加以后,对应的日志文件也会增多,这时再使用ssh到服务器上查看日志,这个工作量也是可想而知的。我们对业务日志做了规范化约束,然后使用ELK技术栈搭建了日志集中化管理系统。
  3. 为了能够对线上的所有服务有个全局的把控,我们根据注册中心的数据搭建了服务的管理系统,展示各个维度的统计数据,例如,每个主机上多少个应用,每个应用提供了多少个服务,同时又消费了多少个服务等等。还有一些针对服务的约束规则的告警信息,例如某个应用消费的服务,却没有服务提供者等。还有一个整体的应用之间的依赖关系图。
  4. 为了优化系统结构和排查问题,搭建了服务的监控系统,这个是依赖分布式服务框架打印的预统计日志的,通过这些日志分析得到一个整体的服务监控功能,例如每个服务的响应时间、错误率等。还有调用链跟踪功能,排查问题时使用它来跟踪请求信息。
  5. 服务治理功能用来及时地对线上项目做一些调整,例如限流、降级、负载均衡、超时、路由、隔离容错等。

有了以上这些系统辅助,我们的微服务化改造之路平坦了许多。

在进行微服务化改造的时候,接口的设计上遇到了一个问题,服务之间的调用是通过私有协议进行的RPC调用,这种调用中如何描述服务响应成功之外的其他异常情况?

  1. 采用Exception类,定义各种异常类来描述异常情况。
  2. 采用错误码+错误描述。

其中方案1采用的Exception类,是我们平时java中定义进程内部接口最常见的方法,这种方法的优点是,能够使调用接口的一方的代码更简洁,通过try...catch来处理,如果不需要处理的话,在方法上声明直接向上抛出即可。缺点是跨语言开发解析难度大增,而且日志中异常堆栈很多。方案2采用错误码的形式恰恰相反,缺点就是每次调用都要判读是否调用成功,增加代码中的if语句。

针对这个问题,希望各位实践分布式服务或者微服务的大神给出你们的实践方案,疯狂讨论起来。

结束语

上述三节中讲述了我们在构建微服务的经历和一些感想,给其他准备实施微服务和正在实施微服务的团队以参考,写这篇文章的另一个目的就是希望能起到抛砖引玉的作用,希望能和其他团队进一步交流。

搞微服务

原文链接:如何构建微服务架构(作者:rabbitGYK)

原文发布时间为:2017-08-19

本文作者:rabbitGYK

原文标题:如何构建微服务架构

时间: 2024-09-17 04:28:07

如何构建微服务架构的相关文章

Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构

本文讲的是Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第二篇,本篇我们将会利用工具进行设置,深入探讨如何使用Docker工作,然后搭建我们的第一个容器.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.SOA架构.大数据以及云计算等领域的软件产品架

Spring Cloud构建微服务架构(二)服务消费者

  Netflix Ribbon is an Inter Process Communication (IPC) cloud library. Ribbon primarily provides client-side load balancing algorithms. Apart from the client-side load balancing algorithms, Ribbon provides also other features: Service Discovery Inte

Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】

在上一篇<Spring Cloud构建微服务架构:服务网关(基础)>一文中,我们通过使用Spring Cloud Zuul构建了一个基础的API网关服务,同时也演示了Spring Cloud Zuul基于服务的自动路由功能.在本文中,我们将进一步详细地介绍关于Spring Cloud Zuul的路由功能,以帮助读者可以更好的理解和使用它,以完成更复杂的路由配置. 传统路由配置 所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来

通过Ruby on Rails和docker构建微服务架构之入门教程

说到时下的架构,免不了会涉及到微服务.而谈到微服务架构,又跟容器和Docker技术脱不了关系.虽然容器和Docker并不完全是一回事,但两者是密不可分的,而且二者之间也有共同之处:在大型复杂应用的构建和运营方面,二者都可以大大提高企业的效率.   微服务可不像一般的应用,可以通过apt-get工具进行安装,大家可能会问了:我们该如何才能像安装应用一样实现这种服务呢?在很大的程度上,这个问题的答案是否定的,我们无法轻松实现这种服务.更准确的说,至少目前我们还无法实现.在一个系统中,最难修改的就是架

Spring Cloud构建微服务架构:服务网关(过滤器)【Dalston版】

2017年架构师最重要的48个小时 | 8折倒计时 在前两篇文章:服务网关(基础).服务网关(路由配置)中,我们了解了Spring Cloud Zuul作为网关所具备的最基本功能:路由.本文我们将具体介绍一下Spring Cloud Zuul的另一项核心功能:过滤器. 过滤器的作用 通过上面所述的两篇我们,我们已经能够实现请求的路由功能,所以我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了.但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限

使用Spring Cloud和Docker构建微服务

本文讲的是使用Spring Cloud和Docker构建微服务,[编者的话]这是系列博文中的第一篇,本文作者使用Spring Cloud和Docker构建微服务平台,文章的例子浅显易懂. 本系列博文主要向大家介绍如何使用Spring Cloud和Docker构建微服务平台. 什么是Spring Cloud? Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集.Spring Cloud引入了云平台连接器(Cloud Connector)和服务连接器(Service Co

微服务架构的核心要点和实现原理

微服务架构中职能团队的划分 传统单体架构将系统分成具有不同职责的层次,对应的项目管理也倾向于将大的团队分成不同的职能团队,主要包括:用户交互UI团队.后台业务逻辑处理团队与数据存取ORM团队.DBA团队等.每个团队只对自己分层的职责负责,并对使用方提供组件服务质量保证.如果其中一个模块化组件需要升级.更新,那么这个变更会涉及不同的分层团队,即使升级和变更的改变很小,也需要进行跨团队沟通:需求阶段需要跨团队沟通产品功能,设计阶段需要跨团队沟通设计方案,开发阶段需要跨团队沟通具体的接口定义,测试阶段

Spring Boot与Docker(一):微服务架构和容器化概述

本文讲的是Spring Boot与Docker(一):微服务架构和容器化概述,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列四部曲的第一篇,本篇将会对我们谈及的微服务架构以及容器化概念作一个概述.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.SOA架构.大数据以及云计算等领域的软件产品架构经验,他是AWS认证解决方案架构师,在3Pillar之前先

硅谷Spring项目组专家教你利用Spring Cloud构建微服务

  在这一系列文章中,我将为您介绍利用Spring Cloud和Docker构建微服务平台的一些基本概念.   什么是Spring Cloud   Spring Cloud是一系列Pivotal云应用开放工具的合称,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式,为构建分布式系统的一些常见模式提供了解决方案.   如果您熟悉构建应用程序的Spring Framework,那么对Spri