欲速则不达,欲达则欲速!java
1、前言web
微服务架构被提出很短的时间内,就被愈来愈多的开发人员推崇,简单来讲其主要的目的是有效的拆分应用,实现敏捷开发和部署。本博客尝试介绍微服务架构的一些实施细节和要求,探询微服务架构的由来,并最终提供咱们团队内部的有一些实践总结,但愿对你们有帮助。算法
2、什么是微服务数据库
传统的web开发方式,经过对比比较容易理解什么是Microservice Architecture。和Microservice相对应的,这种方式通常被称为Monolithic(比较难传神的翻译)。全部的功能打包在一个 WAR包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI等全部逻辑。缓存
用《The art of scalability》一书里提到的scale cube比较容易理解如何拆分。 咱们叫分库分表,为人总结成了scale cube,这就是抽象的能力,把复杂的东西用最简单的概念解释和总结。X轴表明运行多个负载均衡器以后运行的实例,Y轴表明应用进一步分解为微服务(分库),数据量大时,还能够用Z轴将服务按数据分区分表。安全
Monolithic比较适合小项目,优势是:网络
开发简单直接,集中式管理架构
基本不会重复开发并发
功能都在本地,没有分布式的管理开销和调用开销负载均衡
它的缺点也很是明显,特别对于互联网公司来讲(不一一列举了):
开发效率低:全部的开发在一个项目改代码,递交代码相互等待,代码冲突不断
代码维护难:代码功能耦合在一块儿,新人不知道何从下手
部署不灵活:构建时间长,任何小修改必须从新构建整个项目,这个过程每每很长
稳定性不高:一个微不足道的小问题,能够致使整个应用挂掉
扩展性不够:没法知足高并发状况下的业务需求
因此,如今主流的设计通常会采用Microservice Architecture,就是基于微服务的架构。简单来讲,微服务的目的是有效的拆分应用,实现敏捷开发和部署。
3、微服务的具体特征
一、一些列的独立的服务共同组成系统
二、单独部署,跑到本身的进程里
三、每一个服务为独立的业务开发
四、分布式的管理
Martin本身也说了,每一个人对微服务均可以有本身的理解,不过大概的标准仍是有一些的。
分布式服务组成的系统
按照业务而不是技术来划分组织
作有生命的产品而不是项目
Smart endpoints and dumb pipes(个人理解是强服务个体和弱通讯)
自动化运维(DevOps)
容错
快速演化
4、SOA vs Microservice
我我的理解microservice是SOA的传承,但最本质的区别在于 Smart endpoints and dumb pipes, 或者是是真正的分布式的、去中心化的。 Smart endpoints and dumb pipes本质就是去ESB,把全部的思考逻辑包括路由、消息解析等放到服务内部 (Smart endpoints) ,去掉一个大一统的ESB,服务间轻(dumb pipes)通讯,是比SOA更完全的拆分。
5、怎么具体实践微服务
一、客户端如何访问这些服务?
原来的 Monolithic 方式开发,全部的服务都是本地的,UI能够直接调用,如今按功能拆分红独立的服务,跑在独立的通常都在独立的虚拟机上的java进程了。客户端UI如何访问他的?后台有N个服务,前台就须要记住管理N个服务,一个服务下线/更新/升级,前台就要从新部署,这明显不符合咱们拆分的理念,特别当前台是移动应用的时候,一般业务变化的节奏更快。另外,N个小服务的调用也是一个不小的网络开销,还有通常微服务在系统内部,一般是无状态的,用户登陆信息和权限管理最好有一个统一的地方维护管理。
因此,通常在后台N个服务和UI之间通常会一个代理或者叫API Gateway,他的做用包括 :
个人理解其实这个API Gateway能够有不少广义的实现办法,能够是一个软硬一体的盒子,也能够是一个简单的MVC框架,甚至是一个Node.js的服务端。他们最重要的做 用是为前台(一般是移动应用)提供后台服务的聚合,提供一个统一的服务出口,解除他们之间的耦合,不过API Gateway也有可能成为单点故障点或者性能的瓶颈。
通常用过Taobao Open Platform的就能很容易的体会,TAO就是这个API Gateway。
二、服务之间如何通讯?
由于全部的微服务都是独立的Java进程跑在独立的虚拟机上,因此服务间的通讯就是IPC(inter process communication),已经有不少成熟的方案。如今基本最通用的有两种方式。这几种方式,展开来说均可以写本书,并且你们通常都比较熟悉细节了, 就不展开讲了。
同步调用
REST(JAX-RS,Spring Boot)
RPC(Thrift, Dubbo)
异步消息调用(Kafka, Notify, MetaQ)
通常同步调用比较简单,一致性强,可是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。RESTful和RPC的比较也是一个颇有意思的话题。通常REST基于HTTP,更容易实现,更容易被接受,服务端实现技术也更灵活些,各个语言都能支持,同时能跨客户端,对客户端没有特殊的要求,只要封装了HTTP的SDK就能调用,因此相对使用的广一些。RPC也有本身的优势,传输协议更高效,安全更可控,特别在一个公司内部,若是有统一的开发柜面和统一的服务框架时,他的开发效率优点更明显些。
而异步消息的方式在分布式系统中有特别普遍的应用,他既能下降调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能保证调用方的服务体验,继续干本身该干的活,不至于被后台性能拖慢。不过须要付出的代价是一致性的减弱,须要接受数据最终一致性;还有就是后台服务通常要实现幂等性,由于消息发送出于性能的考虑通常会有重复 (保证消息的被收到且仅收到一次对性能是很大的考验); 最后就是必须引入一个独立的broker,若是公司内部没有技术积累,对broker分布式管理也是一个很大的挑战。
三、这么多服务,怎么找?
在微服务架构中,通常每个服务都是有多个拷贝,来作负载均衡。一个服务随时可能下线,也可能应对临时访问压力增长新的服务节点。服务之间如何相互感知?服务如何管理?这就是服务发现的问题了。通常有两类作法,也各有优缺点。基本都是经过zookeeper等相似技术作服务注册信息的分布式管理、当服务上线时,服务提供者将本身的服务信息注册到ZK,并经过心跳维持长连接,实时更新连接信息。服务调用者经过ZK寻址,根据可定制算法,找到一个服务,还能够将服务信息缓存在本地以提升性能。当服务下线时,ZK会通知给服务客户端。
客户端作:优势是架构简单,扩展灵活,只对服务注册器依赖。缺点是客户端要维护全部调用服务的地址,有技术难度,通常大公司都有成熟的内部框架支持,好比Dubbo。
服务端作:优势是简单,全部服务对于前台调用方透明,通常在小公司在云服务上部署的应用采用的比较多。
四、服务挂了怎么办?
前面提到,Monolithic方式开发一个很大的风险是,把全部鸡蛋放在一个篮子里,一荣俱荣,一损俱损。而分布式最大的特性就是网络是不可靠 的。经过微服务拆分能下降这个风险,不过若是没有特别的保障,结局确定是噩梦。咱们刚遇到一个线上故障就是一个很不起眼的SQL计数功能,在访问量上升 时,致使数据库load彪高,影响了所在应用的性能,从而影响全部调用这个应用服务的前台应用。
因此当咱们的系统是由一系列的服务调用链组成的时候,咱们 必须确保任一环节出问题都不至于影响总体链路。相应的手段有不少:
6、微服务的优缺点
优势:
缺点:
对于打的互联网公司,微服务架构是血液,是习惯,没家公司都有本身的套路和架构,细节有不一样,可是核心理念是通的。
对于通常的公司而言,实践微服务有很是大的技术挑战,因而乎才有了这么多IT供应商考虑这里的商机。微服务比较适合将来有必定的扩展复杂度,且有 很大用户增量预期的应用,说人话就是新兴的互联网公司。创业初期,不可能买大量的机器或者很贵的机器,可是又必须考虑应对成功后的巨量的用户,微服务架构 成了最好的选择。