首页 > 其他分享 >spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ④ nacos-client

spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ④ nacos-client

时间:2024-12-31 22:30:09浏览次数:1  
标签:name service nacos client let naming rust

1. toml依赖

nacos_rust_client = "0.3"
local_ipaddress = "0.1"

2. 代码

//todo 维护实时服务列表,用来在请求到来时选择转发至具体的服务

use std::sync::Arc;

use log::debug;
use nacos_rust_client::client::{
    naming_client::{
        Instance, InstanceDefaultListener, QueryInstanceListParams, ServiceInstanceKey,
    },
    ClientBuilder,
};

use super::config::Config;

pub async fn init_nacos() {
    let server_name = Config::global().server_name();
    let server_port = Config::global().server_port();
    let nacos_ip = Config::global().nacos_ip();
    let nacos_port = Config::global().nacos_port();
    let nacos_group_name = Config::global().nacos_group();
    //这里小小的吐槽一下rnacos的大神,希望能把这个u32的端口号类型更新成跟其他工具一样,我看作者说用的actix-web,我试过actix,它的端口号也是u16的哈
    connect(&server_name, server_port as u32, &nacos_ip, nacos_port as u32, &nacos_group_name);
    add_service_listinner(&server_name, &nacos_group_name).await;
}

//注册
pub fn connect(service_name: &str, service_port: u32, nacos_ip: &str, nacos_port: u32 ,nacos_group_name: &str) {
    let nacos_addr = &format!("{}:{}", nacos_ip, nacos_port);
    ClientBuilder::new()
        .set_endpoint_addrs(nacos_addr)
        .set_use_grpc(true)//使用grpc,不用可以设置为false
        .build_naming_client();
    let ip = local_ipaddress::get().unwrap();
    let instance = Instance::new_simple(&ip, service_port, service_name, nacos_group_name);
    let naming_client = nacos_rust_client::get_last_naming_client().unwrap();
    //向nacos注册
    naming_client.register(instance);
}

//获取服务列表
pub async fn get_service_list(service_name: &str, group_name: &str) {
    let naming_client = nacos_rust_client::get_last_naming_client().unwrap();
    let query = QueryInstanceListParams::new_simple(service_name, group_name);
    let instance_list = naming_client.query_instances(query).await;
    debug!("instance list is : {:?}", instance_list);
}

//监听服务上下线的变化
pub async fn add_service_listinner(service_name: &str, group_name: &str) {
    let naming_client = nacos_rust_client::get_last_naming_client().unwrap();
    let servcie_key = ServiceInstanceKey::new(service_name, group_name);
    let default_listener = InstanceDefaultListener::new(
        *Box::new(servcie_key),
        Some(Arc::new(|instances, add_list, remove_list| {
            let service_name = if instances.len() > 0 {
                &instances[0].service_name
            } else if add_list.len() > 0 {
                &add_list[0].service_name
            } else {
                &remove_list[0].service_name
            };
            let service_name: Vec<&str> = service_name.split("@@").collect();
            debug!(
                "{} instances changed, list:{:?},add count:{},remove count:{}",
                &service_name[1],
                instances,
                add_list.len(),
                remove_list.len()
            );
        })),
    );
    naming_client
        .subscribe(Box::new(default_listener))
        .await
        .unwrap();
}

//向注册中心请求一个已注册服务
pub async fn select_service(service_name: &str, group_name: &str) -> String { 
    let query = QueryInstanceListParams::new_simple(service_name, group_name);
    let naming_client = nacos_rust_client::get_last_naming_client().unwrap();
    match naming_client.select_instance(query).await {
        Ok(instances) => {
            let target_address = format!("{}:{}", &instances.ip, &instances.port);
            debug!("select instance {}", &target_address);
            target_address
        }
        Err(e) => {
            debug!("select_instance error {:?}", &e);
            "".to_string()
        }
    }
}

标签:name,service,nacos,client,let,naming,rust
From: https://www.cnblogs.com/jiajie6591/p/18644851

相关文章

  • spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发naco
    1.toml依赖toml="0.8"2.代码由于项目还未完成,部分配置(如数据库等)还未增加,后续更新增加uselog::info;useserde::Deserialize;usestd::{fs,sync::LazyLock};usecrate::init::constant::*;//创建全局静态配置文件staticCONFIG:LazyLock<Config>=LazyL......
  • spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发na
    1.toml依赖hyper={version="1",features=["full"]}tokio={version="1",features=["full"]}http-body-util="0.1"hyper-util={version="0.1",features=["full"]}2.......
  • Rust f64详解
    一、Rust中的f64类型与IEEE754双精度浮点数Rust中的f64类型是一个双精度浮点数类型,它严格遵循IEEE754双精度标准。这意味着f64类型在Rust中的存储和表示方式与IEEE754双精度浮点数完全一致。二、存储格式f64类型由64位二进制数表示,分为以下三部分:1.符号位(1位):位置:第......
  • MQTT不同ClientID订阅同一个topic消息独立接收
    EMQX使用宝塔安装的docker版本的emqx(Docker应用)1.0.1方案一(弃用):mountpoint旧版本中的配置项,用于为客户端的MQTT消息主题动态添加前缀(如客户端ID)。这一功能在EMQX4.x版本中有效,但在EMQX5.x中被废弃,原因是EMQX5.x的架构和配置方式全面升级,不再支持此类静态配置。......
  • rust学习十五.3、智能指针相关的Deref和Drop特质
     一、前言智能指针为什么称为智能指针?大概因为它所包含的额外功能。这些额外的功能使得编码或者运行时让指针看起来更有效、并体现某些“智”的特征,所以,我猜测这应该是rust发明人这么称呼此类对象为智能的原因。 据前面有关章节所述,我们知道智能指针多基于结构体(struct)扩......
  • [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(00):iced简单窗口的实现以及在窗口显
    前言本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。环境配置系统:window10平台:visualstudiocode语言:rust......
  • 【Rust自学】8.6. HashMap Pt.2:更新HashMap
    8.6.0.本章内容第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编译时就确定,在运行时它们......
  • debian11安装mysql-client
    1、进入下载页面MySQL::DownloadMySQLCommunityServer(ArchivedVersions)2、下载客户端相关的包cd/tmpwgetmysql-common_8.4.0-1debian11_amd64.debwgetmysql-community-client-plugins_8.4.0-1debian11_amd64.debwgetmysql-community-client-core_8.4.0-1debian......
  • 【Rust自学】8.4. String类型 Pt.2:字节、标量值、字形簇以及字符串的各类操作
    8.4.0.本章内容第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编译时就确定,在运行时它们......
  • 【Rust自学】5.2. struct使用例(加打印调试信息)
    对不起我都写到第8章了才发现我忘记发这一篇了,现在补上,不过这可能导致专栏的文章顺序有一点问题,但也只能将就着了。喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)5.2.1.例子需求创建一个函数,计算长方形的面积,长......