rust学习-rpc

使用框架rpcx-rs

rpcx-rs 0.2.2 版本,使用Rust访问rpcx服务,支持 JSON 和 MessagePack 两种序列化方式。
protobuf序列化的支持、服务治理各种功能(路由、失败处理、重试、熔断器、限流)、监控(metrics、trace)、注册中心(etcd、consul)等众多的功能

cat ../Cargo.toml
[package]
name = "rust_demo4"
version = "0.1.0"
edition = "2021"[dependencies]
rpcx = "0.2.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
rmp-serde = "1.1.2"
// lib.rs
use std::error::Error as StdError;use rmp_serde as rmps;
use serde::{Deserialize, Serialize};use rpcx::*;#[derive(RpcxParam, Default, Debug, Copy, Clone, Serialize, Deserialize)]
pub struct ArithAddArgs {#[serde(rename = "A")]pub a: u64,#[serde(rename = "B")]pub b: u64,
}
#[derive(RpcxParam, Default, Debug, Copy, Clone, Serialize, Deserialize)]
pub struct ArithAddReply {#[serde(rename = "C")]pub c: u64,
}
// main.rs
use rust_demo4::{ArithAddArgs, ArithAddReply};
use rpcx::*;fn test(args: ArithAddArgs) -> ArithAddReply {ArithAddReply { c: args.a + args.b }
}fn main() {// 第二个参数为 0,表示绑定所需的服务器线程数,如果设置为 0,则使用默认值(通常为 CPU 数量)let mut rpc_server = Server::new("0.0.0.0:8972".to_owned(), 0);// macro_rules! register_func {//     (//        $rpc_server:expr, //        $service_path:expr, //        $service_method:expr, //        $service_fn:expr, //        $meta:expr, //        $arg_type:ty, //        $reply_type:ty//     ) => { ... };// }register_func!(rpc_server,"Arith",      // service_path 服务名"Add",        // service_method 服务的方法test,         // service_fn 服务的函数名"".to_owned(),// metaArithAddArgs, // 参数类型ArithAddReply // 响应类型);// pub fn get_fn(//     &self,//     service_path: String,//     service_method: String// ) -> Option<fn(_: &[u8], _: SerializeType) -> Result<Vec<u8, Global>, Error>>let f = rpc_server.get_fn(String::from("Arith"), String::from("Add")) // service_path、service_method.unwrap(); // 返回 fn(_: &[u8], _: SerializeType) -> Result<Vec<u8, Global> 或者 Errorlet s = String::from(r#"{"A":1,"B":2}"#);// 第一个参数是一个u8数组引用,即要传递的内容// 第二个参数是序列化类型let reply = f(s.as_ref(), SerializeType::JSON).unwrap();println!("reply:{}", String::from_utf8(reply).unwrap());
}

service_path service_method service_fn

服务端 —> service_path service_method service_fn 客户端 —> service_path service_method 请求参数

  • service_path
    服务的路径或名字,是一个字符串,用于标识服务
    多数情况下,服务端和客户端应该使用相同的服务路径来进行一次 RPC 调用
    当客户端发起远程调用请求时,需要指定所调用服务的 service_path
  • service_method
    服务的方法名,是一个字符串,用于标识服务中的方法
    同一服务中可能会有多个方法,为了区分不同的方法,需要使用不同的 service_method
    当客户端发起远程调用请求时,需要指定所调用服务的 service_method
  • service_fn
    指的是服务实际提供的函数或方法,它是一个可执行的代码片段,用于处理所接收到的请求并返回响应
    通常,RPC 库会将 service_fn 注册到服务端,并在客户端发起远程调用请求时将请求参数传递给它来处理

学习rpcx示例

框架

tree -L 1 -C -F -I ".*"
./
├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── README.md
├── build.rs
├── clippy.toml
├── examples/
├── rpcx/
├── rpcx_client/
├── rpcx_derive/
├── rpcx_protocol/
├── rpcx_server/
├── rustfmt.toml
├── target/
└── test_suite/

rpcx_server

cat src/lib.rs
use std::{boxed::Box,collections::HashMap,sync::{Arc, RwLock},
};use std::net::SocketAddr;use rpcx_protocol::*;
use std::{io::{BufReader, BufWriter, Write},net::{Shutdown, 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MR混合现实情景实训教学

MR混合现实技术是一种将虚拟现实与现实场景相融合的创新技术&#xff0c;可以广泛应用于各个领域。其中&#xff0c;混合现实情景实训教学是MR技术的一个重要应用场景。 在医学专业方面&#xff0c;医学生常常需要通过实际操作来提升自己的技能水平&#xff0c;然而传统的实训方…

Vue 使用SignalR.JS与Microsoft.AspNetCore.SignalR实时通讯

针对于Web与其他应用的的通讯&#xff0c;在.Net中&#xff0c;SignalR是一个不错的选择&#xff0c;在前后端没有分离的时候&#xff0c;直接引用对应的signalr.js文件即可&#xff1b; 这里主要记录Vue与Asp.netcore 前后端分离通过signalR通讯实践&#xff1b; 服务端即Asp.…

【完美解决】GitHub连接超时问题 Recv failure: Connection was reset

问题&#xff1a; 已经开了梯子但是在Idea中使用git&#xff08;GitHub&#xff09;还是连接超时Recv failure: Connection was reset。此时需要让git走代理。 解决方案&#xff1a; 1.对右下角网络点击右键 -> 打开网络和Internet设置 2.代理 -> 查看到地址和端口号…

图像处理之《基于语义对象轮廓自动生成的生成隐写术》论文精读

一、相关知识 首先我们需要了解传统隐写和生成式隐写的基本过程和区别。传统隐写需要选定一幅封面图像&#xff0c;然后使用某种隐写算法比如LSB、PVD、DCT等对像素进行修改将秘密嵌入到封面图像中得到含密图像&#xff0c;通过信道传输后再利用算法的逆过程提出秘密信息。而生…

React中的受控组件(controlled component)和非受控组件(uncontrolled component)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 组件⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是…

【jmeter】jmeter引用变量,变量值传递失败

最近在用jmeter做接口测试的时候&#xff0c;发现有个变量&#xff0c;参数值一直没有传递进来&#xff0c;导致request的时候&#xff0c;请求体里面一直是${}变量的形式。 后来经过排查发现&#xff0c;是因为我在定义用户变量的时候&#xff0c;在这个now后面多加了一个空格…

ps[001] 初学创建剪切蒙版

前置条件&#xff1a;PS2020版本 技能应用&#xff1a;ps 海报标题和图片结合 1、画布1300*1300像素&#xff0c;altdel设置背景为前景色 2、准备一张绿色的海报&#xff0c;可以百度宫崎骏&#xff0c;找张绿色的图片就可以了 3、拉个文字款&#xff0c;写个SUMMER英文体&a…

《开发实战》17 | 异步处理好用,但非常容易用错

大多数业务项目都是由同步处理、异步处理和定时任务处理三种模式相辅相成实现的。区别于同步处理&#xff0c;异步处理无需同步等待流程处理完毕&#xff0c;因此适用场景主要包括&#xff1a; 服务于主流程的分支流程。比如&#xff0c;在注册流程中&#xff0c;把数据写入数…

Python - flask后端开发笔记

​ Flask入门 有一篇很全面的博客可以参考&#xff1a;Python Flask Web 框架入门 跨域问题处理 from flask_cors import CORS CORS(app,supports_credentialsTrue,origins[url], # 前端url列表 ) 文件发送 from flask import send_from_directory app.route(/download) …

SpringAOP入门案例

package com.elf.spring.aop.aspectj; /*** author 45* version 1.0*/ public interface UsbInterface {public void work(); }package com.elf.spring.aop.aspectj; import org.springframework.stereotype.Component; /*** author 45* version 1.0*/ Component //把Phone对象…

什么是WhatsApp群发,WhatsApp协议,WhatsApp云控

那么WhatsApp群控云控可以做什么呢&#xff1f; 1、获客 自动化引流&#xff0c;强大的可控性&#xff0c;产品快速拓客 2、导流 一键式傻瓜化自动加好友&#xff0c;群发&#xff0c;朋友圈营销 3、群控 一键式拉群好友&#xff0c;建群&#xff0c;进群 …

2w+深度梳理!全网最全NLP面试题总结!

目录 技术交流群 1、命名实体识别常见面试篇2、关系抽取常见面试篇3、事件抽取 常见面试篇4、NLP 预训练算法常见面试篇5、Bert 常见面试篇6、文本分类 常见面试篇7、文本匹配 常见面试篇8、问答系统常见面试篇FAQ 检索式问答系统常见面试篇问答系统工具篇常见面试篇 9、对话系…

【MyBatis】代码生成

FQA 报错&#xff1a;Caused by: java.lang.ClassNotFoundException: com.baomidou.mybatisplus.core.handlers.AnnotationHandler 解决办法 <properties><java.version>1.8</java.version><mybatis-plus>3.5.3.2</mybatis-plus><handlebars…

力扣236 补9.14

做不来&#xff0c;我做中等题基本上都是没有思路&#xff0c;这里需要先遍历祖先节点&#xff0c;那必然用先序遍历&#xff0c;这题还是官方题解容易理解&#xff0c;第二火的题解反而把我弄得脑袋昏昏的。 class Solution { TreeNode ans; public TreeNode lowestCommonAnce…

pwncollege.ReverseEngineering

激情写逆向 5.0 origin [0xC3, 0xC2, 0xDF, 0xC7, 0xC4, 0x00 ] result "" for i in range(5):origin[i] origin [i] ^ 0xB7result chr(origin[i])print(result)5.1 origin [0xa3, 0xb5, 0xb1, 0xb4, 0xa1 ] result "" for i in range(5):origin[i]…

公众号迁移多久可以完成?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;长期以来&#xff0c;由于部分公众号在注册时&#xff0c;主体不准确的历史原因&#xff0c;或者公众号主体发生合并、分立或业务调整等现实状况&#xff0c;在公众号登记主体不能对应实际运营人的情况下&…

Kubernetes面试题--“新手小题库”

Kubernetes基础 1. 什么是Kubernetes&#xff08;K8s&#xff09;&#xff1f;它的主要目标是什么&#xff1f; Kubernetes是一个开源的容器编排平台&#xff0c;用于自动化容器的部署、扩展和管理。其主要目标包括&#xff1a; 自动化&#xff1a;Kubernetes旨在自动化应用…

【精品】通用Mapper 批量更新bug解决方案

问题描述 环境&#xff1a;mysql8.xmybatis3.5.13tk.mybatis4.2.3 在使用tk.mybatis做批量更新时&#xff0c;程序会报错&#xff0c;说是执行的SQL语法错误&#xff0c;经研究源代码发现tk.mybatis在实现批量更新时是通过多次执行update语句实现的。这本身就不符合MySQL批量…

并发编程之并发理论篇--内存模型

目录 一、Java内存模型的介绍 二、内存模型抽象结构 三、主内存与工作内存 四、内存间交互操作 五、内存模型三大特性 六、内存屏障 七、先行发生原则 八、代码示例 一、Java内存模型的介绍 线程安全是指在多个线程同时访问同一个对象时&#xff0c;无论线程调度和交替…

Django之视图

一&#xff09;文件与文件夹 当我们设定好一个Djiango项目时&#xff0c;里面会有着view.py等文件&#xff0c;也就是文件的方式&#xff1a; 那么我们在后续增加app等时&#xff0c;view.py等文件会显得较为臃肿&#xff0c;当然也根据个人习惯&#xff0c;这时我们可以使用…