国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架

這篇具有很好參考價(jià)值的文章主要介紹了Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

krpc-rust 一個(gè)最像RPC框架的Rust-RPC框架

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

剛剛學(xué)習(xí)Rust語(yǔ)言或者沒(méi)怎么了解Rust-RPC框架的同學(xué),可能以為又是一個(gè)標(biāo)題黨了,但實(shí)際上了解過(guò)這部分的同學(xué)都知道,目前來(lái)說(shuō)主流的Rust-RPC框架和實(shí)際定義的RPC框架還是有著很大的差別。我們先看一下隔壁Java是如何實(shí)現(xiàn)的,就拿本項(xiàng)目Java版本 krpc-java 舉例,有興趣學(xué)習(xí)Java-RPC框架的同學(xué)別忘了點(diǎn)個(gè)Star~

krpc

實(shí)現(xiàn)一個(gè)基于netty單路復(fù)用網(wǎng)絡(luò)模型的rpc框架,支持spring-boot啟動(dòng),支持zookeeper,nacos注冊(cè)中心。

以SpringBoot的方式啟動(dòng)

接口示例

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;
   }
}

我們看到只需要定義一個(gè)接口,然后Server端來(lái)實(shí)現(xiàn)這個(gè)接口,Client端給接口加一個(gè)注解,就可以進(jìn)行RPC的調(diào)用了,這是因?yàn)镴ava擁有一個(gè)大殺器就是運(yùn)行時(shí)反射,可以很輕松的在運(yùn)行時(shí)對(duì)類(lèi)進(jìn)行增強(qiáng),但是同樣這也是Java的一大缺點(diǎn)就是因?yàn)檫\(yùn)行時(shí)存在導(dǎo)致程序執(zhí)行降低,那么以高性能著稱(chēng)Rust當(dāng)然不存在運(yùn)行時(shí),但因此也缺少了運(yùn)行時(shí)反射這一功能,那么目前主流的Rust-RPC框架是怎么解決這個(gè)問(wèn)題的?目前市面上有兩大產(chǎn)品分別是阿里的Dubbo和字節(jié)的Volo,首先我們看 Dubbo 怎么做的吧。

Dubbo 快速入門(mén)章節(jié)中介紹了Dubbo Rust的使用方法,其實(shí)主要是分為三個(gè)部分

第一部分定義接口,dubbo目前支持很多協(xié)議,其中還支持gRPC協(xié)議,其中Rust版本就是通過(guò)ProtoBuf協(xié)議來(lái)實(shí)現(xiàn)接口

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc

第二部則是通過(guò)定義文件實(shí)現(xiàn)相關(guān)的Rust代碼,因?yàn)镽ust沒(méi)有運(yùn)行時(shí),所以Client調(diào)用時(shí)沒(méi)有辦法通過(guò)動(dòng)態(tài)代理的方式生成client類(lèi),而dubbo的解決方法就是通過(guò)定義接口內(nèi)容生成相關(guān)的Client調(diào)用代碼,來(lái)"降低"使用者的使用成本。

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc

第三部分則是編寫(xiě)相關(guān)的Server端代碼邏輯,然后通過(guò)生成的Client代碼進(jìn)行RPC調(diào)用

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc
Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc

字節(jié)的Volo其實(shí)大體也是這個(gè)思路,通過(guò)IDL定義接口,然后通過(guò)腳手架腳本生成調(diào)用相關(guān)代碼。有興趣的同學(xué)可以看一下 Volo-grpc 的快速開(kāi)始

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc

總結(jié)下來(lái)就是通過(guò)接口定義使用腳本生成調(diào)用代碼和服務(wù)接口,然后進(jìn)行Server端業(yè)務(wù)實(shí)現(xiàn)和Client調(diào)用。

這樣看下來(lái)Dubbo和Volo的實(shí)現(xiàn),尤其對(duì)比Java版本的實(shí)現(xiàn)來(lái)說(shuō),是不是離真正的RPC框架還有很大的差距,包括還存在很多的問(wèn)題,比如

  1. 必須使用RPC接口的一些規(guī)范,比如響應(yīng)什么錯(cuò)誤碼。
// #[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的調(diào)用時(shí)請(qǐng)求體必須包裝成代碼生成的樣式。
    let req = volo_gen::proto_gen::hello::HelloRequest {
        name: FastStr::from_static_str("Volo"),
    };
  1. 關(guān)鍵是如果想修改請(qǐng)求響應(yīng)字段或者新增接口時(shí),那我們必現(xiàn)通過(guò)腳本來(lái)重新生成所有代碼,包括Client端和Server端,我們都知道對(duì)于軟件質(zhì)量有要求的公司,在改動(dòng)代碼時(shí)都必需評(píng)估影響范圍然后交由測(cè)試,那么是不是意味則我們有一些小的調(diào)整的話就得讓測(cè)試進(jìn)行全部的測(cè)試?

那么Rust沒(méi)有運(yùn)行時(shí)反射是不是也是個(gè)"缺點(diǎn)"?目前來(lái)看確實(shí)是這樣的,兩大廠都只能交出這么一個(gè)不令我們滿意的答案,Java有反射這個(gè)大殺器才在微服務(wù)領(lǐng)域獨(dú)領(lǐng)風(fēng)騷,那Rust有什么辦法可以在微服務(wù)領(lǐng)域也挑戰(zhàn)Java呢?那就不得不提Rust宏這個(gè)核彈級(jí)武器了。

Rust 宏

Rust宏大家都戲稱(chēng)可以通過(guò)宏來(lái)實(shí)現(xiàn)另一種編程語(yǔ)言,可見(jiàn)宏的強(qiáng)大之處,我們都知道宏是作用于編譯期,那么我們就拿宏來(lái)實(shí)現(xiàn)一個(gè)編譯期的反射不就行了嗎?事實(shí)也的確可以,說(shuō)了上面那么大一段廢話,下面接入正題,看一看 krpc-rust 是如果進(jìn)行RPC調(diào)用的

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: "我是一個(gè)DB數(shù)據(jù)庫(kù)".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);
}

我們直接運(yùn)行一下來(lái)看

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc

這是不是才是RPC框架因有的樣子?看到這里的同學(xué)是不是得本項(xiàng)目點(diǎn)個(gè)Star感謝支持,這個(gè)項(xiàng)目是一個(gè)很好的學(xué)習(xí)項(xiàng)目,同時(shí)也希望通過(guò)這個(gè)項(xiàng)目能讓Rust在微服務(wù)領(lǐng)域同樣有所發(fā)展。得益于Rust零抽象成本的概念,本項(xiàng)目當(dāng)然也以高性能為目標(biāo),那我們就簡(jiǎn)單做個(gè)壓力測(cè)試唄,因?yàn)镈ubbo目前開(kāi)源的版本示例我弄了一會(huì)兒沒(méi)跑起來(lái)…那么我們就和Volo比一下。

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

本次壓測(cè)機(jī)器是MacBook Pro M1 16 + 512
壓測(cè)內(nèi)容是四百萬(wàn)請(qǐng)求,異步線程數(shù)client端和server端各512,因?yàn)镽PC調(diào)用時(shí)IO密集型所有多開(kāi)一些線程。下面是測(cè)試腳本

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc


krpc-rust 測(cè)試結(jié)果 四百萬(wàn)請(qǐng)求,平均47秒跑完,每秒8.5w+QTS?。?!而且內(nèi)存占用也比較穩(wěn)定

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc


只能說(shuō)不愧是Rust,Java表示實(shí)名制羨慕...
接著我們看Volo的表現(xiàn)。
額。。。出現(xiàn)點(diǎn)狀況,測(cè)試100并發(fā)的時(shí)候還挺好好使,但是壓測(cè)時(shí)內(nèi)存和耗時(shí)異常高,因?yàn)闉榱藟簻y(cè)關(guān)掉了日志打印,那么打開(kāi)日志再看一下,結(jié)果

Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架,rust,微服務(wù),rpc

設(shè)置到500并發(fā)時(shí),socket連接就出現(xiàn)了錯(cuò)誤,500個(gè)請(qǐng)求只成功了139個(gè),可能目前Volo還存在一些問(wèn)題,不過(guò)影響不大,我們已經(jīng)證明了Rust在微服務(wù)領(lǐng)域其實(shí)是有機(jī)會(huì)干掉Java的。

如果感興趣的同學(xué)可以一起討論學(xué)習(xí),目前本項(xiàng)目還有需要工作需要做,比如說(shuō)異常的處理,多組件的支持,服務(wù)的注冊(cè)和發(fā)現(xiàn),但是框架骨架已搭建并驗(yàn)證完畢,未來(lái)可期~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-817408.html

到了這里,關(guān)于Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 RPC 服務(wù)

    分享一個(gè)簡(jiǎn)單的 rpc 服務(wù)框架 一、服務(wù)端實(shí)現(xiàn) 二、客戶端實(shí)現(xiàn)

    2024年04月10日
    瀏覽(30)
  • 安卓10-終于來(lái)了,能吃上的只有這些手機(jī)!

    安卓10-終于來(lái)了,能吃上的只有這些手機(jī)!

    這也意味著在 Android 9 上短暫出現(xiàn)的“藥丸”home 鍵操作,在服役短短一年之后就告別歷史舞臺(tái),不過(guò)對(duì)于國(guó)內(nèi)的安卓用戶并沒(méi)有太大影響, 大多數(shù)用戶都隨著手機(jī)廠商提前進(jìn)入了全面屏手勢(shì)操作。 另一個(gè)肉眼可見(jiàn)的明顯變化,是全局夜間模式。在此前曾出現(xiàn)過(guò)系統(tǒng) UI 能變成

    2024年04月14日
    瀏覽(16)
  • HuggingChat來(lái)了-各種Chat這么火Huggingface終于也忍不住了

    HuggingChat來(lái)了-各種Chat這么火Huggingface終于也忍不住了

    網(wǎng)址:HuggingChat 當(dāng)前使用模型:OpenAssistant/oasst-sft-6-llama-30b-xor · Hugging Face 當(dāng)前數(shù)據(jù):OpenAssistant/oasst1 · Datasets at Hugging Face 現(xiàn)在你如果進(jìn)入Huggingface的網(wǎng)站,你會(huì)發(fā)現(xiàn)HuggingFace偷偷的上了Chat功能: 點(diǎn)擊starting chatting之后的界面是這樣的: 和其他的Chat的界面很類(lèi)似??梢钥吹浆F(xiàn)

    2024年02月09日
    瀏覽(26)
  • 一直在期待的基于 Ubuntu 的滾動(dòng)發(fā)布 Rhino Linux 終于來(lái)了

    一直在期待的基于 Ubuntu 的滾動(dòng)發(fā)布 Rhino Linux 終于來(lái)了

    導(dǎo)讀 現(xiàn)在我們就一起來(lái)看看 Rhino?Linux?有哪些值得特別關(guān)注的地方。 Hands of an office woman typing 你可能還記得我們 去年 報(bào)道過(guò),Rhino Linux 將會(huì)接替現(xiàn)已停止開(kāi)發(fā)的 “Rolling Rhino Remix”。 經(jīng)過(guò)漫長(zhǎng)的等待,它的首個(gè)穩(wěn)定版本終于發(fā)布了! 現(xiàn)在我們就一起來(lái)看看 Rhino Linux 有哪些

    2024年02月11日
    瀏覽(19)
  • 利用Chat GPT建立一個(gè)To-Do應(yīng)用程序--我們終于遇到了我們的替代者嗎?

    利用Chat GPT建立一個(gè)To-Do應(yīng)用程序--我們終于遇到了我們的替代者嗎?

    海外Udemy、Coursera、Skillshare、Cantrill等平臺(tái)精品編碼課程,請(qǐng)?jiān)L問(wèn) https://www.postcode.vip 我們看到GitHub Copilot在2021年10月發(fā)布,整個(gè)開(kāi)發(fā)社區(qū)都瘋了。 有些人聲稱(chēng)我們很快就會(huì)失去工作,而其他人,像我一樣,認(rèn)為雖然這個(gè)工具很有趣,但它離替代品還很遠(yuǎn)。它可以提供更好的自

    2023年04月23日
    瀏覽(28)
  • AI繪畫(huà)stablediffusion comfyui SDXL Controlnet模型終于全了 tile來(lái)了

    AI繪畫(huà)stablediffusion comfyui SDXL Controlnet模型終于全了 tile來(lái)了

    以前一直在直播中吐槽說(shuō)不建議大家用SDXL生態(tài),即便已經(jīng)出來(lái)了Turbo,即便除了SDXLLighting等等周邊但是我們最最喜歡用的controlnet還是補(bǔ)全,即便是現(xiàn)在也不算完全意義的全,但是最起碼我們今天呢能夠帶來(lái)第一個(gè)期待已久的tile模型,和隱藏款的QRmonsterXL(小聲使用,別人還不

    2024年04月25日
    瀏覽(25)
  • 騰訊云輕量應(yīng)用服務(wù)器性能如何?測(cè)評(píng)來(lái)了

    騰訊云輕量應(yīng)用服務(wù)器性能如何?測(cè)評(píng)來(lái)了

    騰訊云輕量應(yīng)用服務(wù)器性能如何?CPU型號(hào)主頻、內(nèi)存、公網(wǎng)帶寬和系統(tǒng)盤(pán)存儲(chǔ)多維對(duì)比,輕量應(yīng)用服務(wù)器會(huì)不會(huì)比云服務(wù)器CVM性能差?相對(duì)于CVM云服務(wù)器輕量服務(wù)器更適合輕量級(jí)的應(yīng)用,輕量服務(wù)適合中小企或個(gè)人開(kāi)發(fā)者用于搭建We網(wǎng)站b應(yīng)用、小程序、APP以及開(kāi)發(fā)測(cè)試環(huán)境等

    2024年02月11日
    瀏覽(27)
  • AI繪畫(huà)Stable diffusion 4.7最新版終于來(lái)了!一鍵安裝,本地部署!

    AI繪畫(huà)Stable diffusion 4.7最新版終于來(lái)了!一鍵安裝,本地部署!

    如果這個(gè)世界有上帝,那么他一定是程序員。 國(guó)內(nèi)SD繪畫(huà)啟動(dòng)器第一人是我認(rèn)為是B站的秋葉aaaki 因?yàn)橹谱髁诉@款Stable Diffusion啟動(dòng)器,降低了國(guó)內(nèi)使用SD的門(mén)檻,秋葉被粉絲戲稱(chēng)賽博菩薩。 ▍Stable Diffusion 是什么? Stable Diffusion(簡(jiǎn)稱(chēng)SD)是一種生成式人工智能,于2022年發(fā)布,

    2024年04月14日
    瀏覽(43)
  • 超音速亞原子 Java 框架來(lái)了,0.0015 秒內(nèi)啟動(dòng)一個(gè)應(yīng)用,太快了。。

    超音速亞原子 Java 框架來(lái)了,0.0015 秒內(nèi)啟動(dòng)一個(gè)應(yīng)用,太快了。。

    來(lái)源:juejin.cn/post/7023317351563001886 SpringBoot框架不用多介紹,Java程序員想必都知道。相對(duì)來(lái)說(shuō)熟悉Quarkus的人可能會(huì)少一些。Quarkus首頁(yè)放出的標(biāo)語(yǔ):超音速亞原子的Java(Supersonic Subatomic Java)。 它是為 OpenJDK HotSpot 和 GraalVM 量身定制的 Kubernetes Native Java 框架,基于同類(lèi)最佳的

    2024年02月05日
    瀏覽(20)
  • 剛剛!Stable diffusion 4.7+ComfyUI升級(jí)版終于來(lái)了?。ㄒ绘I安裝包,感謝大佬)

    剛剛!Stable diffusion 4.7+ComfyUI升級(jí)版終于來(lái)了?。ㄒ绘I安裝包,感謝大佬)

    「 無(wú)套路!文末提供免費(fèi)下載 」 如果這個(gè)世界有上帝,那么祂一定是程序員。 國(guó)內(nèi)SD繪畫(huà)啟動(dòng)器第一人是我認(rèn)為是B站的秋葉aaaki 因?yàn)橹谱髁诉@款Stable Diffusion啟動(dòng)器,降低了國(guó)內(nèi)使用SD的門(mén)檻且分文不收,秋葉被粉絲戲稱(chēng)賽博菩薩。 1 Stable Diffusion(簡(jiǎn)稱(chēng)SD)是一種生成式人工

    2024年04月25日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包