规模化微服务——《微服务设计》读书笔记

改变思维的角度:故障无处不在

      当微服务规模化后,故障是无可避免的,以往我们总是想尽力避免故障的发生,而当故障实际发生时,我们往往束手无策。我们花了很多时间在流程设计和应用设计的层面上来阻止故障的发生,但实际上很少花费时间思考如何第一时间从故障中恢复过来。

      一些公司喜欢组织活动,活动当天系统会被关掉以模拟故障发生,然后不同团队演练如何应对这种情况。这些项目中最著名的是混乱猴子(Chaos Monkey),在一天的特定时间随机停掉服务器,这促使开发人员在构建系统时不得不为它做好准备。猴子军队可以在系统中注入网络延迟,也可以随机关闭整个可用区,这可以让你的系统得到终极验证。SimianArmy就是这样的一个项目。

      通过让软件拥抱和引发故障,并构建系统来应对。

 

了解什么指标是我们必须关注的

      企业Wiki一个月发生故障两天,我们认为是可以接受的,电商网站一天停一个小时也是不可接受的。我们需要正确地理解这些需求,以便采取合适的技术。

      我们建议有一些默认的指标必须予以关注。

      1.响应时间/延迟

      鉴于网络的性质,你经常会遇到异常值,所以将监控的响应目标设置成一个百分比是合理的。

      举例:我期望这个网站,当每秒处理200个并发连接时,90%的响应时间在2秒以内。

      2.可用性

      评价可用性,我们可以从历史报告来分析,以跟我们的期望值相对比。

      3.数据持久性

      用户的登录会话只需要保持一年,金融交易记录则需要保存很多年。

 

一.从体验上来解决:功能降级

      当购物车功能不可用时,你可以隐藏掉这个图标,并提示“马上”,或者变成一个可下单的电话号码。

      对于每个使用多个微服务的面向用户的界面,或每个依赖多个下游合作者的微服务来说,你都需要问自己“如果这个微服务宕掉会发生什么”,然后你就知道该如何做了。

 

二.从请求/响应上来解决

      1.超时机制

      给所有的跨进程调用设置超时,当发生超时时记录到日志中,并相应地调他们。

      2.断路器

      当对下游的请求发生一定数量的失败后,断路器会打开,接下来,所有的请求在断路器打开的情况下会快速地失败,一段时间后,客户端发送一些请求查看下游服务是否已经恢复,如果它得到了正常的响应,将重置断路器。

使用断路器,我们可以在请求失败后把这些请求存起来,然后稍后重试它们,也可以直接使用功能降级。Hystrix就是一个基于JVM的开源断路器。

      3.舱壁

这是一种把自己从故障中隔离开的方式,如果我们使用下游多个服务,而其中一个服务占用了过多的连接池,由于是共用连接池,这势必会对其他的服务调用造成影响,舱壁的处理办法,即是为每个下游服务建立一个单独的连接池,我们当然也可以跟断路器联合起来使用。

      在很多方面,舱壁是三个模式中最重要的,超时和断路器能够帮助你在资源受限时释放它们,但舱壁可以在第一时间确保它们不成为限制,它可以拒绝请求以避免资源达到饱和。

 

三.从服务依赖性上解决:隔离

      一个服务依赖于另一个服务,另一个服务的健康将能影响其正常工作的能力,如果我们使用的集成技术允许下游服务器离线,上游服务便不太可能受到计划内或计划外宕机的影响。

      Jekins的master/slave即是这样的解决思路。

 

四.从处理结果上解决:幂等

      对幂等操作而言,多次执行所产生的影响均与一次执行的同,如果操作是幂等的,我们可以对其重复多闪调用,而不必担任会有不利影响。当我们不确定否被执行,想要重新处理消息,从而从错误中恢复时,幂等会非常有用。

 

五.从应用上解决:扩展应用

      更强大的主机、一台主机一个微服务、关键业务弹性部署、多云服务数据商备份、异地灾备、负载均衡、重构系统、作业队列。

 

六.从数据库上解决:扩展数据库

      方法1:主从复制

      当主数据库出现故障,可以马上启动备份数据库,并提升至主数据库。

      方法2:读写分离——扩展读操作

      读操作使用的数据库和写操作使用的数据库分开,但这会造成数据暂时不一致的情况。

      方法3:读写分离——扩展写操作

      可以使用分片的方式来扩展写操作,当你有一块数据要写入时,对数据的关键字应用一个哈希函数,并基于这个函数的结果将数据发送到哪个分片。

      但分片扩展会导致在查询上复杂起来,如果要查询所有年满18岁的顾客,那么要查询所有分片,然后在内存中拼起来;或者有一个替代的读数据训包含所有的数据集。

      分片扩展的另一个问题是,如果想添加新的数据库节点,我们需要大量的宕机时间然后重新分配数据

      方法4:CQRS——命令查询职责分离

      在传统的系统中,数据的修改和查询使用的是同一个系统,使用CQRS后,系统的一部分负责获取修改状态的请求命令并处理它,而另一部分则负责处理查询。

 

七.从缓存上解决:缓存

      1.客户端、代理服务器和服务器端缓存

      使用客户端缓存,客户端会缓存存储的结果,由客户端决定何时获取最新副本。我们可以通过服务来告诉客户端应该更新缓存了。

      代理服务器缓存,将一个代理服务放在客户端和服务端之间,反向代码或CDN就是这样的例子。

      服务器缓存,由服务器端处理缓存,Redis、Memcache、内存缓存就是这样的系统。

      2.HTTP缓存

      标准的静态网站,像CSS或图片,很适合用HTTP中的cache-control和Expires指令,另外还可以使用HTTP的ETag来标示资源是否已改变,如果我更新了客户记录,      虽然访问资源的URI相同,但值已经不同,所以我会改变ETag。

      3.使用写缓存

      你可以先写入本地缓存,并在之后的某个时刻将缓存中的数据写入下游,当你有爆发式的写操作时,或同样的数据可能被写入多次时,或下游服务不可用时,这种方式都是很有用的。

      4.为弹性使用缓存

      我们可以缓存一个时间点的数据,在故障发生时提供这个时间点的数据,虽然可能不完全正确,最起码可以用。

      5.隐藏源服务

      有可能我们系统的80%请求都是通过缓存,那么缓存一旦失败,请求都将进入源服务,源服务从来没有处理过这么多请求,这将是灾难性的,我们可以阻塞请求,并在后台异步重建缓存。

      6.避免过多地使用缓存

      缓存越多,就越难评估数据的新鲜程度。

      7.防止缓存中毒

      你可能在系统中将HTTP缓存头的过期时间设置为Expires:Never,这样除非用户手工清除他们(也许CDN也会缓存这些内容),否则永远不会失效,这时我们唯一的选择就是:改变这些网页的URL,以便能够重新获取它们。

 

使用自动伸缩

      现在的云服务提供商允许你制定自动伸缩服务的策略,通过响应式伸缩或者预测式伸缩帮助你在高峰(有可能是秒杀,有可能是突发式新闻,也有可能是因为周末)到来的时候提供服务。

 

CAP理论

      Eric Brewer的CAP理论告诉我们,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance),最多只能同时保证三个中的两个。

 

 

      牺牲一致性:

      我们只需要数据保持最终一致就可以了,因为我们需要分区来保证数据的安全性,同时保证系统的可用性。博客园我更新博客时,每个月份的博客统计数不会马上更新就是这样。

      牺牲可用性:

      像12306这样的网站每天晚上维护就是牺牲了可用性。

      牺牲容忍性:

      既然是分布式系统,这种情况是肯定不存在的。

 

服务发现、注册与编排

     方法1:DNS

      DNS让我们将一个名称与一个或多个机器的IP地址相关联,例如我们可决定在accounts.hello.com上发现账户服务,这个域名会关联到运行该服务的主机的IP上或负载均衡器上。

      DNS的好处在于它是,但不好的地方在于更新它不是那么容易,而且对于一个新的节点,DNS不能“发现”这个节点。

      方法2:Zookeeper

      它支持配置管理、服务间的数据同步、leader选举、消息队列和命名服务。它的核心是提供了一个用于存储信息的分层命名空间,客户端可以在此层次结构中,插入新的节点,更改或查询它们。

      方法3:Consul

      它也支持配置管理和服务发现,但它比Zookeeper更进一步,为这些关键使用场景提供了更多支持,如它为服务发现提供了一个HTTP接口,另外它提供了现成的DNS服务器。

      Consul还内置了一些功能,如对节点执行健康检查的能力。

      Consul从注册服务、查询键/值存储到插入健康检查,都使用的是RESTful HTTP接口,这使集成不同技术栈变得简单。

      方法4:Eureka

      它提供了基本的负载均衡功能,它可以支持服务实例的基本轮询调度查找,它提供了一个基于REST的接口,因此你可以编写自己的客户端。

 

文档服务

      微服务非常多,暴露的接口更多,我们希望知道关于这些接口的说明,理想情况下我们会确保文档总是和最新微服务的API文档同步,并当大家需要知道服务在哪里,能够很容易地看到这个文档。

      1.Swagger

      Swagger让你描述API,产生一个很友好的Web用户界面,使你可以查看文档并通过Web浏览器与API交互,还可以直接执行请求。

      2.HAL和HAL浏览器

      它是用媒体来生成我们的文档。

 

参考

      《微服务设计》(Sam Newman 著 / 崔力强 张骏 译)

相关文章: 

  • 微服务的概念——《微服务设计》读书笔记

  • 微服务架构师的职责——《微服务设计读书笔记》

  • 建模:确定服务的边界——《微服务设计》读书笔记

  • 微服务集成——《微服务设计》读书笔记

  • 服务的协作:服务间的消息传递——《微服务设计》读书笔记

  • 拆分:分解单块系统——《微服务设计》读书笔记

  • 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

  • 测试——《微服务设计》读书笔记

  • 监控——《微服务设计》读书笔记

  • 安全——《微服务设计》读书笔记

  • 康威定律和系统设计——《微服务设计》读书笔记

原文地址:http://www.cnblogs.com/gudi/p/6686277.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS中的基本和引用类型传递的比较

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">/** 基本数据类型* String Number Boolean Null Undefined* * 引用数据类型* Object* * JS中的变量都是保…

如何在 ASP.NET Core 中发送邮件

前言 我们知道目前 .NET Core 还不支持 SMTP 协议&#xff0c;当我么在使用到发送邮件功能的时候&#xff0c;需要借助于一些第三方组件来达到目的&#xff0c;今天给大家介绍两款开源的邮件发送组件&#xff0c;它们分别是 MailKit 和 FluentEmail &#xff0c; 下面我对它们…

一文搞懂 Java 线程中断

转载自 一文搞懂 Java 线程中断 在之前的一文《如何"优雅"地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程&#xff0c;那么还有别的可以终止线程的方法吗&#xff1f;答案是肯定的&#xff0c;它就是我们今天要分享的——线程中断。 下面…

.NET的一点历史故事:招兵买马和聚义山林

曾几何时&#xff0c;Java 的兴起得益于众多大公司的涌入&#xff0c;Sun、IBM、SGI、网景、甲骨文、Borland 都在第一时间关注并投入大量资源来推动它的发展。比较典型的例子就是 IBM 做了自己的 Java SDK&#xff0c;并且做出了 SWT 界面框架&#xff0c;后面又开源了自己的 …

教你用 3 台机器搞定一个 Redis 高可用架构

转载自 教你用 3 台机器搞定一个 Redis 高可用架构 基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了。 我们经常在业务中用其存储用户登陆态&#xff08;Session 存储&#xff09;&#xff0c;加速一些热数据的查询&#xff08;相比较 MySQL…

调用函数的返回值和函数对象本身

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>function fun3() {function fun4() {alert("我是fun4");}//将fun4函数对象…

使用java解析XML文件的步骤

以前的时候&#xff0c;也解析过&#xff0c;今天又拿出来解析就让忘记怎么解析了&#xff0c;后来在网上查还有自己想&#xff0c;终于解析出来了&#xff0c;下面就是原XML文件&#xff1a; accp.xml <?xml version"1.0" encoding"UTF-8"?> <…

世界上最大的搜索引擎公司 Google 宣布与 Elastic 达成战略合作协议

和大家的直觉反应比较不同&#xff0c;但谷歌&#xff0c;这家业界首屈一指的互联网搜索公司&#xff0c;要向她的云平台里加入新的搜索服务了。谷歌云平台一直向企业客户出租计算、存储和网络等服务&#xff0c;现在谷歌则要与Elastic公司合作&#xff0c;为谷歌云提供新的搜索…

使用java读取文件并输出

通过Reader读取文件中的内容&#xff1a; 下面是文件&#xff1a; test.txt: 1、看着街上的人群&#xff0c;各个都把自己捂得严严实实的&#xff0c;好似一个个奇怪的布包裹。窗外的天&#xff0c;是灰蒙蒙的一片&#xff0c;灰色的霾把所有的物体都笼罩了起来。2、它来时&am…

Akka系列---什么是Actor

本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间是可以相互沟通,所有的沟通都是通过Message 比如说一个呼叫中心,数以百万计的客户可能会呼叫一个1-800的…

架构师的工作都干些什么?!想做架构师必看

转载自 架构师的工作都干些什么&#xff1f;&#xff01;想做架构师必看 之前有网友说想看架构师升级的文章&#xff0c;所以写了本文。先给本文中架构师做个定义&#xff1a;第一&#xff0c;能力上达到&#xff08;似乎是废话&#xff09;&#xff0c;第二&#xff0c;公司…

使用java将字符串写入到指定的文件中

指定的字符串&#xff1a; 白天走在街道上&#xff0c;伸手不见五指&#xff0c;周围的建筑全被雾笼罩了&#xff0c;在家里通过窗户往外望去&#xff0c;外面就像仙境一般&#xff0c;雾把所有的东西都淹没了&#xff0c;能看到的&#xff0c;只有白色的雾。&#xff01;文件…

Mybatis入门 使用XML

1、项目结构 2、详细代码 数据库&#xff1a; 1、创建实体类bean package com.itheima.domain;import java.io.Serializable; import java.util.Date;/*** Created by Administrator on 2019/10/11.*/ public class User implements Serializable {private Integer id;priv…

.NET的一点历史故事:擦肩而过的机遇

Sun 公司曾经借由 SunOS/Solaris 这个 UNIX 操作系统&#xff0c;SPARC 硬件平台和 Java 语言建立了一个商业帝国。Sun 工作站应该是很多资深业界大佬们偶尔还会拿来回忆的一个经典产品。不过时间进入二十一世纪第一个十年的中段&#xff0c;它已经在竞争对手的轮番进攻下显出了…

Java 中的 String 真的是不可变的吗

转载自 Java 中的 String 真的是不可变的吗 我们都知道 Java 中的 String 类的设计是不可变的&#xff0c;来看下 String 类的源码。 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for char…

Mybatis入门 使用注解

使用XML方式地址为Mybatis入门 使用XML 1、目录结构 2、需要修改的地方 1、mybatis的配置文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.…

浅析如何在Nancy中生成API文档

前言 前后端分离&#xff0c;或许是现如今最为流行开发方式&#xff0c;包括UWP、Android和IOS这样的手机客户端都是需要调用后台的API来进行数据的交互。 但是这样对前端开发和APP开发就会面临这样一个问题&#xff1a;如何知道每个API做什么&#xff1f; 可能&#xff0c;…

一文告诉你如何导出 Git 变更文件

转载自 一文告诉你如何导出 Git 变更文件 有时候我们想导出某次版本提交时有哪些变更的文件&#xff0c;在 svn 中有一个 export 功能&#xff0c;很方便&#xff0c;如下图所示。 在 Git 中我也找到了以下两种方法。 方法1 使用 git 自带命令 git archive, 语法如下。 g…

Entity Framework Core的贴心:优雅处理带默认值的数据库字段

对于用于保存记录添加时间的数据库日期字段&#xff0c;我们通常会设置一个 GETDATE() 的默认值&#xff0c;而不是在应用程序的代码中获取当前时间进行保存&#xff0c;这样可以避免由于web服务器时钟不同步引起的时间偏差。 Entity Framework Core 在设计时贴心地考虑到这个…

JS中使用工厂模式创建对象

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>function createPerson(name , age ,gender){//创建一个新的对象var obj new Object…