Microservicios de desarrollo de lenguaje Rust (Dubbo)

1. Introducción

Dubbo Rust lanzó recientemente su primera versión oficial. El objetivo de Dubbo Rust es alinear todos los diseños de funciones principales de Dubbo 3, incluida la comunicación de alto rendimiento basada en HTTP/2, el desarrollo de microservicios fácil de usar y el modo de programación, y brindar un servicio enriquecido. capacidad de gestión, etc. En comparación con otras implementaciones de lenguaje, Dubbo Rust hará un buen uso de las capacidades extremas de rendimiento, seguridad y control del nivel de instrucción del lenguaje Rust.

Condiciones previas
Instale el entorno de desarrollo Rust
Instale la herramienta protoc

2. Use IDL para definir el servicio Dubbo

El servicio de bienvenida se define de la siguiente manera, incluido un servicio Dubbo de modelo Unario (Solicitud - Respuesta).


// ./proto/greeter.proto
syntax = "proto3";

option java_multiple_files = true;

package org.apache.dubbo.sample.tri;

// The request message containing the user's name.
message GreeterRequest{
    
    
  string name = 1;
}

// The response message containing the greetings
message GreeterReply {
    
    
  string message = 1;
}

service Greeter{
    
    
  // unary
  rpc greet(GreeterRequest) returns (GreeterReply);
}

3. Agregue Dubbo-Rust y dependencias relacionadas al proyecto


# ./Cargo.toml
[package]
name = "example-greeter"
version = "0.1.0"
edition = "2021"

[[bin]]
name = "greeter-server"
path = "src/greeter/server.rs"

[[bin]]
name = "greeter-client"
path = "src/greeter/client.rs"

[dependencies]
http = "0.2"
http-body = "0.4.4"
futures-util = {
    
    version = "0.3", default-features = false}
tokio = {
    
     version = "1.0", features = [ "rt-multi-thread", "time", "fs", "macros", "net", "signal"] }
prost-derive = {
    
    version = "0.10", optional = true}
prost = "0.10.4"
async-trait = "0.1.56"
tokio-stream = "0.1"

dubbo = "0.2.0"
dubbo-config = "0.2.0"

[build-dependencies]
dubbo-build = "0.2.0"

4. Configurar Dubbo - Construir para compilar IDL

Cree en el directorio raíz del proyecto (no en el directorio src), cree un archivo build.rs y agregue el siguiente contenido:

// ./build.rs
fn main() {
    
    
    dubbo_build::prost::configure()
        .compile(&["proto/greeter.proto"], &["proto/"])
        .unwrap();
}

Después de esta configuración, la compilación del proyecto puede generar códigos relacionados con Dubbo Stub.
El camino es generalmente en:

./target/debug/build/example-greeter/out/org.apache.dubbo.sample.tri.rs

5. Escriba el código comercial de Dubbo

5.1 Escribir el servidor Dubbo

// ./src/greeter/server.rs
use ...

#[tokio::main]
async fn main() {
    
    
    register_server(GreeterServerImpl {
    
    
        name: "greeter".to_string(),
    });

    // Dubbo::new().start().await;
    Dubbo::new()
        .with_config({
    
    
            let r = RootConfig::new();
            match r.load() {
    
    
                Ok(config) => config,
                Err(_err) => panic!("err: {:?}", _err), // response was droped
            }
        })
        .start()
        .await;
}

#[allow(dead_code)]
#[derive(Default, Clone)]
struct GreeterServerImpl {
    
    
    name: String,
}

// #[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(),
        }))
    }
}

5.2 Configurar dubbo.yaml

dubbo.yaml indica la configuración en el lado del servidor, incluida la lista de servicios expuestos, la configuración del protocolo, la configuración de monitoreo, etc.

# ./dubbo.yaml
name: dubbo
service:
  org.apache.dubbo.sample.tri.Greeter:
    version: 1.0.0
    group: test
    protocol: triple
    registry: ''
    serializer: json
    protocol_configs:
      triple:
        ip: 0.0.0.0
        port: '8888'
        name: triple
protocols:
  triple:
    ip: 0.0.0.0
    port: '8888'
    name: triple

5.3 Escribiendo Cliente Dubbo

// ./src/greeter/client.rs
use ...

#[tokio::main]
async fn main() {
    
    
    let mut cli = GreeterClient::new().with_uri("http://127.0.0.1:8888".to_string());

    println!("# unary call");
    let resp = cli
        .greet(Request::new(GreeterRequest {
    
    
            name: "message from client".to_string(),
        }))
        .await;
    let resp = match resp {
    
    
        Ok(resp) => resp,
        Err(err) => return println!("{:?}", err),
    };
    let (_parts, body) = resp.into_parts();
    println!("Response: {:?}", body);
}

6. Ejecutar y resumir

6.1 compilar

Ejecute la compilación de carga para compilar el servidor y el cliente.

6.2 Servidor en ejecución

Ejecute ./target/debug/greeter-server para ejecutar el servidor. Tal como se configuró en dubbo.yaml arriba, el servidor escuchará el puerto 8888 y proporcionará servicios RPC con el protocolo triple.

$ ./target/debug/greeter-server
2022-09-28T23:33:28.104577Z  INFO dubbo::framework: url: Some(Url {
    
     uri: "triple://0.0.0.0:8888/org.apache.dubbo.sample.tri.Greeter", protocol: "triple", location: "0.0.0.0:8888", ip: "0.0.0.0", port: "8888", service_key: ["org.apache.dubbo.sample.tri.Greeter"], params: {
    
    } })

6.3 Ejecute el Cliente para verificar si la llamada es exitosa

Ejecute ./target/debug/greeter-client para ejecutar Client y llamar a varios métodos en triple://127.0.0.1:8888/org.apache.dubbo.sample.tri.Greeter.

$ ./target/debug/greeter-client
Response: GreeterReply {
    
     message: "hello, dubbo-rust" }

Guess you like

Origin blog.csdn.net/weixin_43114209/article/details/131532901