首页 > 其他分享 >好,我们以你的 `euclidolap.proto` 文件为例,调整代码结构,让服务逻辑更清晰,同时将 `euclidolap` 模块分离到独立文件中

好,我们以你的 `euclidolap.proto` 文件为例,调整代码结构,让服务逻辑更清晰,同时将 `euclidolap` 模块分离到独立文件中

时间:2024-12-17 15:20:11浏览次数:3  
标签:文件 为例 proto rs 模块 euclidolap operation

好,我们以你的 euclidolap.proto 文件为例,调整代码结构,让服务逻辑更清晰,同时将 euclidolap 模块分离到独立文件中。


假设文件结构调整

我们将 euclidolap.proto 生成的代码放到 src/euclidolap 模块中,同时将服务端逻辑分开组织。

最终文件结构如下:

project/
├── build.rs                # Protobuf 代码生成脚本
├── Cargo.toml              # Rust 项目配置
├── proto/
│   └── euclidolap.proto    # Protobuf 接口定义文件
├── src/
│   ├── euclidolap/
│   │   ├── mod.rs          # euclidolap 模块主入口
│   │   └── euclidolap.rs   # 自动生成的 gRPC 代码
│   ├── main.rs             # 主程序文件

1. build.rs 文件

确保 build.rseuclidolap.proto 的代码生成到 src/euclidolap/euclidolap.rs

fn main() {
    let out_dir = "src/euclidolap"; // 指定代码生成目录

    if let Err(e) = tonic_build::configure()
        .out_dir(out_dir) // 输出到 euclidolap 模块目录
        .compile(&["proto/euclidolap.proto"], &["proto"]) // 编译 .proto 文件
    {
        eprintln!("Failed to compile proto files: {}", e);
        std::process::exit(1);
    }

    // 通知 Cargo 监控 .proto 文件的变化
    println!("cargo:rerun-if-changed=proto/euclidolap.proto");
}

这段代码会将生成的 euclidolap.rs 放在 src/euclidolap/ 目录下。


2. src/euclidolap/mod.rs 文件

mod.rseuclidolap 模块的主入口,内容如下:

// 引用自动生成的 gRPC 代码
pub mod euclidolap {
    include!("euclidolap/euclidolap.rs");
}

这里通过 include! 将自动生成的 euclidolap.rs 文件引入模块中。


3. src/main.rs 文件

主文件 main.rs 使用 euclidolap 模块实现服务逻辑:

mod euclidolap;

use euclidolap::euclidolap::olap_service_server::{OLAPService, OLAPServiceServer};
use euclidolap::euclidolap::{OLAPRequest, OLAPResponse, Row};
use tonic::{transport::Server, Request, Response, Status};

// 自定义服务实现
#[derive(Debug, Default)]
pub struct MyOLAPService {}

#[tonic::async_trait]
impl OLAPService for MyOLAPService {
    async fn execute_operation(
        &self,
        request: Request<OLAPRequest>, // 客户端的请求
    ) -> Result<Response<OLAPResponse>, Status> {
        println!("Received request: {:?}", request);

        // 从请求中解析操作类型和语句
        let operation_type = request.into_inner().operation_type;
        let statement = request.into_inner().statement;

        println!("Operation Type: {}, Statement: {}", operation_type, statement);

        // 伪造一个响应,返回结果
        let response = OLAPResponse {
            rows: vec![Row {
                columns: vec!["Result 1".to_string(), "Result 2".to_string()],
            }],
        };

        Ok(Response::new(response))
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "0.0.0.0:50052".parse().unwrap();
    let olap_service = MyOLAPService::default();

    println!(">>> EuclidOLAP Server is listening on {} <<<", addr);

    Server::builder()
        .add_service(OLAPServiceServer::new(olap_service)) // 注册 OLAP 服务
        .serve(addr)
        .await?;

    Ok(())
}

代码逻辑

  • MyOLAPService 服务实现

    • 实现了 OLAPService 接口中的 execute_operation 方法。
    • 解析客户端请求,返回一个伪造的响应数据(包含两列结果)。
  • 服务端启动

    • 服务监听 0.0.0.0:50052,通过 OLAPServiceServer::new 注册服务。

4. euclidolap.proto 示例

为了匹配代码示例,假设你的 euclidolap.proto 文件内容如下:

syntax = "proto3";

package euclidolap;

service OLAPService {
  rpc ExecuteOperation(OLAPRequest) returns (OLAPResponse);
}

message OLAPRequest {
  string operation_type = 1; // 操作类型
  string statement = 2;      // 多维查询语句
}

message OLAPResponse {
  repeated Row rows = 1;     // 返回的结果行
}

message Row {
  repeated string columns = 1; // 每行的列数据
}

代码生成后会包含什么

build.rs 会根据 euclidolap.proto 文件生成如下内容到 src/euclidolap/euclidolap.rs

  • Rust 结构体对应于 .proto 中的 message
  • Rust Trait 用于实现 gRPC 服务接口,例如 OLAPServiceServer

生成的代码会自动处理序列化和反序列化逻辑,简化服务实现。


运行流程

  1. 启动服务

    • 执行 cargo run 启动服务端,监听 0.0.0.0:50052
  2. 客户端请求

    • 客户端发送 OLAPRequest 请求,其中包含 operation_typestatement
  3. 服务端处理

    • 服务端解析请求,执行 execute_operation 方法。
    • 返回构造的 OLAPResponse,其中包含伪造的结果行。
  4. 响应客户端

    • 客户端接收到 OLAPResponse,完成请求。

总结

通过将 euclidolap 模块分离到单独的文件夹和模块中,你的代码结构更清晰且易于扩展。结合 build.rsTonic 的生成逻辑,服务端的实现变得高效而简洁。

标签:文件,为例,proto,rs,模块,euclidolap,operation
From: https://www.cnblogs.com/Tifahfyf/p/18612548

相关文章

  • 分布式文件系统HDFS
    HDFS简介HDFS(HadoopDistributedFileSystem)是一个分布式文件系统,是Hadoop生态系统的核心组件之一。它被设计用来在廉价的硬件设备上存储大规模的数据,并且能够提供高容错性和高吞吐量的数据访问。例如,在一个大型的互联网公司,每天会产生海量的用户行为数据,如浏览记录、购买记......
  • 实验6 模板类、文件I/O和异常处理
    1.实验任务4Vector.hpp源代码:点击查看代码#pragmaonce#include<iostream>#include<stdexcept>#include<algorithm>//forstd::copytemplate<typenameT>classVector{private:T*data;size_tsize;public://构造函数Vecto......
  • mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
    mfc140.dll是MicrosoftFoundationClasses(MFC)库中的一个动态链接库(DLL)文件,它是微软基础类库的一部分,为Windows应用程序的开发提供了丰富的类库和接口。MFC库旨在简化Windows应用程序的开发过程,提供了一系列预定义的C++类,这些类封装了WindowsAPI函数,使得开发者可以更方便地创......
  • Keil uVision5生成bin文件
    使用KeiluVision5将程序代码生成bin格式文件的方法1.点击魔术棒(OptionsforTarget...)2.选择User界面,勾选上AfterBuild、Rebuild的Run#1在UserCommand中填入下面的指令。fromelf--bin-o"$L@L.bin""#L"......
  • msvcp100.dll文件缺失的修复方法分享,全面分析msvcp100.dll的修复方法
    msvcp100.dll是一个动态链接库(DLL)文件,属于MicrosoftVisualC++2010RedistributablePackage的一部分。这个文件对于运行使用MicrosoftVisualC++2010编译器编译的应用程序至关重要。msvcp100.dll包含了C++标准库的实现,提供了应用程序运行时所需的核心功能,如输入/......
  • 实验6 模板类、文件I/O和异常处理
    task4源码:1#include<iostream>2#include<stdexcept>3#include<algorithm>45template<typenameT>6classVector{7private:8T*data;9size_tsize;//无符号整数类型1011public:12Vector(in......
  • MongoDB|TOMCAT定时切割日志文件的脚本
    MongoDB用过一段时间后,日志较大,需要定时进行日志切割。一、切割bash:splitlogmongo.sh#!/bin/bashlog_dir="/home/mongodb/logs"file_name="/home/mongodb/logs/mongodb.log"if[!-d$log_dir];thenmkdir-p$log_dirfiif[!-f$file_name];thentouch$file_name......
  • python往windows系统的txt文件读取内容和写入内容
    继上一节windows系统打开命令行窗口,这一节开始讲述windows系统下读取txt文件内容和写入txt文件内容一、读取文件里面的内容:1、在python安装路径下创建一个文件pyfileio.txt文件,如下图所示,记录好pyfileio.txt文件的绝对路径C:\Users\Administrator\AppData\Local\Program......
  • 在CodeBolcks+Windows API下的C++面向对象的编程教程——给你的项目中添加头文件和菜
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • 提升生产力的秘密武器:VS Code 的多文件编辑与调试增强
    在软件开发的世界里,时间就是金钱。每一行代码的编写、每一次调试的尝试,都可能影响到项目的进度和质量。为了帮助开发者更高效地完成工作,VisualStudioCode(VSCode)在其11月发布的版本(v0.23)中,推出了一系列令人兴奋的生产力增强功能。这些新特性不仅提升了多文件编辑的效率,还......