Go - Micro微服务框架实践 - 容错(十一)

容错

容错(fault tolerance)

分布式系统世界中,随时随地都可能会出现异常。Micro在定位这个问题时,对容错作出了许多最好的尝试。这篇文档介绍一些可配置的容错方式。

心跳(Heartbeating)

心跳是服务发现中,刷新服务的注册状态的机制。

原理

服务通过服务发现功能,在启动时进行服务注册,关闭时进行服务卸载。有时候这些服务可能会异常挂掉,进程可能会被杀掉,可能遇到短暂的网络问题。这种情况下,节点会在服务发现中被干掉。 理想状态是服务会被自动移除。

解决方案

为了解决这个问题,Micro注册机制支持通过TTL(Time-To-Live)和间隔时间注册两种方式。TTL指定一次注册在注册中心的有效期,过期后便删除,而间隔时间注册则是定时向注册中心重新注册以保证服务仍在线。

这两个方式在go-micro中都可以选项或micro命令flag的方式指定。

使用方法

如果是命令行的方式,则可以方便使用内置的flag设置ttl值、间隔时间

micro --register_ttl=30 --register_interval=15 api

刚这个例子我们设置了30秒的TTL生存期,并设置了每15秒一次的重注册。

而对于使用go-micro机制,可以以在构造服务时把选项传进去,比如time.Duration*n

service := micro.NewService(
        micro.Name("com.example.srv.foo"),
        micro.RegisterTTL(time.Second*30),
        micro.RegisterInterval(time.Second*15),
)

负载均衡

负载均衡是一种将请求摊开负载或者维持高可用的方式。

原理

对于一些单线程的应用来说,高可用和弹性能力非常有限。当应用因某种原因宕掉这宾便不能再提供服务。当有足够多的请求负载到这台服务上时,那它可能会响应得很慢或者不会响应全部请求。而把所有请求分发来多台应用的副本能很好解决这个问题。

解决方案

微服务客户端通过选择器负载均衡,选择器可以把请求分到任意多的服务节点上。服务启动后,它使用唯一的地址与id组合向注册中心注册成服务节点。创建请求时,micro客户端会通过选择器决定向哪一个节点发送请求。选择器在服务注册信息中找到服务的节点,然后用负载均衡策略选择一个节点把请求发送出去,比如随机哈希、轮询。

使用方式

客户端负载均衡内置在go-micro客户端中,这是自动完成的。

重试

重试是指请求不成功时再次请求的方法。

原理

请求可能会因为某种原因失败,网络、负载、宕机等等,理想情况是,在发生这些事后,我们仍能能把请求重新发到程序的另一个节点并收到成功的响应。

解决方案

micro客户端内置有重试机制。选择器(上面有提到)会返回一个叫Next的函数,这个函数在执行时会基于负载均衡策略从服务列表中返回一个节点。Next函数可以执行多次,基于负载均衡策略返回新的节点。如果重试有设置,在请求失败时,Next函数便会执行并把请求发向另一个新的节点。

使用方式

重置可以通过命令行标记或代码选项在客户端传入。默认值是1,也即是一次请求尝试一回。

通过命令行flag传入

micro --client_retries=3

设置选项

client.Init(
    client.Retries(3),
)

服务发现缓存

服务发现缓存是指在客户端缓存服务发现的信息。

原理

服务发现是微服务的核心,但是如果架构设计不对,它也会变成故障节点。每种发现系统都有它自己的弹性与高可用属性。当发生发现机制无法使用的事故,这会导致剩下的系统都不可用,那么服务也都无法判断如何解析服务名与地址。而如果每次请求都要到中心服务节点查找对于服务发现也是个瓶颈。

解决方案

客户端进行缓存可以消除服务发现作为中心的性能瓶颈及故障节点失效的问题。Micro包含有选择器(客户端负载均衡器),它在缓存中维护了服务发现的信息。如果缓存没有找到,选择器会到注册服务中心去查找并把结果缓存起来。缓存也会设置TTL定期调整,以确保过期的数据不再生效。

使用方式

selector缓存可以使用命令行参数或创建服务时指定

命令行的方式

micro --selector=cache api

如果要调用Init方法,Go-micro服务也支持使用同样的命令行flag来传递该参数:

import (
    "github.com/micro/go-micro/client"
    "github.com/micro/go-micro/selector/cache"
)

service := micro.NewService(
    micro.Name("com.example.srv.foo"),
)

service.Client().Init(cache.NewSelector())

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容