文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

Mangos是一个纯Go实现的可伸缩协议,在这个博客上,有一篇很好的介绍。

此外,这篇博客带给我一些灵感,用一个简单的方式实现服务发现。服务发现的通用解决方案是使用某种分布式系统来存储变更,这个问题的常用解决方案有Zookeeperetcdconsuleureka.

这些通常都不错,但是有时候你并不需要这样的解决方案来解决一个简单的问题。你很可能并没有那么多服务器并且使用一个库就足以解决这个问题。

第 1 段(可获 1.25 积分)

因此我发布了一个基于Mangos的小开发库来做服务发现, 我叫它:

它使用一个套接字发出心跳检查。Survey

从服务器的心跳你可以感知在线的客户端,并且每当客户端下线,你将会在下一个心跳周期感知到。

但是你需要以某种方式通知相关各方有新客户端连接或是断开。因此我使用mangos发布/订阅套接字来发布更改。

Pub/Sub

你可以让客户端了解其他对等体中的更改,或者你可以拥有仅接收更改的纯订阅者。

第 2 段(可获 1.39 积分)

用例

一个比较好的用例是,在groupcache中更新对等端

我们可以有一个非常轻量服务器来用做服务发现:


urlServer := "tcp://10.0.0.100:40007"
urlPubSub := "tcp://10.0.0.100:50007"

// on the server
server, err := gopherdiscovery.Server(urlServer, urlPubSub, opts)
server.Wait()

并且对于每一个客户,使用groupcache结合gopherdiscovery来更新正在执行高速缓存的对等端。

var peers chan []string

urlServer := "tcp://10.0.0.100:40007"
urlPubSub := "tcp://10.0.0.100:50007"
me := "http://10.0.0.1:8080"

// any of the peers
poolGroupCache := groupcache.NewHTTPPool(me)

client, err := gopherdiscovery.ClientWithSub(urlServer, urlPubSub, me)

peers, err = client.Peers() 
for nodes := ranges peers {
    // every time there is a change in the peers -> Set in groupcache
    poolGroupCache.Set(nodes...)    
}

另一个例子是,从一个负载均衡器中添加和移除代理。

如果你对它感兴趣,请查看源码和文档,并欢迎提供任何反馈! 

第 3 段(可获 0.89 积分)

文章评论