1. toml依赖

nacos_rust_client = "0.3"
local_ipaddress = "0.1"
ahash = "0.8"
arc-swap = "1"

2. 代码

2025-01-17更新: 新增全局服务地址缓存

use std::sync::{Arc, LazyLock};

use ahash::AHashMap;
use arc_swap::ArcSwap;
use log::{error, info};
use nacos_rust_client::client::{
naming_client::{
Instance, InstanceDefaultListener, QueryInstanceListParams, ServiceInstanceKey,
}, ClientBuilder
}; use crate::init::config::Config; //由于nacos不广播权重配置的更改,而且nacos内置了raft和负载均衡算法所以改为每次去注册中心请求一个服务地址
//LazyLock延迟加载,ArcSwap+AhashMap提高性能
pub static NAMING_MAP: LazyLock<ArcSwap<AHashMap<String, Arc<Vec<Arc<Instance>>>>>> =
LazyLock::new(|| ArcSwap::from_pointee(AHashMap::new())); 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,
&nacos_ip,
nacos_port,
&nacos_group_name,
);
//add_naming_listener(&server_name).await;
} //注册
pub fn connect(
service_name: &str,
service_port: u16,
nacos_ip: &str,
nacos_port: u16,
nacos_group_name: &str,
) {
let nacos_addr = &format!("{}:{}", nacos_ip, nacos_port as u32);
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 as u32, service_name, nacos_group_name);
let naming_client = nacos_rust_client::get_last_naming_client().unwrap();
//向nacos注册
naming_client.register(instance);
} //监听服务上下线的变化
pub async fn add_naming_listener(service_name: &str) {
let naming_client = nacos_rust_client::get_last_naming_client().unwrap();
let servcie_key = ServiceInstanceKey::new(service_name, &Config::global().nacos_group());
let default_listener =
InstanceDefaultListener::new(*Box::new(servcie_key), Some(Arc::new(handle_listen_list)));
naming_client
.subscribe(Box::new(default_listener))
.await
.unwrap();
} //将服务列表同步至缓存
fn handle_listen_list(
instance_list: Arc<Vec<Arc<Instance>>>,
add_list: Vec<Arc<Instance>>,
remove_list: Vec<Arc<Instance>>,
) {
let service_name = if instance_list.len() > 0 {
&instance_list[0].service_name
} else if add_list.len() > 0 {
&add_list[0].service_name
} else {
&remove_list[0].service_name
};
let service_name: String = service_name.split("@@").collect::<Vec<&str>>()[1].to_owned();
info!(
"{} instances changed, add count:{}, remove count:{}",
service_name,
add_list.len(),
remove_list.len()
);
update_naming_map(&service_name, instance_list);
} pub fn update_naming_map(service_name: &str, instance_list: Arc<Vec<Arc<Instance>>>) {
info!("update gloable server cache : {:?}", service_name);
let mut map = NAMING_MAP.load().as_ref().clone();
map.insert(service_name.to_owned(), instance_list);
NAMING_MAP.store(map.into());
} //向注册中心请求一个已注册服务
pub async fn select_service(service_name: &str) -> String {
let query = QueryInstanceListParams::new_simple(service_name, &Config::global().nacos_group());
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);
//add_naming_listener(service_name).await;
target_address
}
Err(e) => {
error!("select_instance error {}", &e.to_string());
"".to_owned()
}
}
}

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

  1. spring boot 笔记--第三章

    spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...

  2. 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路

    说明: 1.Spring Boot项目默认使用logback进行日志管理 2.logback在启动时默认会自动检查是否有logback.xml文件,如果有时会有限加载这个文件. 3.那么如果是用配置中 ...

  3. 《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”

    在学习<spring boot>一书的过程中,由于原书作者难免有一些遗漏的的地方,或者系统.软件版本不一致.框架更新等各种因素,完全安装书中源码页不能实现项目的正常启动 在8.2章节,演示 ...

  4. Spring Boot 2.0 迁移指南

    ![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRs ...

  5. 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

    刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...

  6. 《Spring Boot实战》笔记(目录)

    目录 目 录第一部分 点睛Spring 4.x第1 章 Spring 基础 .............................................................. ...

  7. 【原】spring boot在整合项目依赖的问题

    最近要开发新的项目,就花了几天时间看了下spring boot的相关资料,然后做了一个demo,不得不说开发效率确实很快,几行注解就完成了事务,aop,数据库等相关配置:但由于先前习惯了spring ...

  8. 为什么是Spring Boot

    原文:https://dzone.com/articles/why-springboot 作者:Siva Prasad Reddy Katamreddy 译者:Oopsguy 本文介绍将各种Sprin ...

  9. Spring Boot快速入门(最新)

    本章通过完成Spring Boot基础项目的构建并实现一个简单的Http请求处理,让大家对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性.预计阅读及演练过程将花费约5分钟. ...

  10. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

随机推荐

  1. WPF的Dispatcher类里的BeginInvoke,Invoke,InvokeAsync

    原文地址:https://blog.csdn.net/niuge8905/article/details/81117989 深入了解 WPF Dispatcher 的工作原理(Invoke/Invok ...

  2. 从零开始!Jupyter Notebook的安装详细教程

    本文将引导你完成从零开始安装Jupyter Notebook的过程.Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含实时代码.方程.可视化和叙述文本的文档.它广泛应用 ...

  3. Linux - Centos操作系统iso文件下载

    CENTOS VERSION DOWNLOAD LINK CentOS 8.5(2111) Download CentOS 8.4(2105) Download CentOS 8.3(2011) Do ...

  4. 借Processing语言及IDE做DOS批处理的事务( 批量修改文件夹或文件的名字 )

    一直想用Processing语言做一些批处理的事务,因为其自带的IDE功能紧凑易用,极度轻量,又加上Java语言的生态极具友好,处理一些windows相关操作完全可行,简单快捷. 这次就是用它做[批量 ...

  5. vue+elementUI 表格操作按钮添加loading

    前言 表格操作栏,某个操作需要异步请求才能做跳转等 方案 整个列表每行都加一个loading字段,不够优雅 利用$set方法 改变当前行当前按钮loading,可行(代码如下) //按钮 row.lo ...

  6. 五大股票金融数据API接口推荐:从实时行情到历史数据全覆盖

    摘要:本文将介绍五大主流的股票金融数据API接口,涵盖实时行情.历史数据.技术指标等功能,帮助开发者快速构建金融数据应用.(本文由deepseek生成) 一.StockTV API 1. 核心优势 全 ...

  7. linux 根目录扩容方法

    准备知识 linux volume 1.(PV)physical volume disk : 物理硬盘 物理硬盘需要转换成lvm(logic volume manage)可识别的状态,将磁盘的syst ...

  8. Python进阶知识:多进程/多线程/装饰器

    本文写作于2025.3.20,恰好作者正好在外面实习,于此同时在实际工作中遇到这些知识点,因此就进行一个简短汇总方便后续回顾,内容同步更新(显示问题可以直接看):https://www.big-yel ...

  9. JLabel展示文本和图片--java进阶day03

    1.JLabel 我们想要在窗体中展示图片或者文本是不能直接展示的,文本和图片必须要放在JLabel这个组件中 JLabel实质是窗体中的一块区域,创建了一个JLabel对象意味着在窗体中开辟了一块区 ...

  10. 【SpringCloud】Eureka服务注册与发现

    Eureka服务注册与发现 补充 Eureka基础知识 什么是服务治理 Spring Cloud封装了Netlix公司开发的Eureka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与 ...