这是一份是我在极客时间学习《微服务架构核心20讲》时作的笔记。前端
1.什么是微服务架构?
2.架构师如何权衡微服务的利弊?
3.康威法则和微服务给架构师怎样的启示
4.企业应该在何时开始考虑引入微服务
5.怎么的组织架构更适合微服务?
6.如何理解阿里巴巴提出的微服务中台战略
7.如何给出一个清晰简洁的服务分层方式?
8.微服务整体技术架构是怎样设计的
9.微服务最经典的三种服务发现机制
10.微服务 API 服务网关(一)“原理”
11.微服务 API 服务网关(二)“开源网关 Zuul”
12.跟 Netflix 学习微服务路由发现体系
13.集中式配置中心的做用和原理
14.微服务通信方式 RPC vs. REST
15.微服务架构须要考虑哪些治理环节
16.微服务监控系统分层和监控架构
17.微服务的调用链监控该如何选择
18.微服务的容错限流是如何工做的
19.Docker 容器部署技术 & 持续交付流水线
20.容器集群调度和基于容器的发布体系
Netflix - 微服务定义:Loosely coupled (松耦合), service oriented architecture (面向服务架构 - SOA) with bounded context(有界上下文或局部状态)。ios
微服务优点:数据库
微服务带来的挑战:缓存
康威法则:安全
“Organizations which design systems ... are constrained to produce designs which are copies of the communication structures of these organizations.”设计系统的组织,其产生的设计和架构,等价组织的组织架构。服务器
初期团队规模、业务量不大、系统比较简单,主要尝试业务模式能不能起来。随着业务增加、团队规模变大(从一个团队扩大到多个团队),这时候若是系统架构仍然是单块应用就会和多团队产生不匹配的状况(违反了康威法则,即单块应用架构没有反应组织架构
)就会出现矛盾、协调成本变高、交付效率变低。网络
微服务是一种解决手段,将单块应用拆分红若干个微服务(图:组织内部有 3 个团队,把单块架构拆分红 S一、S二、S3 3 个服务,每一个团队负责维护本身的服务。符合康威法则)架构
扩展:每一个架构师都应该研究下康威定律负载均衡
初期业务复杂性不高,开发的应用系统主要是验证商务模式。这个时候建议采用单块应用。不推荐微服务,由于微服务前期有基础设施要求,使得生产力变低。框架
随着应用变得成功、用户变多、系统复杂性变得愈来愈高,若是仍然使用单块应用就会违背康威法则,使得生产力会随着系统复杂性而下降,这时候就要考虑使用微服务。
考虑使用微服务的点(图中交叉点),我的经验:团队接近百人研发时应该考虑采用微服务架构。
如何选择?
不推荐方案 1:由于一开始的时候对问题领域并非很理解,很难把控怎么来拆分这个服务、划分服务边界。另外有可能花了不少精力开发一套微服务,可是这个应用并不被客户接受(应用没有被市场验证,可能会失败)
推荐: 单块优先,随着业务推动,架构师会对业务领域有愈来愈清晰的了解,这个时候若是单块应用不能知足业务发展需求了,研发效率开始降低(到了交叉点)。须要将某些功能点拆分出来,后续陆陆续续随着业务团队变大能够将其余功能点陆续拆分出来,最后变成一个微服务架构
。
横坐标: 业务价值流交付过程(研发 -> 上线 -> 运维)
纵坐标: 业务能力,不一样的业务线(业务团队)
传统企业: 团队划分是严格按照职能的(独立职能部门),当有项目来的时候会从每一个团队抽调一些人来组成交付团队,当项目完成后这些人会回到各自的职能团队。
这个团队的劣质:
基于微服务跨职能的组织模式:每一个团队跨职能既有产品专家、用户体验专家、研发、测试专家,整个造成一个端到端的闭环。这些人围绕在微服务周围进行开发、测试和交付、不会由于项目结束而解散。
DBA、运维也以产品的方式来交付平台产品(将计算、网络存储、持续交付的能力封装在一个平台内),对外提供 API 来支持不一样的业务线快速的交付、迭代。
端到端控制权: 团队内部人要负责:架构、设计、开发、评审、测试、发布、运行和支持。
团队规模:根据亚马逊的两个披萨原则 – 12我的左右(2 个披萨能搞定) 谁开发、谁就要去构建、去负责运行
微服务架构本质上是组织架构的重组 – Netflix 前架构师 Andrew
现代技术体系分四层:
阿里巴巴提出大中台(技术中台 + 业务中台),小前台战略(前端业务更小、更灵活,能根据市场的变化、业务的需求不断的演化)从而赋能业务的持续创新,产生各类业务模式、快速响应市场需求。
PaaS 是微服务基础设施层,核心业务层是公司的核心领域能力把它微服务化、抽象化沉淀下来的核心能力,这层能力依赖下一层的 PaaS 云平台、大数据及AI,同时向上支撑不一样的业务线去交付业务应用。
分红两层(不一样公司有本身的分层,有的3、四层,有的只有一层:统称服务或微服务)
方式一:服务提供商上线后会向运维申请一个域名,而后运维配置负载均衡器。当用户访问域名时会域名解析到负载均衡器,负载均衡器进而指向到后台服务器(多份)
优势:广泛的作法、比较简单;消费者接入的成本比较低 缺点:服务的配置、域名的配置都须要运维的介入;集中的LB 可能会是一个单点,若是集中式LB 挂掉会影响到整个服务没法访问;性能损失,当消费者调用后台服务时必须穿透LB ,会有性能开销。
方式二:将LB 功能移动到应用的进程内,服务提供商会自动经过注册方式注册到服务注册表,并按期发送心跳。服务消费经过客户端(带有服务发现和负载均衡功能)LB 调用后台服务,而且LB会按期同步服务注册表中的服务信息。
优势: 没有集中式的LB,性能会好,不存在单点问题
缺点: 在多语言环境中,必须为每个消费者去开发有这样一个客户端,升级成本和多语言支持成本会高些
方式三:在前面两种方式基础上作了一个折中,将LB功能以一个独立进程的方式部署在一台独立的主机上(既不是集中式LB,也不是在进程内客户端的LB),其余和方式二相似。
公司内部通常会有不少微服务:购物车、库存、订单等,这些微服务是每一个团队各自独立维护的,但咱们不但愿外部用户访问的时候知道这些细节。这时候就能够经过网关来屏蔽这些细节,让客户看到的企业内部这些服务的时候像是一个服务。
屏蔽内部细节,暴露统一接口
为何在接入网关前有一层负载均衡?是想让网关是无状态的(无状态网关好处:能够部署不少,不会有单点,即便挂了一台其余网关还在,这对整个系统的稳定性和可用性很是重要)。
网关基本功能:
对请求的身份验证、受权、限流熔断、日志监控等的处理函数称为边缘函数。
Zuul过滤器:
(过滤器上传加载机制)
(Request Context 实如今各个阶段过滤器中分享相关信息。)
Netflix 两个核心组件:
内部微服务两层逻辑划分:
1.基础服务 – Netflix称:中间层服务2.聚合服务 – Netflix 称:Edge service(边界服务)
内部服务经过内部服务注册中心 Eureka 注册、发现。
服务注册中心还能够作服务治理,例如对服务调用的安全管控。
传统的作法在配置文件中作配置,而且每一个团队有各自的作法,这种作法的隐患:
哪些须要集中配置:
配置中心能够简单的认为是一个服务器,开发、运营人员能够经过界面对配置中心进行配置,咱们的服务连到配置中心后能够实时更新配置服务器中修改的配置。
更新的方式主要有两种:
携程开源的配置中心 – Apollo
Apollo 配置中心(左侧)是一个服务器,研发或运营人员能够在服务端进行配置的修改,Apollo配置中心带有客户端(支持Java、.Net),客户端有一个缓存机制 – 配置更新后会拉取到客户端的内存缓存中,为了防止内存缓存的丢失客户端还会按期将内存缓存同步到本地文件缓存中,这样的设计可使得若是配置中心挂掉或应用程序重启后还能经过读取本地文件缓存。
服务的更新结合了配置推送 + 定时拉取,以保证高可用
微服务治理就将这些环节沉淀下来变成框架或平台的一部分;开发人员专一于业务逻辑的实现,在实现业务逻辑的过程当中不须要考虑这个外围的治理能力。
这些治理环节沉在框架里,由框架团队或平台团队来集中管控。
完善的监控体系能实时了解微服务的健康状况对整个系统的可靠性和稳定性是很是重要的。
主要分为5 个层次发监控:
5 个关键监控面:
主流监控架构:
在主机或服务进程内安装Agent,Agent负责收集机器和应用中的日志和Metrics发送到咱们的监控系统。
当服务比较大、收集的日志和Metrics量比较大时会加入队列(Kafka)。标准的日志监控栈 – ELK(Elasticsearch、Logstash、Kibana);Metrics会采用时间序列数据库(InfluxDB、Grafana呈现展现)
经过健康检查机制来按期对应用的健康进行自动化的检查,开源的工具备Nagios。
原理: 当请求进入Web容器时会生成一个Span(图中Root Span),当继续调用Service 时又会生成一个Span(Child Span),请求进来进入Service会生成一个Span,Service调用DB或其余Service时会产生Span;Web应用在调用Cache时会产生Span。
Span是调用链造成的关键,在Span会有一些信息:Trace Id、Span Id等。Root Span比较特殊会生成Span Id和Trace Id,其余的Span会生成本身的Span Id同时为了维护调用链之间的父子关系Child Span会跟踪记录Parent Id。
在跨进程中为了使调用链持续连接,会将Trace Id和Parent Id一块儿带过来。
主流开源的调用链工具对比:
熔断: 这一律念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统总体的可用性,能够暂时切断对下游服务的调用。这种牺牲局部,保全总体的措施就叫作熔断。
若是不采起熔断措施,咱们的系统会怎样呢?例子 当前系统中有A,B,C三个服务,服务A是上游,服务B是中游,服务C是下游。它们的调用链以下:
一旦下游服务 C 因某些缘由变得不可用,积压了大量请求,服务B的请求线程也随之阻塞。线程资源逐渐耗尽,使得服务B也变得不可用。紧接着,服务 A 也变为不可用,整个调用链路被拖垮。
像这种调用链路的连锁故障,叫作雪崩。
隔离: 是经过资源隔离减小风险的方式,源自货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个, 以下图所示。
软件系统的隔离推荐的方法是进行服务拆分,让每一个小业务独立运行,即使是其中一个业务宕掉,其余服务依然能够正常运行。
限流: 提早对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,再也不调用后续资源。
降级: 当服务器压力剧增的状况下,根据实际业务状况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运做或高效运做。
原理: 使用Hystrix 组件后,会将调用封装在Hystrix Command内,封装之后它就具备了熔断、限流、隔离和降级功能。请求方式能够是同步、异步或反应式的,请求过来后会作电路判断:若是电路打开即断路,会走降级流程调用降级函数。
若是电路闭合即没有熔断,而后进行线程/队列资源判断(若是资源不足,就会进入降级流程),若是前两关经过就运行调用。在调用时若是运行超时也会走降级流程。执行成功(Success)获取正确的相应结果返回调用端,失败走降级流程。
在整个调用过程当中,任何一个环节的相关信息(电路是否打开、线程是否占用、运行是否超时)都会以Metrics形式反馈给计算电路健康组件(Calculate Circuit Health)进而反馈给电路判断(指导下一次关闭/打开电路的判断依据)
容器技术的优势:
流程: 开发人员提交代码到Git,经过Jenkins 完成构建、单元测试和打镜像并上传到镜像中心(Docker registry)。发布到测试环境经QA测试后升级到UAT环境,通过UAT测试后升级到生产环境(生产环境可能会经过灰度发布、蓝绿部署发布到生产环境)
蓝绿部署 + 灰度发布(经过软路由切换流量)保证服务的稳定性:
「极客阅读 」汇聚了国内外最优质的技术博客、产品动态、公众号文章。开发者能够在极客阅读一站式的阅读到来自互联网技术大咖的文章。
「极客阅读 」官网:geeker-read.com