def server_bidirectional_stream_call_one_by_one(): """ 双向流模式,客户端处理,一个请求对应一个响应的情况 通过队列传递交互传递参数 """ # 清空队列 TEMP_QUEUE.queue.clear() TEMP_QUEUE.put(None) # 处理 _connect_para = SimpleGRpcConnection.generate_connect_para( ip='127.0.0.1', port=50051 ) _connection = SimpleGRpcConnection(_connect_para) _cresult_iterator = _connection.call( bidirectional_stream_one_by_one_generator(), call_mode=EnumCallMode.BidirectionalStream) for _cresult in _cresult_iterator: # 放入队列 s = _cresult.return_json TEMP_QUEUE.put(s) if not _cresult.is_success(): return False _connection.close() return True
def client_simple_call_para_server_tsl(a, b, *args, c=10, d={'d1': 'd1value'}, **kwargs): """ 测试简单调用,进行单向认证(客户端验证服务端证书) """ # 转换参数 _para_values = RunTool.get_current_function_parameter_values(is_simple_mode=True) _para_obj = SimpleGRpcTools.parameters_to_json(_para_values) _req_obj = SimpleGRpcTools.generate_request_obj( service_name='service_simple_call_para', para_json=_para_obj.para_json, has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes ) # 发送请求 with open(_TEMP_DIR + '/../../simple_grpc/server.crt', 'rb') as f: _root_certificates = f.read() # 发送请求, 默认使用全局的日志对象 _connect_para = SimpleGRpcConnection.generate_connect_para( ip='localhost', port=50053, is_use_ssl=True, root_certificates=_root_certificates ) _connection = SimpleGRpcConnection(_connect_para) _cresult = _connection.call(_req_obj) _connection.close() _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping( _cresult.return_json, 'client_simple_call_para' ) return _cresult
def server_side_stream_call(a, b, *args, **kwargs): """ 服务端流模式,真正调用服务端的函数 """ # 转换参数 _para_values = RunTool.get_current_function_parameter_values(is_simple_mode=True) _para_obj = SimpleGRpcTools.parameters_to_json(_para_values) _req_obj = SimpleGRpcTools.generate_request_obj( service_name='service_server_side_stream', para_json=_para_obj.para_json, has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes ) # 发送请求, 默认使用全局的日志对象 _connect_para = SimpleGRpcConnection.generate_connect_para( ip='127.0.0.1', port=50051 ) _connection = SimpleGRpcConnection(_connect_para) _cresult_iterator = _connection.call(_req_obj, call_mode=EnumCallMode.ServerSideStream) _ret = True for _cresult in _cresult_iterator: if not _cresult.is_success(): _ret = False _connection.close() return _ret
def test_error(self): """ 测试错误信息 """ if not TEST_FLAG['test_error']: return print("测试错误信息") print("测试错误信息 - 连接失败") _connect_para = SimpleGRpcConnection.generate_connect_para( ip='127.0.0.1', port=60051 ) _connection = SimpleGRpcConnection(_connect_para) _cresult = _connection.call(SimpleGRpcTools.generate_request_obj('test')) _connection.close() self.assertTrue( _cresult.code == '20408' and grpc.StatusCode.UNAVAILABLE.name == _cresult.i18n_msg_paras[0], '测试错误信息失败 - 连接失败 ' ) print("测试错误信息 - 服务名不存在") _connect_para = SimpleGRpcConnection.generate_connect_para( ip='127.0.0.1', port=50051 ) _connection = SimpleGRpcConnection(_connect_para) _cresult = _connection.call(SimpleGRpcTools.generate_request_obj('test', '')) _connection.close() self.assertTrue( _cresult.code == '11403', '测试错误信息失败 - 服务名不存在 ' ) print("测试错误信息 - 超时") _connect_para = SimpleGRpcConnection.generate_connect_para( ip='127.0.0.1', port=50051, timeout=0.1 ) _connection = SimpleGRpcConnection(_connect_para) _cresult = _connection.call(SimpleGRpcTools.generate_request_obj('service_simple_overtime')) _connection.close() self.assertTrue( _cresult.code == '30403', '测试错误信息失败 - 超时' )
def client_side_stream_call(): """ 客户端流模式,真正调用服务端的函数 """ # 发送请求, 默认使用全局的日志对象 _connect_para = SimpleGRpcConnection.generate_connect_para( ip='127.0.0.1', port=50051 ) _connection = SimpleGRpcConnection(_connect_para) _cresult = _connection.call(client_side_stream_generator(), call_mode=EnumCallMode.ClientSideStream) _connection.close() _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping( _cresult.return_json, 'service_client_side_stream' ) return _cresult
def _grpc_call(self, service_name: str, para_list: list, is_support_bytes=False): """ 调用远程grpc服务 注:该函数不处理返回对象中的bytes信息 @param {str} service_name - 要调用的服务名 @param {list} para_list - 要转换的参数列表,list的每一项为一个参数项,每个参数项如下: [para_name, call_value] : para_name可以为'' @param {bool} is_support_bytes=False - 是否支持参数中的字节数组传递(只支持最后一个参数) @returns {object} - 返回远程调用返回的对象 @throws {RuntimeError} - 如果远程调用出现错误抛出异常 """ # 生成请求对象 _para_obj = SimpleGRpcTools.parameters_to_json( para_list, is_support_bytes=is_support_bytes) _req_obj = SimpleGRpcTools.generate_request_obj( service_name=service_name, para_json=_para_obj.para_json, has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes) # 连接并请求服务 _connection = SimpleGRpcConnection(self.connect_para) try: _cresult: CResult = _connection.call(_req_obj) if not _cresult.is_success(): # 执行失败,抛出异常 raise RuntimeError('call %s error: %s' % (service_name, str(_cresult))) # 处理返回值 if _cresult.return_json == '': return None else: return json.loads(_cresult.return_json) finally: _connection.close()
def server_bidirectional_stream_call_n_by_one(): """ 双向流模式,客户端处理,多个请求对应一个响应的情况 """ # 发送请求, 默认使用全局的日志对象 _connect_para = SimpleGRpcConnection.generate_connect_para( ip='127.0.0.1', port=50051 ) _connection = SimpleGRpcConnection(_connect_para) _cresult_iterator = _connection.call(bidirectional_stream_n_by_one_generator(), call_mode=EnumCallMode.BidirectionalStream) _ret = True for _cresult in _cresult_iterator: # 打印 print('bidirectional_stream_n_by_one client get: ' + _cresult.return_json) if not _cresult.is_success(): _ret = False _connection.close() return _ret
def client_simple_throw_excepiton(): """ 测试简单调用,抛出异常 """ # 转换参数 _para_values = RunTool.get_current_function_parameter_values( is_simple_mode=True) _para_obj = SimpleGRpcTools.parameters_to_json(_para_values) _req_obj = SimpleGRpcTools.generate_request_obj( service_name='service_simple_throw_excepiton', para_json=_para_obj.para_json, has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes) # 发送请求, 默认使用全局的日志对象 _connect_para = SimpleGRpcConnection.generate_connect_para( conn_str='127.0.0.1:50051') _connection = SimpleGRpcConnection(_connect_para) _cresult = _connection.call(_req_obj) _connection.close() _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping( _cresult.return_json, 'client_simple_throw_excepiton') return _cresult
def client_simple_call_para(a, b, *args, c=10, d={'d1': 'd1value'}, **kwargs): """ 测试简单调用,直接返回参数 """ # 转换参数 _para_values = RunTool.get_current_function_parameter_values(is_simple_mode=True) _para_obj = SimpleGRpcTools.parameters_to_json(_para_values) _req_obj = SimpleGRpcTools.generate_request_obj( service_name='service_simple_call_para', para_json=_para_obj.para_json, has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes ) # 发送请求, 默认使用全局的日志对象 _connect_para = SimpleGRpcConnection.generate_connect_para( conn_str='127.0.0.1:50051', servicer_name='servicer_simple_call', test_on_connect=True, test_use_health_check=False ) _connection = SimpleGRpcConnection(_connect_para) _cresult = _connection.call(_req_obj) _connection.close() _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping( _cresult.return_json, 'client_simple_call_para' ) return _cresult