软件架构是一个包含各类组织的系统组织,这些组件包括 Web服务器, 应用服务器, 数据库,存储, 通信层), 它们彼此或和环境存在关系。系统架构的目标是解决利益相关者的关注点。html
Conway’s law: Organizations which design systems[...] are constrained to produce designs which are copies of the communication structures of these organizations.前端
(设计系统的组织,其产生的设计和架构等价于组织间的沟通结构。)数据库
Monolithic比较适合小项目,优势是:编程
开发简单直接,集中式管理, 基本不会重复开发后端
功能都在本地,没有分布式的管理开销和调用开销。它的缺点也很是明显,特别对于互联网公司来讲(不一一列举了):浏览器
开发效率低:全部的开发在一个项目改代码,递交代码相互等待,代码冲突不断安全
代码维护难:代码功能耦合在一块儿,新人不知道何从下手性能优化
部署不灵活:构建时间长,任何小修改必须从新构建整个项目,这个过程每每很长服务器
稳定性不高:一个微不足道的小问题,能够致使整个应用挂掉网络
扩展性不够:没法知足高并发状况下的业务需求
微服务是指开发一个单个小型的但有业务功能的服务,每一个服务都有本身的处理和轻量通信机制,能够部署在单个或多个服务器上。微服务也指一种种松耦合的、有必定的有界上下文的面向服务架构。也就是说,若是每一个服务都要同时修改,那么它们就不是微服务,由于它们紧耦合在一块儿;若是你须要掌握一个服务太多的上下文场景使用条件,那么它就是一个有上下文边界的服务,这个定义来自DDD领域驱动设计。
相对于单体架构和SOA,它的主要特色是组件化、松耦合、自治、去中心化,体如今如下几个方面:
服务粒度要小,而每一个服务是针对一个单一职责的业务能力的封装,专一作好一件事情。
每一个服务可以独立被部署并运行在一个进程内。这种运行和部署方式可以赋予系统灵活的代码组织方式和发布节奏,使得快速交付和应对变化成为可能。
技术选型灵活,不受遗留系统技术约束。合适的业务问题选择合适的技术能够独立演化。服务与服务之间采起与语言无关的API进行集成。相对单体架构,微服务架构是更面向业务创新的一种架构模式。
团队对服务的整个生命周期负责,工做在独立的上下文中,本身决策本身治理,而不须要统一的指挥中心。团队和团队之间经过松散的社区部落进行衔接。
咱们能够看到整个微服务的思想就如咱们如今面对信息爆炸、知识爆炸是同样的:经过解耦咱们所作的事情,分而治之以减小没必要要的损耗,使得整个复杂的系统和组织可以快速的应对变化。
咱们为何采用微服务呢?
"让咱们的系统尽量快地响应变化" - Rebecca Parson
让咱们的系统尽量快地去响应变化。其实几十年来咱们一直在尝试解决这个问题。若是必定要在前面加个限制的话,那就是低成本的快速响应变化。上世纪90年代Kent Beck提出要拥抱变化,在同期出现了诸多轻量级开发方法(诸如 XP、Scrum);2001年敏捷宣言诞生,以后又出现了精益、看板等新的管理方式。若是说,这些是为了尽快的响应变化,在软件开发流程和实践方面提出的解决方案,那么微服务架构就是在软件技术和架构层面提出的应对之道。
Autonomous
A Microservice is a unit of functionality; it provides an API for a set of capabilities oriented around a business domain or common utility
Isolated
A Microservice is a unit of deployment; it can be modified, tested and deployed as a unit without impacting other areas of a solution
Elastic
A Microservice is stateless; it can be horizontally scaled up and down as needed
Resilient
A Microservice is designed for failure; it is fault tolerant and highly available
Responsive
A Microservice responds to requests in a reasonable amount of time
Intelligent
The intelligence in a system is found in the Microservice endpoints not ‘on the wire’
Message Oriented
Microservices rely on HTTP or a lightweight message bus to establish a boundary between components; this ensures loose coupling, isolation, location transparency, and provides the means to delegate errors as messages
Programmable
Microservices provide API’s for access by developers and administrators
Composable
Applications are composed from multiple Microservices
Automated
The lifecycle of a Microservice is managed through automation that includes development, build, test, staging, production and distribution
通常同步调用比较简单,一致性强,可是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。RESTful和RPC的比较也是一个颇有意 思的话题。通常REST基于HTTP,更容易实现,更容易被接受,服务端实现技术也更灵活些,各个语言都能支持,同时能跨客户端,对客户端没有特殊的要 求,只要封装了HTTP的SDK就能调用,因此相对使用的广一些。RPC也有本身的优势,传输协议更高效,安全更可控,特别在一个公司内部,若是有统一个 的开发规范和统一的服务框架时,他的开发效率优点更明显些。就看各自的技术积累实际条件,本身的选择了。而异步消息的方式在分布式系统中有特别普遍的应用,他既能减低调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能 保证调用方的服务体验,继续干本身该干的活,不至于被后台性能拖慢。不过须要付出的代价是一致性的减弱,须要接受数据最终一致性;还有就是后台服务通常要 实现幂等性,由于消息发送出于性能的考虑通常会有重复(保证消息的被收到且仅收到一次对性能是很大的考验);最后就是必须引入一个独立的broker,如 果公司内部没有技术积累,对broker分布式管理也是一个很大的挑战。
实现一个API网关做为全部客户端的惟一入口。API网关有两种方式来处理请求。有些请求被简单地代理/路由到合适的服务上,其余的请求被转给到一组服务。
相比于提供普适的API,API网关根据不一样的客户端开放不一样的API。好比,Netflix API网关运行着客户端特定的适配器代码,会向客户端提供最适合其需求的API。
API网关也能够实现安全性,好比验证客户端是否被受权进行某请求。
–部署与监控运维成本
–机器数量与部署成本
–服务依赖、治理,版本管理、事务处理
–环境部署成本、约定成本
–监控、限流、SLA、LB、日志分析
–快速、复制、扩容
–单机开发
–安全、容错、服务降级、调用延时
当企业微服务化之后,服务之间会有错综复杂的依赖关系,例如,一个前端请求通常会依赖于多个后端服务,技术上称为1 -> N扇出. 在实际生产环境中,服务每每不是百分百可靠,服务可能会出错或者产生延迟,若是一个应用不能对其依赖的故障进行容错和隔离,那么该应用自己就处在被拖垮的风险中。在一个高流量的网站中,某个单一后端一旦发生延迟,可能在数秒内致使全部应用资源(线程,队列等)被耗尽,形成所谓的雪崩效应(Cascading Failure),严重时可致整个网站瘫痪。
服务依赖
一个完整的微服务系统,它的底座最少要包含如下功能:
如下功能不是最小集的一部分,但也属于底座功能:
–解决微服务对机器数量的诉求
–解决多语言问题
–单机开发、提高效率
–省钱
–可复用管理系统
–可复制
–可动态调节CPU与内存
随着持续交付概念推广以及Docker容器普及,微服务将这两种理念和技术结合起来,造成新的微服务+API + 平台的开发模式,提出了容器化微服务的持续交付概念。
下图传统Monolithic的DevOps开发队伍方式:
这种总体型架构要求产品队伍横跨产品管理 Dev开发 QA DBA 以及系统运营管理,而微服务架构引入之后,以下图:
微服务促进了DevOps方式的重组,将一个大臃肿的总体产品开发队伍切分为根据不一样微服务的划分的产品队伍,以及一个大的总体的平台队伍负责运营管理,二者之间经过API交互,作到了松耦合隔绝。
微服务的实施是有必定的先决条件:基础的运维能力(如监控、快速配置、快速部署)需提早构建,不然就会陷入如咱们般被动的局面。推荐采用基础设施及代码的实践,经过代码来描述计算和网络基础设施的方法,使得图案度i能够快速安全的搭建和处理由新的配置代替的服务器,服务器之间能够拥有更高的一致性,下降了在“个人环境工做,而你的环境不工做”的可能,也是为后续的发布策略和运维提供更好的支撑。
因为Docker引入,不一样的微服务可使用不一样的技术架构,好比Node.js Java Ruby Python等等,这些单个的服务均可以独立完成交付生命周期,以下:
Netflix的微服务架构以下,着重全球分发 高可扩展性和可用性:
Twitter的微服务架构,注重高效的可扩展的数据中心:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
但愿对您系统架构,软件项目开发,运维管理,系统架构与研发管理体系, 信息安全, 企业信息化等有帮助。
文章转载自博客园:PetterLiu