go使用grpc实现异步_(python、go)基于ETCD的gRPC分布式服务器实现详解

本文介绍了如何使用gRPC框架结合ETCD实现分布式服务器,包括服务器端和客户端的核心代码实现,以及Python和Go两种语言的客户端实现思路。文章提供了完整的代码示例,并展示了多服务器负载均衡的演示结果。

6433fc51b5a2105527b4707d51a35261.png
作者:Zarten 知乎专栏:框架工具篇详解 知乎ID: Zarten 简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 !

1-概述

gRPC框架是一个性能很好的rpc框架,但框架中没有实现分布式服务器负载均衡的方法,只是给出实现方案,需要我们自己实现。官方推荐是客户端负载均衡的方案,也就是由客户端主动选择路由,这样的好处是不用给代理服务器造成压力。

分布式场景下一般采用etcd、consul、zookeeper等分布式系统,这里采用etcd,etcd是go语言实现,在github可看到开源的全部实现代码。

目前网上都是go语言写的关于基于etcd的grpc分布式服务器的实现,几乎没有python版的grpc服务器实现,于是本人就写了一个python版的服务器和不同客户端(python、go)版的全套实现方案。

注:全部完整代码已上传至github:Zartenc/grpc_etcd_ms_py

2-实现思想

2-1-服务器端实现思想

服务器端思想主旨是:每个gRPC服务器启动(上线)都会在etcd的key中注册自己在本机中对外暴露的ip-port,一旦gRPC服务停止(下线、意外挂掉、租约到期等)会在etcd中注销掉自己的信息。

2-2-客户端实现思想

客户端思想主旨是:只需连接到etcd服务器产生一个etcdClient对象,长期维护这个对象即可,通过这个对象的负载均衡策略可获取众多gRPC服务器中的其中一个进行连接。在这个etcdClient对象内部会对etcd的key添加一个监视(watch)并维护一个可用gRPC服务器信息的集合。

3-具体实现核心代码

前提已部署并启动etcd服务器,若没部署请参考这里。

3-1-服务器端实现核心代码

服务器端采用python编写。

由于采用etcd分布式框架,这里首先实现一个etcd客户端的类EtcdClient,类方法有:

  • get_values_by_key():通过etcd的key获取服务器信息。
  • put_values_by_key():添加服务器信息到etcd的key中。
class EtcdClient(etcd3.Etcd3Client):
    def get_values_by_key(self, key, **kwargs):
        values, _ = self.get(key, **kwargs)
        values_list = []
        if values is not None:
            try:
                values_list = json.loads(values.decode('utf-8'))
                if not isinstance(values_list, list):
                    raise TypeError()
            except:
                raise Exception()

        return values_list

    def put_values_by_key(self, key, values):
        if not isinstance(values, list):
            raise Exception()
        self.put(key, json.dumps(values))

再实现一个此服务器对etcd操作的类EtcdHandleServ,类方法有:

register_service():注册本机信息到etcd的key中。

logout_service:从etcd的key中注销本机信息。

class EtcdHandleServ():
    def __init__(self, service_port, etcd_ip, etcd_port, etcd_prefix):
        self.etcd_ip = etcd_ip
        self.etcd_port = etcd_port
        self.etcd_prefix = etcd_prefix
        # service_ip = ge
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值