Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架

这篇具有很好参考价值的文章主要介绍了Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

krpc-rust 一个最像RPC框架的Rust-RPC框架

https://github.com/kwsc98/krpc-rust

刚刚学习Rust语言或者没怎么了解Rust-RPC框架的同学,可能以为又是一个标题党了,但实际上了解过这部分的同学都知道,目前来说主流的Rust-RPC框架和实际定义的RPC框架还是有着很大的差别。我们先看一下隔壁Java是如何实现的,就拿本项目Java版本 krpc-java 举例,有兴趣学习Java-RPC框架的同学别忘了点个Star~

krpc

实现一个基于netty单路复用网络模型的rpc框架,支持spring-boot启动,支持zookeeper,nacos注册中心。

以SpringBoot的方式启动

接口示例

public interface ExampeService {
   ResponseDTO doRun(RequestDTO requestDTO);
}

Customer

配置application.properties

krpc.registeredPath = nacos://114.116.3.221:8848

@KrpcResource(version = "1.0.1",timeout = 1000)
private ExampeService exampeService;

Provider

配置application.properties

krpc.registeredPath = nacos://114.116.3.221:8848

krpc.port = 8082

@KrpcService(version = "1.0.1")
public class ExampeServiceImpl implements ExampeService {
   
   @Override
   public ResponseDTO doRun(RequestDTO requestDTO) {
       ResponseDTO responseDTO = new ResponseDTO();
       responseDTO.setDate(new Date(requestDTO.getDate().getTime() + (long) requestDTO.getNum() * 60 * 60 * 1000));
       return responseDTO;
   }
}

我们看到只需要定义一个接口,然后Server端来实现这个接口,Client端给接口加一个注解,就可以进行RPC的调用了,这是因为Java拥有一个大杀器就是运行时反射,可以很轻松的在运行时对类进行增强,但是同样这也是Java的一大缺点就是因为运行时存在导致程序执行降低,那么以高性能著称Rust当然不存在运行时,但因此也缺少了运行时反射这一功能,那么目前主流的Rust-RPC框架是怎么解决这个问题的?目前市面上有两大产品分别是阿里的Dubbo和字节的Volo,首先我们看 Dubbo 怎么做的吧。

Dubbo 快速入门章节中介绍了Dubbo Rust的使用方法,其实主要是分为三个部分

第一部分定义接口,dubbo目前支持很多协议,其中还支持gRPC协议,其中Rust版本就是通过ProtoBuf协议来实现接口

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc

第二部则是通过定义文件实现相关的Rust代码,因为Rust没有运行时,所以Client调用时没有办法通过动态代理的方式生成client类,而dubbo的解决方法就是通过定义接口内容生成相关的Client调用代码,来"降低"使用者的使用成本。

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc

第三部分则是编写相关的Server端代码逻辑,然后通过生成的Client代码进行RPC调用

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc
Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc

字节的Volo其实大体也是这个思路,通过IDL定义接口,然后通过脚手架脚本生成调用相关代码。有兴趣的同学可以看一下 Volo-grpc 的快速开始

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc

总结下来就是通过接口定义使用脚本生成调用代码和服务接口,然后进行Server端业务实现和Client调用。

这样看下来Dubbo和Volo的实现,尤其对比Java版本的实现来说,是不是离真正的RPC框架还有很大的差距,包括还存在很多的问题,比如

  1. 必须使用RPC接口的一些规范,比如响应什么错误码。
// #[async_trait]
#[async_trait]
impl Greeter for GreeterServerImpl {
    async fn greet(
        &self,
        request: Request<GreeterRequest>,
    ) -> Result<Response<GreeterReply>, dubbo::status::Status> {
        println!("GreeterServer::greet {:?}", request.metadata);

        Ok(Response::new(GreeterReply {
            message: "hello, dubbo-rust".to_string(),
        }))
    }
}
  1. Client的调用时请求体必须包装成代码生成的样式。
    let req = volo_gen::proto_gen::hello::HelloRequest {
        name: FastStr::from_static_str("Volo"),
    };
  1. 关键是如果想修改请求响应字段或者新增接口时,那我们必现通过脚本来重新生成所有代码,包括Client端和Server端,我们都知道对于软件质量有要求的公司,在改动代码时都必需评估影响范围然后交由测试,那么是不是意味则我们有一些小的调整的话就得让测试进行全部的测试?

那么Rust没有运行时反射是不是也是个"缺点"?目前来看确实是这样的,两大厂都只能交出这么一个不令我们满意的答案,Java有反射这个大杀器才在微服务领域独领风骚,那Rust有什么办法可以在微服务领域也挑战Java呢?那就不得不提Rust宏这个核弹级武器了。

Rust 宏

Rust宏大家都戏称可以通过宏来实现另一种编程语言,可见宏的强大之处,我们都知道宏是作用于编译期,那么我们就拿宏来实现一个编译期的反射不就行了吗?事实也的确可以,说了上面那么大一段废话,下面接入正题,看一看 krpc-rust 是如果进行RPC调用的

Server

use krpc_core::server::KrpcServer;
use krpc_macro::krpc_server;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Default, Debug)]
struct ReqDto {
   str: String,
}

#[derive(Serialize, Deserialize, Default)]
struct ResDto {
   str: String,
}

#[derive(Clone)]
struct TestServer {
   _db: String,
}

krpc_server! {
  TestServer,
  "1.0.0",
  async fn do_run1(&self,res : ReqDto) -> ResDto {
   println!("{:?}" ,res);
   return ResDto { str : "TestServer say hello 1".to_string()};
  }
  async fn do_run2(&self,res : ReqDto) -> ResDto {
   println!("{:?}" ,res);
   return ResDto { str : "TestServer say hello 2".to_string()};
  }
}

#[tokio::main(worker_threads = 512)]
async fn main() {
   let server: TestServer = TestServer {
       _db: "我是一个DB数据库".to_string(),
   };
   KrpcServer::build()
       .set_port("8081")
       .add_rpc_server(Box::new(server))
       .run()
       .await;
} 

Client

use krpc_core::client::KrpcClient;
use krpc_macro::krpc_client;
use lazy_static::lazy_static;
use serde::{Deserialize, Serialize};

lazy_static! {
    static ref CLI: KrpcClient = KrpcClient::build("http://127.0.0.1:8081".to_string());
}

#[derive(Serialize, Deserialize, Default, Debug)]
struct ReqDto {
    str: String,
}

#[derive(Serialize, Deserialize, Default,Debug)]
struct ResDto {
    str: String,
}

struct TestServer;

krpc_client! {
   CLI,
   TestServer,
   "1.0.0",
   async fn do_run1(&self,res : ReqDto) -> ResDto
   async fn do_run2(&self,res : ReqDto) -> ResDto 
}

#[tokio::main(worker_threads = 512)]
async fn main() {
    let client = TestServer;
    let res = client.do_run1(ReqDto{str : "client say hello 1".to_string()}).await;
    println!("{:?}",res);
    let res = client.do_run2(ReqDto{str : "client say hello 2".to_string()}).await;
    println!("{:?}",res);
}

我们直接运行一下来看

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc

这是不是才是RPC框架因有的样子?看到这里的同学是不是得本项目点个Star感谢支持,这个项目是一个很好的学习项目,同时也希望通过这个项目能让Rust在微服务领域同样有所发展。得益于Rust零抽象成本的概念,本项目当然也以高性能为目标,那我们就简单做个压力测试呗,因为Dubbo目前开源的版本示例我弄了一会儿没跑起来…那么我们就和Volo比一下。

https://github.com/kwsc98/krpc-rust

本次压测机器是MacBook Pro M1 16 + 512
压测内容是四百万请求,异步线程数client端和server端各512,因为RPC调用时IO密集型所有多开一些线程。下面是测试脚本

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc


krpc-rust 测试结果 四百万请求,平均47秒跑完,每秒8.5w+QTS!!!而且内存占用也比较稳定

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc


只能说不愧是Rust,Java表示实名制羡慕...
接着我们看Volo的表现。
额。。。出现点状况,测试100并发的时候还挺好好使,但是压测时内存和耗时异常高,因为为了压测关掉了日志打印,那么打开日志再看一下,结果

Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架,rust,微服务,rpc

设置到500并发时,socket连接就出现了错误,500个请求只成功了139个,可能目前Volo还存在一些问题,不过影响不大,我们已经证明了Rust在微服务领域其实是有机会干掉Java的。

如果感兴趣的同学可以一起讨论学习,目前本项目还有需要工作需要做,比如说异常的处理,多组件的支持,服务的注册和发现,但是框架骨架已搭建并验证完毕,未来可期~文章来源地址https://www.toymoban.com/news/detail-817408.html

到了这里,关于Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang 实现一个简单的 RPC 服务

    分享一个简单的 rpc 服务框架 一、服务端实现 二、客户端实现

    2024年04月10日
    浏览(45)
  • 安卓10-终于来了,能吃上的只有这些手机!

    这也意味着在 Android 9 上短暂出现的“药丸”home 键操作,在服役短短一年之后就告别历史舞台,不过对于国内的安卓用户并没有太大影响, 大多数用户都随着手机厂商提前进入了全面屏手势操作。 另一个肉眼可见的明显变化,是全局夜间模式。在此前曾出现过系统 UI 能变成

    2024年04月14日
    浏览(35)
  • HuggingChat来了-各种Chat这么火Huggingface终于也忍不住了

    网址:HuggingChat 当前使用模型:OpenAssistant/oasst-sft-6-llama-30b-xor · Hugging Face 当前数据:OpenAssistant/oasst1 · Datasets at Hugging Face 现在你如果进入Huggingface的网站,你会发现HuggingFace偷偷的上了Chat功能: 点击starting chatting之后的界面是这样的: 和其他的Chat的界面很类似。可以看到现

    2024年02月09日
    浏览(54)
  • 一直在期待的基于 Ubuntu 的滚动发布 Rhino Linux 终于来了

    导读 现在我们就一起来看看 Rhino Linux 有哪些值得特别关注的地方。 Hands of an office woman typing 你可能还记得我们 去年 报道过,Rhino Linux 将会接替现已停止开发的 “Rolling Rhino Remix”。 经过漫长的等待,它的首个稳定版本终于发布了! 现在我们就一起来看看 Rhino Linux 有哪些

    2024年02月11日
    浏览(45)
  • 利用Chat GPT建立一个To-Do应用程序--我们终于遇到了我们的替代者吗?

    海外Udemy、Coursera、Skillshare、Cantrill等平台精品编码课程,请访问 https://www.postcode.vip 我们看到GitHub Copilot在2021年10月发布,整个开发社区都疯了。 有些人声称我们很快就会失去工作,而其他人,像我一样,认为虽然这个工具很有趣,但它离替代品还很远。它可以提供更好的自

    2023年04月23日
    浏览(45)
  • AI绘画stablediffusion comfyui SDXL Controlnet模型终于全了 tile来了

    以前一直在直播中吐槽说不建议大家用SDXL生态,即便已经出来了Turbo,即便除了SDXLLighting等等周边但是我们最最喜欢用的controlnet还是补全,即便是现在也不算完全意义的全,但是最起码我们今天呢能够带来第一个期待已久的tile模型,和隐藏款的QRmonsterXL(小声使用,别人还不

    2024年04月25日
    浏览(151)
  • 腾讯云轻量应用服务器性能如何?测评来了

    腾讯云轻量应用服务器性能如何?CPU型号主频、内存、公网带宽和系统盘存储多维对比,轻量应用服务器会不会比云服务器CVM性能差?相对于CVM云服务器轻量服务器更适合轻量级的应用,轻量服务适合中小企或个人开发者用于搭建We网站b应用、小程序、APP以及开发测试环境等

    2024年02月11日
    浏览(55)
  • AI绘画Stable diffusion 4.7最新版终于来了!一键安装,本地部署!

    如果这个世界有上帝,那么他一定是程序员。 国内SD绘画启动器第一人是我认为是B站的秋葉aaaki 因为制作了这款Stable Diffusion启动器,降低了国内使用SD的门槛,秋叶被粉丝戏称赛博菩萨。 ▍Stable Diffusion 是什么? Stable Diffusion(简称SD)是一种生成式人工智能,于2022年发布,

    2024年04月14日
    浏览(68)
  • 超音速亚原子 Java 框架来了,0.0015 秒内启动一个应用,太快了。。

    来源:juejin.cn/post/7023317351563001886 SpringBoot框架不用多介绍,Java程序员想必都知道。相对来说熟悉Quarkus的人可能会少一些。Quarkus首页放出的标语:超音速亚原子的Java(Supersonic Subatomic Java)。 它是为 OpenJDK HotSpot 和 GraalVM 量身定制的 Kubernetes Native Java 框架,基于同类最佳的

    2024年02月05日
    浏览(32)
  • 刚刚!Stable diffusion 4.7+ComfyUI升级版终于来了!(一键安装包,感谢大佬)

    「 无套路!文末提供免费下载 」 如果这个世界有上帝,那么祂一定是程序员。 国内SD绘画启动器第一人是我认为是B站的秋葉aaaki 因为制作了这款Stable Diffusion启动器,降低了国内使用SD的门槛且分文不收,秋叶被粉丝戏称赛博菩萨。 1 Stable Diffusion(简称SD)是一种生成式人工

    2024年04月25日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包