当前位置: 首页 > news >正文

义乌公司网站制作网页制作和网站制作有什么区别

义乌公司网站制作,网页制作和网站制作有什么区别,网站收录是什么,用静态网站更新十八、Rust gRPC 多 proto 演示 网上及各官方资料#xff0c;基本是一个 proto 文件#xff0c;而实际项目#xff0c;大多是有层级结构的多 proto 文件形式#xff0c;本篇文章 基于此诉求#xff0c;构建一个使用多 proto 文件的 rust grpc 使用示例。 关于 grpc 的实现…十八、Rust gRPC 多 proto 演示 网上及各官方资料基本是一个 proto 文件而实际项目大多是有层级结构的多 proto 文件形式本篇文章 基于此诉求构建一个使用多 proto 文件的 rust grpc 使用示例。 关于 grpc 的实现找到两个库 Tonichttps://github.com/hyperium/tonic8.9k Star、852 Commits、2024-03-12 updated。 PingCAP 的 grpc-rshttps://github.com/tikv/grpc-rs1.8k Star、357 Commits、2023-08 updated。 据说 PingCAP 的 grpc-rs benchmark 稍高一些但看关注度和提交量不如 tonic且据说 tonic 开发体验更好一些本篇以 tonic 为例。 编译 Protobuf还需要 protoc可以参考官方文档这里先给出 macOS 的 brew install protobufhttps://grpc.io/docs/protoc-installation/ 关于 TonicTonic 是基于 HTTP/2 的 gRPC 实现专注于高性能互通性和灵活性 目录说明 . ├── Cargo.toml ├── README.md ├── build.rs ├── proto │ ├── basic │ │ └── basic.proto │ ├── goodbye.proto │ └── hello.proto └── src├── bin│ ├── client.rs│ └── server.rs├── lib.rs└── proto-gen├── basic.rs├── goodbye.rs└── hello.rsbuild.rs 存放通过 proto 生成 rs 的脚本proto 目录放置 grpc 的 proto 文件定义服务和消息体src 常规意义上的项目源码目录 proto-gen 目录存放 build.rs 编译 proto 后生成的 rs 文件lib.rs 引入 proto 的 rs 文件bin 目录下进行 proto 所定义服务的实现此例为 客户端、服务端 的实现 创建项目 创建一个 lib 项目 cargo new grpc --libCargo.toml [package] name grpc version 0.1.0 edition 2021 description A demo to learn grpc with tonic.# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[[bin]] namegrpc_server pathsrc/bin/server.rs[[bin]] namegrpc_client pathsrc/bin/client.rs[dependencies] prost 0.12.3 tokio { version 1.37.0, features [macros, rt-multi-thread] } tonic 0.11.0[build-dependencies] tonic-build 0.11.0定义服务 grpc/proto/basic/basic.proto syntax proto3;package basic;message BaseResponse {string message 1;int32 code 2; }grpc/proto/hello.proto syntax proto3;import basic/basic.proto;package hello;service Hello {rpc Hello(HelloRequest) returns (HelloResponse) {} }message HelloRequest {string name 1; }message HelloResponse {string data 1;basic.BaseResponse message 2; }grpc/proto/goodbye.proto syntax proto3;import basic/basic.proto;package goodbye;service Goodbye {rpc Goodbye(GoodbyeRequest) returns (GoodbyeResponse) {} }message GoodbyeRequest {string name 1; }message GoodbyeResponse {string data 1;basic.BaseResponse message 2; }配置编译 Rust 约定在 build.rs 中定义的代码会在编译真正项目代码前被执行因此可以在这里先编译 protobuf 文件 grpc/Cargo.toml 引入 [build-dependencies] tonic-build 0.11.0grpc/build.rs use std::error::Error; use std::fs;static OUT_DIR: str src/proto-gen;fn main() - Result(), Boxdyn Error {let protos [proto/basic/basic.proto,proto/hello.proto,proto/goodbye.proto,];fs::create_dir_all(OUT_DIR).unwrap();tonic_build::configure().build_server(true).out_dir(OUT_DIR).compile(protos, [proto/])?;rerun(protos);Ok(()) }fn rerun(proto_files: [str]) {for proto_file in proto_files {println!(cargo:rerun-if-changed{}, proto_file);} }稍作解释 OUT_DIR 全局定义 proto 文件编译后的输出位置默认在 target/build 目录下。let protos [...] 声明了所有待编译 proto 文件。tonic_build::configure() .build_server(true) 是否编译 server 端项目以 proto 为基准则编就完了。.compile(protos, [proto/])?; 开始编译。 最终生成 grpc/src/proto-gen/ basic.rs、hello.rs、goodbye.rs 由 proto 生成的原代码内容一般较长这里不贴出感兴趣的读者运行一下就可以看到。另外翻看其代码可以看到 为客户端生成的HelloClient类型implT HelloClientT 实现了Clone、Sync 及 Send因此可以跨线程使用。为服务端生成的 HelloServer 类型implT: Hello HelloServerT {} 包含了 implT: Hello预示着我们创建 HelloServer 实现假设为 HelloService 时需实现该 Hello Trait 。 引入proto生成的文件 grpc/src/lib.rs #![allow(clippy::derive_partial_eq_without_eq)]pub mod basic {include!(./proto-gen/basic.rs); }pub mod hello {include!(./proto-gen/hello.rs); }pub mod goodbye {include!(./proto-gen/goodbye.rs); }这里使用了标准库提供的 include! 来引入源文件 如果没有定义 proto 编译输出位置的话默认是在 target/build 目录下此时需要使用 tonic 提供的 include_proto!(hello) 宏来引入对应文件而不用额外提供路径了其中的 hello 为 grpc 的 “包名”proto文件中的 “package xxx;”具体来说就是 注释掉 grpc/build.rs 中 .out_dir(OUT_DIR) 一行。grpc/src/lib.rs 中 include!(./proto-gen/basic.rs); 改为 include_proto!(basic); 。include!(./proto-gen/hello.rs); 改为 include_proto!(hello); 。include!(./proto-gen/goodbye.rs); 改为 include_proto!(goodbye); 。 但这样在进行 server、client 实现、源码编写时将无法正常引用致使大量 “漂红” 只 IDE 下这样如 CLion不影响 shell 下编译及运行 。 参考官方文档https://docs.rs/tonic/latest/tonic/macro.include_proto.html 服务实现 服务端实现各语言基本类似为对应 proto 定义创建相应的 Service 实现即可 grpc/src/bin/server.rs use tonic::{Request, Response, Status}; use tonic::transport::Server;use grpc::basic::BaseResponse; use grpc::goodbye::{GoodbyeRequest, GoodbyeResponse}; use grpc::goodbye::goodbye_server::{Goodbye, GoodbyeServer}; use grpc::hello; use hello::{HelloRequest, HelloResponse}; use hello::hello_server::{Hello, HelloServer};#[derive(Default)] pub struct HelloService {}#[tonic::async_trait] impl Hello for HelloService {async fn hello(self, req: RequestHelloRequest) - ResultResponseHelloResponse, Status {println!(hello receive request: {:?}, req);let response HelloResponse {data: format!(Hello, {}, req.into_inner().name),message: Some(BaseResponse {message: Ok.to_string(),code: 200,}),};Ok(Response::new(response))} }#[derive(Default)] pub struct GoodbyeService {}#[tonic::async_trait] impl Goodbye for GoodbyeService {async fn goodbye(self,req: RequestGoodbyeRequest,) - ResultResponseGoodbyeResponse, Status {println!(goodbye receive request: {:?}, req);let response GoodbyeResponse {data: format!(Goodbye, {}, req.into_inner().name),message: Some(BaseResponse {message: Ok.to_string(),code: 200,}),};Ok(Response::new(response))} }#[tokio::main] async fn main() - Result(), Boxdyn std::error::Error {let addr 0.0.0.0:50051.parse()?;println!(server starting at: {}, addr);Server::builder().add_service(HelloServer::new(HelloService::default())).add_service(GoodbyeServer::new(GoodbyeService::default())).serve(addr).await?;Ok(()) }grpc/src/bin/client.rs use tonic::Request; use tonic::transport::Endpoint;use grpc::goodbye::goodbye_client::GoodbyeClient; use grpc::goodbye::GoodbyeRequest; use grpc::hello; use hello::hello_client::HelloClient; use hello::HelloRequest;#[tokio::main] async fn main() - Result(), Boxdyn std::error::Error {let addr Endpoint::from_static(https://127.0.0.1:50051);let mut hello_cli HelloClient::connect(addr.clone()).await?;let request Request::new(HelloRequest {name: tonic.to_string(),});let response hello_cli.hello(request).await?;println!(hello response: {:?}, response.into_inner());let mut goodbye_cli GoodbyeClient::connect(addr).await?;let request Request::new(GoodbyeRequest {name: tonic.to_string(),});let response goodbye_cli.goodbye(request).await?;println!(goodbye response: {:?}, response.into_inner());Ok(()) }运行及测试 cargo run --bin grpc_server cargo run --bin grpc_client故障时重新编译cargo clean cargo build 关于 Github Action 需添加步骤 - name: Install protocrun: sudo apt-get install -y protobuf-compiler完事       参考资料 Rust grpc 实现 - https://jasonkayzk.github.io/2022/12/03/Rust%E7%9A%84GRPC%E5%AE%9E%E7%8E%B0Tonic/ Tonic 流式 grpc - https://github.com/hyperium/tonic/blob/master/examples/routeguide-tutorial.md 开源库 - https://github.com/tokio-rs/prost Tonic - https://github.com/hyperium/tonic
http://www.dnsts.com.cn/news/82371.html

相关文章:

  • 高仿id97网站模板深圳网站开发找哪里
  • 如何创建电子商务网站南阳东莞网站建设公司哪家好
  • 满版型网站有哪些关闭网站后弹窗代码
  • 我想在阿里巴巴做卫生纸的网站安徽观元建设有限公司网站
  • 静安网站开发wordpress分享朋友圈
  • 可信赖的赣州网站建设游戏平台网站的建设规划
  • 泰安市景区建设网站呼和浩特 的网站建设
  • 公司的英文网站百度渠道开户哪里找
  • 网站优化包括哪些内容怎么做营销策划方案
  • 商务礼品网站模板免费永久网站注册
  • 做淘宝必备网站天津有哪些有名的网站建设公司
  • 上海微信网站开发益阳建设企业网站
  • 广州外贸soho建站微信群发软件
  • 网站的建设与预算哪些网站做推广
  • 遵义网站建设制作wordpress的链接功能
  • 如何与网站建立私密关系做网站网站代理违法吗
  • 低价网站建设行业现状合肥网红打卡地
  • 网站文案标准格式怎样用html制作网站
  • 高端品牌建站网站里面那些工作是做晚上兼职的
  • 网站运营需要哪些技术统一登录入口
  • 网站用户注册怎么建深圳市市长
  • 网站建设的技术支持百度知道一下
  • 网站建立好如何做seo网站接入服务商查询
  • html5响应式企业网站弄一个公司网站需要多少钱
  • 电子商务网站建设前景深圳罗湖网站建设公司
  • 网站职业技能培训班怎么做网站的seo优化
  • 怎么做自己的博客网站wordpress蛋糕主题
  • html格式的网站地图河北网站建设大全
  • php 装修网站wordpress 付费 破解
  • 手机网站域名注册郑州seo学校