此文已由作者尧飘海授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

Monolithic架构在产品访问量很大的情况下,有可能常会导致整个产品迭代或升级过程不能按预期进行,或者上线风险的不确定性导致上线时常常信心十足。那么MSA(微服务架构)的模式能在很程度上避免Monolithic架构在规模服务应用下的一些缺陷。

微服务架构这个词语出现的较早,其实公司的很多产品也是这么开发和运行的,直到ThoughtWorks的专家讨论过微服务后。Fred George,、James Lewis,Martin Fowler通过专门写博文讨论微服务,才使得微服务变成了下一个时髦术语,但实际上大量的论文也没有划分什么才是真正的微服务,但现在每个公司都想使用一些微服务来完成产品的开发。

MSA(微服务架构)

在日常的工作中,我们有可能会有机会接触到运行很多早的大型的遗留系统,除了特别强大的牛人之外,一般的开发人员或者新人基本上无法全面的理解系统内部的运行方式,如果又有新的功能要及时上线
,那么处理遗留代码的风险就很高了,经常会出现在对业务理解不全面的情况下修改了某处代码而引入其他关键的部分。日前有些业务团队确定就遇到了这样的问题,基本通过微服务能较好的解决这个难题,可能按最新的框架模型编写一些小的服务组合起来,完成业务流程,等所以的业务都能够覆盖全面时,那么老的系统基本上就可以下线了。

微服务其实只是一种新的架构概念,没有什么新的东西,也没有明确的范围定义,只是通过将功能尽可能的按需求分解到各个离散的服务中从而达到各服务间的解藕,甚至可以简单的看成一个个非常小的Monolithic架构组合。

微服务是一种简单的应用,每个服务基本上只完成自己角色的任务,没有额外的业务代码,有些甚至一个算法实现都可能当做一个服务来发布,比如之前Pomelo游戏框架的地图的AOI服务,这些服务基本简单到只能完成一个功能,非常的轻量级和容易理解,公司内的新的项目有些目前基本上采用这样服务化的方式来实现的,只是将一些业务代码简单的包装通过通信层较好的完成服务调用。

这种架构的方式的实现方式如下:

相对于前文中的Monolithic架构模式中提到的应用软件开发的非功能要求,这些微服务的架构有什么区别呢?

没错,这种MSA架构实现方式与SOA的模式非常相似,有些人会认为基本上一样的,但是微服务还是有一定的区别的,SOA的架构早期的采用ESB这种企业总线的方式来实现,里面包括了很多业务规则,消息路由,很多是采用重型的中间件来实现的,整体对开发人员不是很透明,查问题的效率也不是很高。微服务更加轻量级,所有的操作可能直接通过消息传递的方式来实现,中间件只是消息的搬运工,不会对消息进行任务处理。

采用这种架构模式的优势是:

  • 轻量级 每个开发者都能容易理解;相关开发工具对小应用也也较好的支持,而不管相关的机器的配置;整个过程无论是编译,部署过程都很轻量级,这将使用开发人员,测试人员和运维人员工作效率更加高效。

  • 易升级 每个服务都可以独立部署,只要输入输出一致,各服务可以更新的完成运维。

  • 易上手 由于代码简单,无论是新入职的员工还是顶替的角色都能较好的现在业务逻辑,每个组都能独立工作,减少和其他的组的沟通的开销。

  • 容错性,每个服务独立部署,某一个服务的失败不会影响整体的业务不可访问,能大大提高用户的SLA服务时间,提高用户的体验。

  • 易扩展 由于每个服务都有对应的资源需求,很少会引起资源竞争,比如各个服务可以连接不同的数据库来完成对数据库的依赖。

  • 易运维 通过复制多份的方式来实现模向扩展,负载均衡完成请求路由。

  • 易掉头 微服务能较好的随时使用新技术,新的框架带来的红利,而不用受到技术债的影响。

当然,随着系统服务的逐步细化和扩大,每个服务单独部署,微服务架构的一些问题也暴露出来了:

  • 由于每个服务的单独部署,按照日前云计算的使用方式,每个服务都申请一台云主机来部署,将造成大量的工作时间化在沟通和交流上,包括主机的申请,初始化和权限申请等,其次每个产品要申请大量的云主机来服务,数量将成指数级别增长,从来进一步带来运维管理等相关问题。

  • 资源的使用方式,微服务采用云主机部署的方式也将使用资源的利用不充分,造成很多的资源浪费,包括内存,磁盘等,以前只有运行一个JVM就能跑起来的服务,现在可能需要运行多个JVM才能完成。

  • 关键性业务复杂,对于一些业务要求很高的场景,比如订单支付之类的服务会引入分布式事务的复杂操作,日前我们公司也开发了TCC的分布式事务来处理这类问题。

  • 分布式系统 通过服务调用,至少增加了一层的开销,当然这种开销一般情况下基本可以忽略,服务端调用除了业务的逻辑之外要的开销非常小;除此之外还需要明确了解自己的业务类型,这样才能更好的根据业务类型部署运行不同类型的主机上。

  • 测试困难 开发人员在完成自己代码开发后,由于涉及到各个系统的业务,因此实现的不同的测试用例要跨不同的服务来编写,同时由于分布式事务之类的操作,导致测试场景更加复杂,对于服务的测试需要测试人员编译相关的测试接口和集成测试用例来完成,因此对测试人员的要求会更高。

  • 部署复杂 运维人员部署不同的类型的服务需要了解不同的部署方法,由于服务的部署复杂,对应带来的协调管理成本也会相应的增加,如何高效的实现服务部署的自动化就变得非常的严峻。通过DEVOPS技术来减少和防止由于繁烦的配置导致事故。

通过二种架构方式的对比,采用何种架构方式来完成应用的部署对于技术负责人或架构师来说也是一个非常有挑战性的难题,一般在项目的初期或业务上线DEADLINE的需求下,会采用前者架构来快速实现,在项目初期一般也不会遇到非常大的访问量的应用的,同时细化,全分布化服务化的架构也会导致开发速度变慢。而如果业务快速发展,项目的技术架构债也会更加重,需要人员来完成服务化的架构改造来适用业务的发展。因此何时采用架构模式需求根据项目的业务需求和实际的能力来决定,当其他的系统不能很好的服务于项目或不能满足项目的生态需求时,这也是负责人或架构师的职责所在。

同样,在项目开发,测试和上线时,不同的架构模式需要使用不同的部署工具来实现高效的自动部署,尽量减少各人员的沟通和管理等成本,专业人员只要把注意力放在自身的业务范围内,为项目的上线实现工作自身的价值。对于Monolithic架构的应用,我们的自动部署平台系统(http://omad.hz.netease.com)  能较好的担当这类角色,但是对于MSA服务架构的项目,自动部署平台系统尽管也能部署,但是也会遇到上面提到部署问题,比如:主机数量爆炸式的增长带来的管理成本,对资源的合理使用等。如何解决这些问题,需要大家一起努力来解决,特别是如果和GOOGLE一样每周需要20亿个服务部署的时候,我们对应的服务能跟上业务的需求不?我们的PaaS的服务能否很好的面对这些挑战?作好准备了吗?

后续本文将继续介绍其他公司的服务化解决方案,包括ebay,Amazon,淘宝等国内外,随后也将详细介绍我们的实现方案和具体做法,敬请期待。

其实,我们的PaaS服务化之路刚刚开始;
其实,我们的PaaS服务化之路已经开始;

最后,PaaS可能是一套开发、测试、运维的规范和流程的实战总结,也可能是系统化的工具组合,但业务和技术是不断变化的,没有那个理论和工具能一劳永逸地回答和解决所有问题,只有最好,只有适合,所以PaaS也不是银弹。期待大家提供高见建设我们的PaaS服务之路!

参考:

PaaS服务之路漫谈(一)

PaaS服务之路漫谈(二)

网易 云计算基础服务 深度整合了  IaaS 、 PaaS  及容器技术,提供弹性计算、 DevOps  工具链及微服务基础设施等服务,帮助企业解决  IT 、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台, 点击可免费试用

相关文章:
【推荐】 浅谈代码结构的设计

PaaS服务之路漫谈(三)的更多相关文章

  1. PaaS服务之路漫谈(一)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. PaaS服务之路漫谈(一) 1983年,SUN公司提出的网络即计算的理念:2006年亚马逊(Amazon)推 ...

  2. PaaS服务之路漫谈(二)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 天下大势,分久必合,合久必分,社会历史的发展方向总有着惊人的相似.把这种规律应用到软件应用架构的发展方向上, ...

  3. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

  4. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产环境下的追踪系统

    前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的问题: 从APM上说,知道某个节点出现异常,或延迟过过高,却不能及时知道日志反馈情况,总不可能去相应的节点 ...

  5. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

    原文:NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统 前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的 ...

  6. .NET Core微服务之路:不断更新中的目录 (v0.43)

    原文:.NET Core微服务之路:不断更新中的目录 (v0.43) 微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑, ...

  7. 『现学现忘』Docker相关概念 — 3、IaaS、SaaS、PaaS服务模式补充

    目录 1.IaaS服务模式 2.PaaS服务模式 (1)何时使用PaaS (2)PaaS的特点 (3)PaaS优势 3.SaaS服务模式 云计算通俗来说就是输入/输出和计算不在一个主机上.计算要用到计 ...

  8. redis成长之路——(三)

    redis连接封装 StackExchange.Redis中有一些常功能是不在database对中,例如发布订阅.获取全部key(本代码中已封装到operation中了)等,而且StackExchan ...

  9. Azure PaaS服务密钥的安全性

    Azure PaaS服务,比如存储,Redis缓存,服务总线,IoT中心等等,一般通过密钥来认证客户端,也就是说只有提供正确密钥的客户端才能访问和使用对应的Azure PaaS服务,所以这个密钥是很重 ...

随机推荐

  1. 通过dockerfile构建nginx

    上次 利用命令行的形式来构建nginx服务, http://www.cnblogs.com/loveyouyou616/p/6806788.html 这次利用dockerfile文件来构建nginx服 ...

  2. 连接redis

  3. DB2错误码

    SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 + 未限定的列名被解释为一个有相互联系的引用 + 动态SQL语句用分号结束 + 没有找到满足SQL语句的行 + 用DATA CAPTUR ...

  4. 【文件下载】Java下载文件的几种方式

    [文件下载]Java下载文件的几种方式  摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...

  5. 彻底测试全部拷贝list相关操作的区别python

    1.用浅拷贝后修改数字,可以起到与原数据分离的效果 import copy origin = [, , [, ]] #origin 里边有三个元素:, ,[, ] cop1=origin.copy() ...

  6. 【Maven】Nexus配置和使用

    Nexus安装 nexus安装,可以参照:[Maven]Nexus(Maven仓库私服)下载与安装 Nexus简单说明 用途:指定私服的中央地址.将自己的Maven项目指定到私服地址.从私服下载中央库 ...

  7. Devexpress VCL Build v2013 vol 13.2.5 发布

    支持xe6 了,但是承诺的功能在哪里? What's New in 13.2.5 (VCL Product Line)   New Major Features in 13.2 What's New ...

  8. 2018.08.27 lucky(模拟)

    描述 Ly 喜欢幸运数字,众所周知,幸运数字就是数字位上只有 4 和 7 的数字. 但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列. 哈哈,是 不是感觉被耍了,没错,你就是被耍了. ...

  9. hdu-1176(动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路:类似数塔问题, 从最后一秒开始考虑,每次这一秒的状态确定意味着前一秒的状态也已经确定,所以 ...

  10. Shell 中expr的使用

    1.expr命令一般用于整数值,其一般格式为:expr argument operator argument一般的用法是使用expr做算术运算,如:[root@centos ~]# expr 10 + ...