新闻详情

新闻详情

首页 / 资讯中心 / 详情

gRPC微服务搭建(学习阶段3:数据服务系统)

发布时间:2026/10/1 7:30:42来源:尧图网络
gRPC微服务搭建(学习阶段3:数据服务系统)
这篇播客基于 Python gRPC 实现的客户端与服务端通信首先模拟一个简单的数据服务系统客户端通过登录接口进行身份验证在服务端验证用户名和密码后生成 Token服务端接收到请求后会通过gRPC拦截器统一完成日志记录和Token鉴权。鉴权成功后服务端根据客户端传入的开始日期、结束日期和字段列表使用pandas动态生成一份随机DataFrame数据并将数据返回给客户端。服务端代码这里服务端注册两个主要的函数auth.Auth服务的login函数用于做权限校验data.Data服务的GetData函数用于获取数据在这段代码中是基于用户传入的参数生成一个模拟的数据importjsonimportloggingimportsecretsfromconcurrentimportfuturesimportgrpcimportpandasaspd logging.basicConfig(levellogging.INFO,format%(asctime)s [%(levelname)s] %(message)s,)loggerlogging.getLogger(__name__)TOKENS{}deflogin(request,_context):登录成功后生成并保存 Token。usernamerequest.get(username)passwordrequest.get(password)logger.info(收到登录请求username%s,username)ifusername!adminorpassword!123456:logger.warning(登录失败username%s,username)return{success:False,message:用户名或密码错误}tokensecrets.token_hex(16)TOKENS[token]username logger.info(登录成功username%s,username)return{success:True,token:token,message:登录成功}defget_data(request,_context):根据日期范围和字段生成一份随机 DataFrame 数据。start_daterequest.get(start_date)end_daterequest.get(end_date)fieldsrequest.get(fields,[])ifnotstart_dateornotend_dateornotfields:return{success:False,message:start_date、end_date、fields 不能为空}try:datespd.date_range(startstart_date,endend_date,freqD)exceptValueError:return{success:False,message:日期格式应为 YYYY-MM-DD}dataframepd.DataFrame({date:dates.strftime(%Y-%m-%d),**{field:pd.Series(secrets.randbelow(10000)/100for_indates)forfieldinfields},})return{success:True,data:dataframe.to_dict(orientrecords),message:数据获取成功,}defjson_handler(function):统一处理 Python 字典和 JSON 字节之间的转换。returngrpc.unary_unary_rpc_method_handler(function,request_deserializerlambdadata:json.loads(data.decode(utf-8)),response_serializerlambdadata:json.dumps(data,ensure_asciiFalse).encode(utf-8),)classLoggingInterceptor(grpc.ServerInterceptor):记录每次 gRPC 请求。defintercept_service(self,continuation,handler_call_details):methodhandler_call_details.method logger.info(收到 gRPC 请求method%s,method)handlercontinuation(handler_call_details)ifhandlerisNone:logger.warning(找不到 gRPC 方法method%s,method)returnhandlerclassAuthInterceptor(grpc.ServerInterceptor):在业务函数执行前检查 Token。defintercept_service(self,continuation,handler_call_details):methodhandler_call_details.method handlercontinuation(handler_call_details)ifhandlerisNone:returnNoneifmethod/auth.Auth/Login:returnhandlerdefcheck_token(request,context):tokenrequest.get(token)iftokennotinTOKENS:logger.warning(鉴权失败method%s,method)context.abort(grpc.StatusCode.UNAUTHENTICATED,请先登录)logger.info(鉴权成功method%s, user%s,method,TOKENS[token])returnhandler.unary_unary(request,context)returnhandler._replace(unary_unarycheck_token)defcreate_server(address[::]:50051,max_workers4):创建并配置 gRPC 服务。grpc_servergrpc.server(futures.ThreadPoolExecutor(max_workersmax_workers),interceptors[LoggingInterceptor(),AuthInterceptor()],)grpc_server.add_generic_rpc_handlers((grpc.method_handlers_generic_handler(auth.Auth,{Login:json_handler(login)},),grpc.method_handlers_generic_handler(data.Data,{GetData:json_handler(get_data)},),))grpc_server.add_insecure_port(address)returngrpc_serverdefserve():启动 gRPC 服务并持续等待请求。address[::]:50051grpc_servercreate_server(address)grpc_server.start()logger.info(gRPC 服务已启动address%s,address)grpc_server.wait_for_termination()if__name____main__:serve()客户端代码客户端是极简代码直接登录获取token后直接获取数据即可importjsonimportgrpc# 把 Python 字典转换成 JSON 发送并把 JSON 响应转换回来。defcall(channel,method,data):requestchannel.unary_unary(method,request_serializerlambdavalue:json.dumps(value).encode(utf-8),response_deserializerlambdavalue:json.loads(value.decode(utf-8)),)returnrequest(data)# 连接服务端。withgrpc.insecure_channel(127.0.0.1:50051)aschannel:# 1. 登录获取 Token。login_resultcall(channel,/auth.Auth/Login,{username:admin,password:123456},)print(login_result[message])# 2. 使用 Token 查询指定日期和字段的数据。resultcall(channel,/data.Data/GetData,{token:login_result[token],start_date:2025-01-01,end_date:2025-01-05,fields:[open,close,volume],},)# 3. 打印服务端返回的数据。print(result[data])
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI系统性能工程:从指标口径到瓶颈定位与成本治理 2026/10/1 23:52:21

AI系统性能工程:从指标口径到瓶颈定位与成本治理

做AI系统性能工程,最容易翻车的不是不会用监控工具,而是没把性能当成一个真正的工程质量问题去闭环管理。前面两篇已经聊过GPU利用率、显存、时延这些基础指标怎么采、怎么看,到了这一篇,我打算把完整的流程串起来讲:指…

阅读更多 →
SMB协议调试与故障排查:从端口扫描到共享连接的实践指南 2026/10/1 23:52:15

SMB协议调试与故障排查:从端口扫描到共享连接的实践指南

简介:smb.rar压缩包提供了一份超级玛丽(Super Mario Bros)风格的2D游戏源代码,面向希望入门游戏开发或研究经典平台动作游戏实现的程序员,可基于DirectX与GLUT环境编译运行。源码主体使用C语言编写,涵盖游戏…

阅读更多 →
嵌入式Linux WiFi SDIO -110超时错误分析与实战排查 2026/10/1 23:52:15

嵌入式Linux WiFi SDIO -110超时错误分析与实战排查

1. 先搞清楚 -110 是谁递出来的做嵌入式 Linux 的,尤其是做 WiFi 模块适配的,基本都会在某块板子上撞见mmc0: error -110 whilst initialising SDIO card这一行日志。我第一次见到它是在一块国产 SoC 的评估板上,WiFi 模块型号刚换&#xff0…

阅读更多 →
Jev 类型安全 AI 调用与编排层:从 401 报错到 LLM 网关实践 2026/10/1 23:52:15

Jev 类型安全 AI 调用与编排层:从 401 报错到 LLM 网关实践

1. 从一个让人抓狂的报错说起:Jev 到底想解决什么问题第一次看到unexpected status 401 unauthorized: incorrect api key provided: sk-svcac****这个报错的时候,我正对着一个跑了一半的 LLM 调用脚本发呆。密钥明明是从控制台复制出来的,环…

阅读更多 →
马德拉岛旅行攻略:火山岛徒步、自驾与美食全指南 2026/10/1 23:52:15

马德拉岛旅行攻略:火山岛徒步、自驾与美食全指南

如果你让我从去过的地方里挑一个“还没被旅行团攻陷、但风景和体验都在线”的目的地,我大概率会脱口而出 Madeira。这个藏在北大西洋深处的葡萄牙群岛,既没有里斯本那种铺天盖地的游客密度,也没有圣托里尼那种被滤镜反复咀嚼的网红感&#xf…

阅读更多 →
基于YOLO的课堂行为检测实战:从数据标注到模型部署全指南 2026/10/1 23:52:14

基于YOLO的课堂行为检测实战:从数据标注到模型部署全指南

简介:基于YOLO的课堂行为检测系统.zip 是一套面向课堂教学场景的深度学习实践项目,专为计算机视觉方向的学习者、毕业设计或课程设计人员打造,用来对学生在课堂中的举手、听讲、阅读、写字等行为进行自动识别和实时分析。压缩包共包含27个文件…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉