IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> python调用rpc代码维护方案探讨 -> 正文阅读

[网络协议]python调用rpc代码维护方案探讨

user重构,我们准备增加一个代码仓库rpc_client,维护python调用rpc服务的代码。

?1,现状

1.1,微服务架构

我们现在有多个python旧服务项目(user_server/course_server/cms_server_v2等等),以后会有多个golang的rpc服务(passport_i/user_i/business_i等)。?

1.2,封装rpc

如上图每一个旧服务的rpc调用,都需要封装python代码如下,供旧服务调用:

# 封装的rpc调用方式
from hd_lib.rpc_client.etcd_rpc_call import parse_rpc_resp
from user_i.client import get_user_client
from user_i.user_py import user_pb2

def get_profile(pid):  # 一个rpc调用方法
    cli_req = user_pb2.GetUserProfileReq(pid=pid)
    return parse_rpc_resp(get_user_client().GetUserProfile)(cli_req)

1.3,存在的问题

  • 原生的rpc方法(通过proto生成的python代码)并不友好,每个rpc方法都需要初始化client,都需要组装req,都需要解析resp。
  • 每个python服务都需要实现一次rpc方法。

1.4,解决方案

  • 把rpc方法都放到一个地方封装好,并按照子模块进行聚类。
  • 把封装好的rpc方法都维护在一个仓库,供上层的python服务引用调用。

理论上,我们基于每个微服务对应的xxx_i,对每个rpc方法封装即可。

但是我们准备增加一个新仓库rpc_client里面包括所有的xxx_i,并对每个xxx_i维护rpc调用代码。

????????可以共用client初始化,以及resp解析的相关代码。

????????每个上层的python服务只需要通过一个(而不是多个)子模块引用所有的rpc能力。

?

2,rpc_client仓库维护方法

2.1,仓库地址

git@xxxx/rpc_client.git

2.2,目录结构与注释

|__passport_i // git submodule add git@git.hundun.cn:golang-servers/passport_i.git

|__user_i // git submodule add git@git.hundun.cn:golang-servers/user_i.git

|__user_rpc

????????|__ __init__.py

????????|__ profile.py // 封装profile子模块的rpc调用方法

????????|__ permission.py // 封装permission.py子模块的rpc调用方法

????????|__ ... // 封装其他子模块的rpc调用方法

|__passport_rpc

????????|__ __init__.py

????????|__ login.py // 封装登录子模块的rpc调用方法

????????|__ ...

|__ __init__.py

|__helper

????????|__ __init__.py

????????|__ etcd_rpc_call.py // etcd服务发现与负载均衡,以及rpc通用解析处理方法parse_rpc_resp

2.3,新增rpc服务

  1. 在rpc_client项目下,执行:git submodule add git@git.hundun.cn:golang-servers/xxx_i.git
  2. 增加xxx_rpc目录,对每一个子模块创建py文件,封装rpc调用方法如下
# 封装rpc调用,主要对req和resp进行处理
from rpc_client.common.parse_resp import parse_rpc_resp
from rpc_client.user_i.user_py import user_pb2
from rpc_client.user_rpc.client import get_user_client


class Profile(object):
    def __init__(self, pid=0, user_id=""):
        self.client = get_user_client()
        self.pid = pid
        self.user_id = user_id

    @parse_rpc_resp
    def get_profile(self):
        cli_req = user_pb2.GetUserProfileReq(
            pid=self.pid,
            user_id=self.user_id,
        )
        return self.client.GetUserProfile(cli_req)

3,旧服务调用rpc的使用方法

3.1,rpc调用?

  1. 在旧服务项目下增加submodule,执行:git submodule add git@git.hundun.cn:v2-online-server/rpc_client.git
  2. ?在需要调用rpc的地方,增加如下代码
from rpc_client.user_rpc.profile import Profile

class OneClass(object):
    ...   
    def oneFunc(self, pid, *args, **kwargs):
         profile = Profile(pid).get_profile()   # 这里是一次rpc调用

3.2,子模块更新

当rpc_client子模块需要更新时,在旧服务项目主目录下,执行:

git submodule foreach --recursive git submodule update

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:27:29  更:2021-09-27 14:28:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/27 1:43:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码