是否可以将 grpc 客户端置于应用程序状态,然后将其拉入处理程序?

问题描述 投票:0回答:1
Actix-Web 上的网关微服务。 是否可以将 grpc 客户端置于应用程序状态,然后将其拉入处理程序? 避免在每个处理程序中创建它。 如果可以的话我该怎么做?

[main.rs]


#[actix_rt::main] async fn main() -> std::io::Result<()> { let channel = Channel::from_static("http://127.0.0.1:5051") .connect() .await.unwrap(); let token = AsciiMetadataValue::from_static("..."); let mut user_client = UserServiceClient::with_interceptor(channel, move |mut req: Request<()>| { req.metadata_mut().insert("authorization", token); Ok(req) }); let shared_data = web::Data::new(State { user_client: user_client, }); let app = move || { App::new() .app_data(shared_data.clone()) ... ... }

[user_handler.rs]


pub async fn get_users(path: web::Path<(i64,i64)>, state: web::Data<State>,) -> Result<HttpResponse, AppError> { let request = tonic::Request::new(...); let mut client = UserServiceClient::connect("http://127.0.0.1:5051").await?; let mut grpc_response = client.list_users(request).await?.into_inner(); let json_response: UsersListResponse = grpc_response.into(); Ok(HttpResponse::Ok().json(json_response)) }

[state.rs]


pub struct State { pub user_client: UserServiceClient<InterceptedService<Channel, fn(Request<()>) -> Result<Request<()>, Status>>>, }

rust protocol-buffers grpc actix-web
1个回答
0
投票
将闭包更改为单独的函数

fn user_client_handler(mut req: Request<()>) -> Result<Request<()>, Status> { req.metadata_mut().insert("authorization", token); Ok(req) } let mut user_client = UserServiceClient::with_interceptor(channel,user_client_handler);
这是因为在你的定义中你使用了函数指针

fn(Request<()>) -> Result<Request<()>, Status>
注意小写的“fn”,如果你想使用闭包,你需要使用

impl Fn(Request<()>) -> Result<Request<()>, Status>
    
© www.soinside.com 2019 - 2024. All rights reserved.