python3连接etcd3 grpc报错解决方法

本例环境如下:

python版本: 3.7.1

etcd3版本: 0.12.0

报错信息:
state = <grpc._channel._RPCState object at 0x7f51082a8b70>
call = <grpc._cython.cygrpc.SegregatedCall object at 0x7f51080edc08>
with_call = False, deadline = None

    def _end_unary_response_blocking(state, call, with_call, deadline):
        if state.code is grpc.StatusCode.OK:
            if with_call:
                rendezvous = _MultiThreadedRendezvous(state, call, None, deadline)
                return state.response, rendezvous
            else:
                return state.response
        else:
>           raise _InactiveRpcError(state)
E           grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
E           	status = StatusCode.UNAUTHENTICATED
E           	details = "Established channel does not have a sufficient security level to transfer call credential."
E           	debug_error_string = "{"created":"@1653981702.899194914","description":"Error received from peer 127.0.0.1:2379","file":"src/core/lib/surface/call.cc","file_line":952,"grpc_message":"Established channel does not have a sufficient security level to transfer call credential.","grpc_status":16}"
E           >

/root/.pyenv/versions/3.7.1/lib/python3.7/site-packages/grpc/_channel.py:849: _InactiveRpcError

本例连接异常是因为grpcio版本太高,grpcio==1.45.0

降级后解决

pip uninstall grpcio

pip install grpcio==1.19.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 微服务可以使用 etcd_grpc 来进行服务发现和配置管理。etcd 是一个分布式键值存储系统,它可以用于共享配置和服务发现。而 etcd_grpc 是一个 Python 库,提供了对 etcdgRPC 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、付费专栏及课程。

余额充值