grpc应用于微服务的分析,基于python

grpc应用于微服务的分析

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
gRPC 基于 HTTP/2 标准设计,带来诸如 双向流、流控、头部压缩 、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型

gRPC 允许你定义四类服务方法:
  • 单项 RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。
rpc SayHello ( HelloRequest ) returns ( HelloResponse ){}
  • 服务端流式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。
rpc LotsOfReplies ( HelloRequest ) returns ( stream HelloResponse ){}
  • 客户端流式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
rpc LotsOfGreetings ( stream HelloRequest ) returns ( HelloResponse ) {}
  • 双向流式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写,例如:服务端可以在写应答前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者是读写相结合的其他方式。每个数据流里消息的顺序会被保持。
rpc BidiHello ( stream HelloRequest ) returns ( stream HelloResponse ){}

兼容restapi方法,如果需要兼容restapi可使用 grpc-gateway ,可生成swagger文件
需要go语言支持

服务发现和负载平衡
以上,grpc提供了数据传递的功能,但要把他微服务化还要支持服务发现和负载平衡,grpc并未实现这一块,因此要应用的话还需考虑此部分,grpc提供了设计思想, 并在不同语言的gRPC代码API中已提供了命名解析和负载均衡接口供扩展(在python中并未找到有这部分)

方法一:运行在docker下,由docker来负责 服务发现和负载平衡,公司目前似乎短时间无法做到
方法二:自行实现,服务发现在用etcd,zookeeper等,推荐使用etcd.
  ETCD vs ZK
选取ZK作为典型代表与ETCD进行比较,而不考虑[Consul]项目作为比较对象,原因为Consul的可靠性和稳定性还需要时间来验证(项目发起方自身服务并未使用Consul, 自己都不用)。
  • 一致性协议: ETCD使用[Raft]协议, ZK使用ZAB(类PAXOS协议),前者容易理解,方便工程实现;
  • 运维方面:ETCD方便运维,ZK难以运维;
  • 项目活跃度:ETCD社区与开发活跃,ZK已经快死了;
  • API:ETCD提供HTTP+JSON, gRPC接口,跨平台跨语言,ZK需要使用其客户端;
  • 访问安全方面:ETCD支持HTTPS访问,ZK在这方面缺失;


综上,grpc对go语言支持度更好,使用ptyhon,grpc只做到rpc的数据传递,其它方面大部份还要自行再架构

参考: http://www.jianshu.com/p/9805545db4ad 再谈Docker-微服务的场景化应用
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 微服务可以使用 etcd_grpc 来进行服务发现和配置管理。etcd 是一个分布式键值存储系统,它可以用于共享配置和服务发现。而 etcd_grpc 是一个 Python 库,提供了对 etcd 的 gRPC API 的访问。 使用 etcd_grpc 可以方便地实现微服务的注册、发现和配置管理。服务提供者可以将自己的服务注册到 etcd 中,而服务消费者可以通过 etcd 查询服务提供者的信息,从而调用服务。同时,etcd 还可以用于存储配置信息,服务提供者可以将自己的配置信息存储到 etcd 中,服务消费者可以从 etcd 中获取配置信息。 在实际用中,可以使用 Pythongrpc 模块来实现 gRPC 通信,使用 etcd_grpc 来进行服务发现和配置管理。具体步骤如下: 1. 安装依赖库: ``` pip install grpcio grpcio-tools etcd3 ``` 2. 定义 proto 文件: ``` syntax = "proto3"; package example; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ``` 3. 使用 protoc 编译 proto 文件: ``` python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. example.proto ``` 4. 实现服务提供者: ```python import grpc import example_pb2 import example_pb2_grpc import etcd3 class Greeter(example_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return example_pb2.HelloReply(message='Hello, %s!' % request.name) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) example_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) server.add_insecure_port('[::]:50051') server.start() print('Server started') client = etcd3.client() client.put('/services/greeter/1.0.0', 'localhost:50051') server.wait_for_termination() if __name__ == '__main__': serve() ``` 5. 实现服务消费者: ```python import grpc import example_pb2 import example_pb2_grpc import etcd3 def get_greeter_stub(): client = etcd3.client() service_name = 'greeter' service_version = '1.0.0' service_path = '/services/{}/{}/'.format(service_name, service_version) service_list = client.get_prefix(service_path) if not service_list: return None service_address = service_list[0][0].decode('utf-8') channel = grpc.insecure_channel(service_address) stub = example_pb2_grpc.GreeterStub(channel) return stub if __name__ == '__main__': greeter_stub = get_greeter_stub() if greeter_stub: response = greeter_stub.SayHello(example_pb2.HelloRequest(name='world')) print(response.message) else: print('No service available') ``` 在服务提供者中,我们使用 etcd3 将自己的服务注册到 etcd 中。在服务消费者中,我们使用 etcd3 查询服务提供者的信息,并使用 grpc.insecure_channel 连接服务提供者。 以上是使用 etcd_grpc 用于微服务的基本分析和示例。etcd_grpc 还可以用于实现服务的负载均衡、健康检查等功能,可以根据具体需求进行配置和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值