Package: yzrpc
Yz-RPCIntroductionA gRPC framework for automatically generating protobuf files.
一个自动生成protobuf文件的grpc框架。The purpose ofyzrpcis to write code in a development method similar
to http WEB when developing back-end RPC services. The command line generates
protobuf with one click without paying attention to the writing on the protobuf file.
At the same time, it provides a code structure specification reference.yzrpc 目的为了开发后端RPC服务时，能够以类似http WEB的开发方式编写代码，
命令行一键生成protobuf，而不必过关注protobuf协议文件上的编写，
同时提供一种代码结构规范参考。Quick start可以通过createproject和createtapp两个命令快速创建工程和内部的接口应用模块。安装模块$pipinstallyzrpc示例：创建工程：$yzrpccreateprojectmyproject注意：创建项目时会检测当前目录是否与项目名同名，
如果同名默认已经创建工程根目录，会询问是否覆盖该工程。创建工程内部应用：$yzrpccreateappmyapp01-D./myproject/src# 或者$cdmyproject
$yzrpccreateappmyapp01经过createproject和createapp两个命令后，会产生如下的代码结构：.
├── docs		        说明文档、接口文档等文档的存放目录
├── migrations		    数据表迁移文件存放目录
├── src
│   ├── apps 接口应用程序的主目录
│   │   ├── __init__.py
│   │   ├── myapp01
│   │       ├── __init__.py
│   │       ├── controllers.py  控制层：封装数据交互操作
│   │       ├── models.py       模型层：实现数据表与模型的定义
│   │       ├── schemas.py      模式层：定义接口数据参数
│   │       ├── tests.py        单元测试文件
│   │       └── views.py        视图层：接口定义层
│   ├── __init__.py
│   ├── conf/		    配置文件的存放目录
│   ├── const/		    公共常量存放目录
│   ├── protos/		    protobuf文件存放目录
│   ├── services/		通过grpc-tools生成的服务调用模块的存放目录
│   ├── utils/		    抽离出的公共代码模块存放目录
│   ├── settings.py	程序的设置文件
│   └── main.py		程序的入口文件
├── .gitignore
├── requirements.txt
└── README.md生成的MVCS(models,views,controllers,schemas)模版中，
需要注意schemas.py和views.py，因为它们是生成protobuf的关键。在生成的代码模版中，已经提供相关的示例：schemas.py:fromenumimportEnumfromtypingimport(Optional,Any,List,Tuple,Dict,Mapping,Union,Sequence,Iterable)fromyzrpc.schemaimportSchemaBaseclassCommonBase(SchemaBase):classConfig:orm_mode=TrueclassEnumExample(Enum):A=1B=2C=3classEmbedInfo(CommonBase):name:strage:intclassSchemaExample(CommonBase):int_exa:intstr_exa:strbool_exa:boolfloat_exa:floatbytes_exa:bytestuple_exa:tuplelist_exa:listdict_exa:dictenum_exa:EnumExampleembed_exa:EmbedInfoexa_any:Anyexa_list:Listexa_tuple:Tupleexa_dict:Dict[str,int]exa_mapping:Mapping[str,int]exa_list_embed:Listexa_sequence:Sequence[int]exa_iterable:Iterable[str]exa_list_multi:List[EmbedInfo]exa_union:Union[int,EmbedInfo,EnumExample,str]# 不推荐exa_optional:Optional[EmbedInfo]# 不推荐exa_optional_multi:Optional[EmbedInfo]# 不推荐exa_optional_multi_l:Optional[list]# 不推荐schemas.py是继承于pydantic这个库来进行类型检测的，
在schemas.py中定义rpc接口的请求类型和响应类型。注意：请求类型和响应类型必须继承于SchemaBase这个基类。views.py:fromtypingimportIterable,Iteratorfromyzrpc.servicerimportServicerBase,GRPCMethod# from src.services import myapp01_pb2# from src.services import myapp01_pb2_grpcfrom.schemasimportSchemaExampleclassMyapp01Servicer(ServicerBase):@GRPCMethod(before_requests=[],after_responses=[])defget_one(self,request:SchemaExample,context)->SchemaExample:returnrequest@GRPCMethod()defget_some(self,request:Iterator[SchemaExample],context)->Iterable[SchemaExample]:returnrequest@GRPCMethod()deflist_some(self,request:SchemaExample,context)->Iterable[SchemaExample]:pass@GRPCMethod()defupdate_some(self,request:Iterator[SchemaExample],context)->SchemaExample:pass需要变成RPC接口的方法用GRPCMethod()封装，可传入before_requests和after_responses参数，作为该接口的预处理操作。注意：请求参数的和返回参数的类型标注不可忽略不写，该类型标注是生成protobuf协议的service数据的关键。在app的MVCS模块编写相关的业务代码后，运行命令生成protobuf文件:$yzrpcgenerateproto$tree./src/protos./src/protos
└──myapp01.proto根据protobuf文件生成pb模块：$yzrpcgeneratemodule

$tree./src/services./src/services
├──__init__.py
├──myapp01_pb2.py
└──myapp01_pb2_grpc.py编写单元测试
在myproject/src/apps/myapp01/tests.py中，提供了单元测试模版：importpytestfromyzrpc.testsimport*fromsrc.services.myapp01_pb2importSchemaExample@pytest.fixture(scope='module')defgrpc_add_to_server():fromsrc.services.myapp01_pb2_grpcimportadd_Myapp01Servicer_to_serverreturnadd_Myapp01Servicer_to_server@pytest.fixture(scope='module')defcurrent_servicer():from.viewsimportMyapp01ServicerreturnMyapp01Servicer@pytest.fixture(scope='module')defgrpc_stub(grpc_channel):fromsrc.services.myapp01_pb2_grpcimportMyapp01StubreturnMyapp01Stub(grpc_channel)# 测试用例deftest_get_one(grpc_stub):request=SchemaExample(int_exa=1,str_exa='test')context=MockContext()response=grpc_stub.get_one(request,context)assertisinstance(response,SchemaExample)assertresponse.int_exa==1assertresponse.str_exa=='test'开发人员只需关注最下面的测试用例即可，之上的是根据app不同自动导入的模块。无需理会。
开发人员根据需要扩展测试用例。
该测试模块是基于pytest构建的，运行测试时，需要安装pytest。运行测试：$yzrpcruntest该命令会自动搜索项目下的所有tests.py文件。启动服务$pythonsrc/main.py===>当前环境为：dev!导入的配置文件为：config_dev.ini
Startingserverat2021-04-2311:35:28.902143
Serverislisteningport50051Registeredhandlers:===>-------------->myapp01<---------------===>Myapp01:get_one(SchemaExample)->SchemaExample===>Myapp01:get_some(SchemaExample)->SchemaExample===>Myapp01:list_some(SchemaExample)->SchemaExample===>Myapp01:update_some(SchemaExample)->SchemaExample服务的启动参数有:--host=localhost--port=50051--max_workers=1   # 最大线程数--autoreload      # 自动重载功能，开发阶段使用--async           # 该参数启动异步协程方式这些参数都封装在settings里，可以根据需要修改配置。客户端调用fromyzrpc.clientimportClientfromsrc.apps.myapp01.schemasimportSchemaExamplewithClient('localhost:50051','myapp01','Myapp1')asclient:request=SchemaExample(str_exa='testing',...)response=client.call('get_one',request)print(response)print(type(response))print(response.str_exa)或者：fromyzrpc.clientimportClientfromsrc.apps.myapp01.schemasimportSchemaExampleclient=Client('localhost:50051','myapp01','Myapp1')request=SchemaExample(str_exa='testing',...)response=client.call('get_one',request)print(response)print(type(response))print(response.str_exa)client.close()根据具体业务开发需求进行二次封装。Documentation暂无.