spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ④ nacos-client
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的更多相关文章
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路
说明: 1.Spring Boot项目默认使用logback进行日志管理 2.logback在启动时默认会自动检查是否有logback.xml文件,如果有时会有限加载这个文件. 3.那么如果是用配置中 ...
- 《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”
在学习<spring boot>一书的过程中,由于原书作者难免有一些遗漏的的地方,或者系统.软件版本不一致.框架更新等各种因素,完全安装书中源码页不能实现项目的正常启动 在8.2章节,演示 ...
- Spring Boot 2.0 迁移指南

目录 目 录第一部分 点睛Spring 4.x第1 章 Spring 基础 .............................................................. ...
- 【原】spring boot在整合项目依赖的问题
最近要开发新的项目,就花了几天时间看了下spring boot的相关资料,然后做了一个demo,不得不说开发效率确实很快,几行注解就完成了事务,aop,数据库等相关配置:但由于先前习惯了spring ...
- 为什么是Spring Boot
原文:https://dzone.com/articles/why-springboot 作者:Siva Prasad Reddy Katamreddy 译者:Oopsguy 本文介绍将各种Sprin ...
- Spring Boot快速入门(最新)
本章通过完成Spring Boot基础项目的构建并实现一个简单的Http请求处理,让大家对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性.预计阅读及演练过程将花费约5分钟. ...
- Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...
随机推荐
- WPF的Dispatcher类里的BeginInvoke,Invoke,InvokeAsync
原文地址:https://blog.csdn.net/niuge8905/article/details/81117989 深入了解 WPF Dispatcher 的工作原理(Invoke/Invok ...
- 从零开始!Jupyter Notebook的安装详细教程
本文将引导你完成从零开始安装Jupyter Notebook的过程.Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含实时代码.方程.可视化和叙述文本的文档.它广泛应用 ...
- Linux - Centos操作系统iso文件下载
CENTOS VERSION DOWNLOAD LINK CentOS 8.5(2111) Download CentOS 8.4(2105) Download CentOS 8.3(2011) Do ...
- 借Processing语言及IDE做DOS批处理的事务( 批量修改文件夹或文件的名字 )
一直想用Processing语言做一些批处理的事务,因为其自带的IDE功能紧凑易用,极度轻量,又加上Java语言的生态极具友好,处理一些windows相关操作完全可行,简单快捷. 这次就是用它做[批量 ...
- vue+elementUI 表格操作按钮添加loading
前言 表格操作栏,某个操作需要异步请求才能做跳转等 方案 整个列表每行都加一个loading字段,不够优雅 利用$set方法 改变当前行当前按钮loading,可行(代码如下) //按钮 row.lo ...
- 五大股票金融数据API接口推荐:从实时行情到历史数据全覆盖
摘要:本文将介绍五大主流的股票金融数据API接口,涵盖实时行情.历史数据.技术指标等功能,帮助开发者快速构建金融数据应用.(本文由deepseek生成) 一.StockTV API 1. 核心优势 全 ...
- linux 根目录扩容方法
准备知识 linux volume 1.(PV)physical volume disk : 物理硬盘 物理硬盘需要转换成lvm(logic volume manage)可识别的状态,将磁盘的syst ...
- Python进阶知识:多进程/多线程/装饰器
本文写作于2025.3.20,恰好作者正好在外面实习,于此同时在实际工作中遇到这些知识点,因此就进行一个简短汇总方便后续回顾,内容同步更新(显示问题可以直接看):https://www.big-yel ...
- JLabel展示文本和图片--java进阶day03
1.JLabel 我们想要在窗体中展示图片或者文本是不能直接展示的,文本和图片必须要放在JLabel这个组件中 JLabel实质是窗体中的一块区域,创建了一个JLabel对象意味着在窗体中开辟了一块区 ...
- 【SpringCloud】Eureka服务注册与发现
Eureka服务注册与发现 补充 Eureka基础知识 什么是服务治理 Spring Cloud封装了Netlix公司开发的Eureka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与 ...