1. toml依赖

toml = "0.8"

2. 代码

由于项目还未完成,部分配置(如数据库等)还未增加,后续更新增加

use log::info;
use serde::Deserialize;
use std::{
fs, sync::LazyLock
};
use crate::init::constant::*;
//创建全局静态配置文件
static CONFIG: LazyLock<Config> = LazyLock::new(init_config); //懒加载初始化,约定优于配置
fn init_config() -> Config {
let contents =
fs::read_to_string(CONFIG_FILE).expect("Something went wrong reading the config file");
let mut config_input: Config =
toml::from_str(&contents).expect(&format!("load {} file failed", CONFIG_FILE));
config_input.server = match config_input.server {
None => Some(Server::default()),
mut ser => {
ser.as_mut().map(|server| {
server.ip = server.ip.clone().or_else(|| Server::default().ip);
server.port = server.port.or_else(|| Server::default().port);
server.name = server.name.clone().or_else(|| Server::default().name);
});
ser
}
};
config_input.nacos = match config_input.nacos {
None => Some(Nacos::default()),
mut nac => {
nac.as_mut().map(|nacos| {
nacos.ip = nacos.ip.clone().or_else(|| Nacos::default().ip);
nacos.port = nacos.port.or_else(|| Nacos::default().port);
nacos.group_name = nacos
.group_name
.clone()
.or_else(|| Nacos::default().group_name);
});
nac
}
};
info!("init config complete");
config_input
} #[derive(Deserialize, Debug, Clone, PartialEq)]
pub struct Config {
pub server: Option<Server>,
pub nacos: Option<Nacos>,
} #[derive(Deserialize, Debug, Clone, PartialEq)]
pub struct Server {
pub ip: Option<String>,
pub port: Option<u16>,
pub name: Option<String>,
} #[derive(Deserialize, Debug, Clone, PartialEq)]
pub struct Nacos {
pub ip: Option<String>,
pub port: Option<u16>,
pub group_name: Option<String>,
} impl Default for Config {
fn default() -> Self {
Self {
server: Some(Server::default()),
nacos: Some(Nacos::default()),
}
}
} impl Default for Server {
fn default() -> Self {
Self {
ip: Some(SERVER_DEFAULT_LISTEN.to_owned()),
port: Some(SERVER_DEFAULT_PORT),
name: Some(SERVER_DEFAULT_NAME.to_owned()),
}
}
} impl Default for Nacos {
fn default() -> Self {
Self {
ip: Some(LOCAL_HOST.to_owned()),
port: Some(NACOS_DEFAULT_PORT),
group_name: Some(NACOS_DEFAULT_GROUP.to_owned()),
}
}
} impl Config {
//获取全局引用
pub fn global() -> &'static Config{
&CONFIG
} //下面的函数可以让我们链式调用获取属性值
//如 let server_ip = Config::global().server_ip();
pub fn server_ip(&self) -> String {
match &self.server {
None => Server::default().ip.unwrap(),
Some(server) => match &server.ip {
None => Server::default().ip.unwrap(),
Some(ip) => ip.to_string(),
},
}
} pub fn server_port(&self) -> u16 {
match &self.server {
None => Server::default().port.unwrap(),
Some(server) => match server.port {
None => Server::default().port.unwrap(),
Some(port) => port,
},
}
} pub fn server_name(&self) -> String {
match &self.server {
None => Server::default().name.unwrap(),
Some(server) => match &server.name {
None => Server::default().name.unwrap(),
Some(name) => name.to_string(),
},
}
} pub fn nacos_ip(&self) -> String {
match &self.nacos {
None => Nacos::default().ip.unwrap(),
Some(nacos) => match &nacos.ip {
None => Nacos::default().ip.unwrap(),
Some(ip) => ip.to_string(),
},
}
} pub fn nacos_port(&self) -> u16 {
match &self.nacos {
None => Nacos::default().port.unwrap(),
Some(nacos) => match nacos.port {
None => Nacos::default().port.unwrap(),
Some(port) => port,
},
}
} pub fn nacos_group(&self) -> String {
match &self.nacos {
None => Nacos::default().group_name.unwrap(),
Some(nacos) => match &nacos.group_name {
None => Nacos::default().group_name.unwrap(),
Some(group_name) => group_name.to_string(),
},
}
}
}

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

  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. 原根学习笔记+BSGS复习笔记

    学原根发现拔山盖世算法忘光了,干脆一块儿写了吧. \(BSGS\) 算法 \(BSGS\) 算法,又名拔山盖世算法.北上广深算法.他解决的问题如下: 求解最小的可行的 \(k\),满足 \(a^k\e ...

  2. 使用PySide6/PyQt6实现Python跨平台GUI框架的开发

    在前面的<Python开发>中主要介绍了FastAPI的后端Python开发,以及基于WxPython的跨平台GUI的开发过程,由于PySide6/PyQt6 在GUI的用途上也有很大的优 ...

  3. try catch异常捕获工具类

    异常捕获工具类 package com.example.multiThreadTransaction_demo.utils; import lombok.extern.slf4j.Slf4j; imp ...

  4. 【ABAQUS Material】density 行为

    1.overview 进行eigenfrequency . transient dynamic analysis. transient heat transfer analysis. adiabati ...

  5. Linux ab详解

    前言 ab是apachebench命令的缩写,ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试.比如ngi ...

  6. vue 判断某个时间小于当前时间

    如下 new Date().getTime() 获取当前时间(毫秒) 我需要对比的时间为秒,所以需要除于1000 <div v-if="scope.row.created_at < ...

  7. AAA认证

    AAA认证(Authentication, Authorization, and Accounting)是一个网络安全框架,用于管理用户如何访问网络资源.具体来说: 认证(Authentication ...

  8. Typora中插入分页符

    博客地址:https://www.cnblogs.com/zylyehuo/ <div style="page-break-after:always"></div ...

  9. Ceph-集群内分布式存储解决方案及基于Docker的部署

    打造集群高可用分布式存储Ceph很早以前在玩集群的时候就折腾过分布式存储服务来作为跨节点的数据共享和可靠存储,以前尝试过GlusterFS,但是由于读写速度实在是太低,就放弃了.见基于GlusterF ...

  10. 通过百度地图 API V2.0 版本,进行地图坐标系转换

    注意 先阅读参考链接 瞭月 的文章,再阅读本文. 其中,请求参数中 model 的含义: amap/tencent - 即:GCJ02 火星坐标系,由中国国家测绘局制订的地理信息系统的坐标系统. 由 ...