写点什么

先把平台做扎实,再来微服务吧

2015 年 10 月 21 日

微服务已经成为当下最热门的话题之一。它是一种新的架构风格,涉及组织架构、设计、交付、运维等方面的变革,核心目标是为了解决系统的交付周期,并降低维护成本和研发成本。相比传统的 SOA 架构或者单块架构,微服务有很多的优势,比如技术的多样性、模块化、独立部署等,但也带来了相应的成本,比如运维成本、服务管理成本等。

网上有很多讨论微服务优缺点的文章,而在这个新的东西面前,很多企业不知道如何抉择。那传统的架构有什么挑战?微服务可以为企业带来什么?切换到微服务架构之前,需要做出哪些准备?10 月 16 日,在 QCon 上海全球软件架构师大会上,InfoQ 组织了一场闭门会议,深入讨论和交流了微服务相关的问题。阿里巴巴、大众点评、唯品会、华为、普元、中国移动、点融等公司的代表参与了此次讨论,本文根据会议中的精彩观点整理而成。

传统架构面临的挑战

  1. 稳定性。很多公司都是从零开始构建自己的系统的,一开始,为了尽快的实现业务,所以系统的架构也相对比较简单。但当业务和用户量开始大规模增长之后,反过来又对系统的性能和稳定性有较高的要求。而传统的单体式(本文均指 monolithic)应用把所有的服务都堆到一起,可能会由于一些不重要的服务出问题而影响系统的核心服务。另外,系统对服务的要求也不一样,分开部署可以减小它们之间的相互影响。
  2. 可维护性。移动的系统是从 2001 年开始做的,到现在已经十多年了,这么多年,核心的系统一直是在完善、堆叠。而经过这么多年的维护,系统代码的可维护性非常差,开发人员和技术都已经迭代过几波,系统中代码之间的调用也很多,不是很了解系统的人也不敢轻易动。而由于系统的代码非常多,所以了解系统也不是一件容易的事情。
  3. API 的版本迭代。单体应用中,一个系统会对应出很多的 API,而根据业务的不断迭代,肯定会衍生出很多版本的 API,特别是现在很多系统都有不同的端(手机、网站)。API 的升级和维护都需要有相应版本的管理,而单体式的应用在这一块,有明显的短板。另外,API 的发布周期也会很慢,因为版本的发布涉及到整体的协调和测试。
  4. 持续集成。单体式的应用由于比较大,应用内部的依赖非常多,涉及的业务逻辑也比较复杂。在 CI 流程中,如果没有很好的约定的话,失败的次数也会比较多。另外,由于代码基比较大,所以构建的时间也会非常长,如果构建错误,排查问题也会比较困难。

对微服务的理解

  1. 微服务的概念里,有两个重点,快速发布和解耦。这两点都可以和 OO 中的架构设计原则相对应,一个是单一职责(single responsibility),也就是把一件事情做好,一个是关注分离(Separation of concerns)。康威定律说:设计系统的组织,最终产生的设计等同于组织之内、之间的沟通结构。对应到这里,也就是说微服务和公司的组织架构有非常紧密的关系。另外,很多公司都已经是微服务了,只是他们没有提,比如亚马逊、阿里巴巴。像他们这么大的公司,没有微服务根本玩不转。
  2. 微服务革新了软件的生产过程,包括开发、测试和部署各个阶段。但服务的切分并不是要遵守单一原则,因为未来的服务不可能完全垂直切分。从另外一个角度看,微服务的过程其实也是工业化的工程,每个微服务都是生产线上的一个零件,但要注意,零件的组装和拼接难度更大,所以在谈论微服务时一定要注意,它是需要一个大平台支撑的。
  3. 首先微服务并不是指代码本身,它包括从代码开发到部署到运维这一系列的工作流程。其次,谈到服务拆分,需要注意的是服务的 SLA(Service-Level Agreement)是不一样的,拆分时需要考虑到哪些是一级服务,哪些是二级服务。最底层的服务直接决定了上层服务的稳定性。
  4. 服务化说白了是组件化的一种形式,所有的组件都来源于重构。流程是从上往下写的,写到一定程度时,就会遇到分离、解耦的问题,然后就是组件化,这时才会出现重构。不要上来就追时髦,服务化没有价值。
  5. 如康威定律所说,系统架构和团队的组织架构有直接的关系。但并不是说为了微服务而调整组织架构,一般是考虑到业务的需求才调整团队组织架构。微服务的团队推荐是 7 个人左右,这也是 Netflix 的最佳实践。另外,团队与团队之间不要有太多依赖。中小型的创业公司不推荐使用微服务,因为开销成本很高,对平台的要求也很高。微服务涉及到你是否能有快速提供环境的能力、文化的改变、快速部署、监控等多方面的能力,当这些条件都具备之后,再考虑是否要微服务。

服务治理

  1. 服务治理这块,根据经验,有三个需要注意的。一是接口的统一性,当公司发展到几百人的时候,如果没有接口规范,那效率马上就会下降。之前可以像游击队一样打,但人多了之后,还是像正规军一样战斗力会比较强。二是容错一定要做好,这块可以参考 Netflix 开源的几个组件。容错如果没有做好,在服务化这样的系统里,很可能会造成雪崩效应。容错的方案也有很多,比如限流、回退、隔离、熔断。三是监控,在微服务出错之后,团队需要快速定位出错的位置和原因。
  2. 服务治理这块,阿里巴巴有个不错的框架 Dubbo ,已经开源。抛开服务治理不说,我来举个服务化的反例,Facebook 内部是反服务化的。Facebook 所有的代码只有两个库,并且所有的发布都是同时进行的,每个机器都一模一样。所以 Facebook 可以做到零运维,并且服务根本没有版本的概念。阿里巴巴现在的服务也准备往回收,在没有服务和过多的服务之间找到一个平衡点。
  3. 服务方需要知道服务会被多少人调用,被哪些业务调用,每个时间点上的状态是怎么样的。一个经验是为每个服务都起一个名字,当出现问题时,可以快速定位到。另外,阿里的 eagleye 和点评的 CAT 监控系统,支持对服务调用链和依赖关系进行可视化监控,可以参考学习。
  4. 微服务中,服务的测试是一个非常大的挑战。服务和服务之间会存在依赖,所以环境的搭建可能就会涉及到多个团队,这个时候就需要能快速部署环境,当然现在比较推荐的方案是容器。
  5. 微服务,其实对应的应该是微业务,是为了适应业务的多变/面向最终用户的个性化需求。而微服务的力度,很大程度上是取决于完成一项业务所要设计的数据存储所在的区域。微服务的监控,和原来的服务监控力度应该是类似的,包括业务、应用、系统多个层次,日志、Metrics、调用链、告警等多个维度。
  6. 提到监控,大家一般都是从系统、应用等层面去考虑。我这里抛一个思路给大家:舆情监控。很多时候,当系统出问题的时候,我们并不是在监控那里得到消息,而是从微博、微信等渠道中收到用户反馈(XX 系统真垃圾,又挂了之类……)。我们努力了几年了,就是想让我们的监控系统能在舆论之前监测到系统的异常状态,但很难,所以现在我们也在重点考虑舆情监控。
2015 年 10 月 21 日 02:239878
用户头像
郭蕾 做有意思的事情!

发布了 210 篇内容, 共 108.8 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

深入理解JVM中的类加载机制

Simon郎

JVM

android开发实战!面试的时候突然遇到答不上的问题怎么办?Android校招面试指南

欢喜学安卓

android 程序员 面试 移动开发

高并发高性能服务器是如何实现的?

赖猫

c++ 高并发 linux开发 服务器开发 多线程高并发

怎么和小伙伴语音连麦,你造吗?

anyRTC开发者

ios android WebRTC sdk 语音通话

收购环信、因Clubhouse股价飙升30%,

ToB行业头条

大厂面试算法到底有多重要?学会这份算法宝典,随便暴打头条面试官!

Java架构之路

Java 程序员 架构 面试 编程语言

硬盘的秘密

yes的练级攻略

机械硬盘

混合云的五个优势

浪潮云

混合云

C/C++后台开发需要点亮哪些技能树||(鹅厂为例) Linux百里

赖猫

c++ Linux 后台开发 linux开发 服务器开发

带你了解TCP/IP,UDP,Socket之间关系

赖猫

socket udp TCP/IP

SpringBoot 接口幂等性的实现

xcbeyond

Spring Boot Java、 幂等性 28天写作

非科班Java面试快手三面,如果不是疫情,offer已经到手了

Java架构之路

Java 程序员 架构 面试 编程语言

android开发手册apk!Android开发者跳槽指南终获offer

欢喜学安卓

android 程序员 面试 移动开发

资本市场发展趋势学习笔记

JiangX

28天写作

腾讯基于 Flink SQL 的功能扩展与深度优化实践

Apache Flink

flink

字节跳动面试流程以及注意事项,各大厂具有通点;看看不吃亏

Java成神之路

Java 程序员 架构 面试 编程语言

GitHub爆赞!阿里P8力荐的 Java源码解析及面试合集

Java成神之路

Java 程序员 架构 面试 编程语言

终于有人把SpringBoot讲清楚了!阿里P8力推的SpringBoot核心笔记

Java成神之路

Java 程序员 架构 面试 编程语言

备战金三银四,”吊打各厂面试官“ ,为你准备了这份堪称“神作”的Java面试宝典

Java架构之路

Java 程序员 架构 面试 编程语言

官宣|焱融科技完成1.2亿元A+轮融资

焱融科技

分布式 存储 焱融科技 企业融资 创业公司

你需要的Docker知识点都在这里了。

后台技术汇

28天写作 2月春节不断更

解读|2020年CNCF云原生调研报告

焱融科技

云原生 存储 容器存储 容器化 cncf

硬核!阿里新产2021最新版面试手册,Github上获赞89.7K

程序员小毕

Java 程序员 面试 分布式 JVM

【LeetCode】双指针反转字符串

HQ数字卡

算法 LeetCode 2月春节不断更

京东扫描平台EOS—JS扫描落地与实践

京东科技开发者

前端

webpack | 进阶用法4:如何进行构建速度和体积分析

梁龙先森

前端工程化 webpack 28天写作 2月春节不断更

程序员成长第二篇:如何快速入门

石云升

28天写作 2月春节不断更 程序员入门

DCache 分布式存储系统|Key-Value 缓存模块的创建与使用

TARS基金会

nosql 微服务 MySQL 高可用 分布式数据储存 TARS

吹爆!阿里技术官强推“Spring全家桶进阶笔记”限时开源,差距不止一点点!

程序员小毕

Java spring 编程 程序员 面试

LeetCode题解:69. x 的平方根,牛顿迭代法+递归,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

盘点软件开发中那些有趣的边际效应

架构精进之路

认知提升 日更挑战 28天写作 2月春节不断更

微服务架构下如何保证事务的一致性

微服务架构下如何保证事务的一致性

先把平台做扎实,再来微服务吧-InfoQ