Spring 微服务提示:使用环境变量抽象数据库主机名

安全地管理任何微服务的数据库连接字符串都至关重要;通常,我们使用环境变量来保护用户名和密码,并且从不考虑屏蔽或隐藏数据库主机名。在读取器和写入器数据库实例中,某些组织会强制要求在应用程序启动期间不要泄露主机名并通过环境变量传递主机名。本文讨论如何通过属性文件中的环境变量来配置主机名。

通过环境变量进行数据库配置

我们通常会按照以下方式为 Spring 微服务配置默认连接字符串,并将数据库用户名和密码作为环境变量传递。

server.port=8081
server.servlet.context-path=/api/e-sign/v1
spring.esign.datasource.jdbc-url=jdbc:mysql://localhost:3306/e-sign?allowPublicKeyRetrieval=true&useSSL=false
spring.esign.datasource.username=${DB_USER_NAME}
spring.esign.datasource.password=${DB_USER_PASSWORD}
spring.esign.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.esign.datasource.minimumIdle=5
spring.esign.datasource.maxLifetime=120000

如果我们的微服务连接到具有有限访问权限的安全数据库,并且数据库管理员或基础结构团队不希望你提供数据库主机名,那么我们就有问题了。通常,生产数据库主机名如下所示:

spring.esign.datasource.jdbc-url=jdbc:mysql://prod-db.fabrikam.com:3306/e-sign?allowPublicKeyRetrieval=true&useSSL=false
spring.esign.datasource.username=${DB_USER_NAME}
spring.esign.datasource.password=${DB_USER_PASSWORD}

使用 @Configuration 类

在这种情况下,管理员或云基础架构团队希望他们在容器启动时在运行时将主机名作为环境变量提供。其中一个选项是在配置类中构建和连接连接字符串,如下所示:

@Configuration
public class DatabaseConfig {private final Environment environment;public DatabaseConfig(Environment environment) {this.environment = environment;}@Beanpublic DataSource databaseDataSource() {String hostForDatabase = environment.getProperty("ESIGN_DB_HOST", "localhost:3306");String dbUserName = environment.getProperty("DB_USER_NAME", "user-name");String dbUserPassword = environment.getProperty("DB_USER_PASSWORD", "user-password");String url = String.format("jdbc:mysql://%s/e-sign?allowPublicKeyRetrieval=true&useSSL=false", hostForDatabase);DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl(url);dataSource.setUsername(dbUserName); // Replace with your actual usernamedataSource.setPassword(dbUserPassword); // Replace with your actual passwordreturn dataSource;}
}

上述方法可行,但我们需要将该方法与 一起使用,该方法易于使用且非常灵活。属性文件允许您以集中方式整理所有配置,从而更易于更新和管理。它还通过将配置与代码分离来提高可读性。DevOps 团队可以在不更改代码的情况下更新环境变量值。application.properties

数据库主机名的环境变量

通常,我们使用环境变量来表示数据库用户名和密码,并在应用程序属性文件中使用相应的表达式占位符表达式。${}

spring.esign.datasource.username=${DB_USER_NAME}
spring.esign.datasource.password=${DB_USER_PASSWORD}

但是,对于数据库 URL,我们只需要将环境变量用于主机名,而不需要用于连接字符串,因为不同微服务的每个连接字符串都具有不同的参数。因此,为了解决这个问题,Spring 允许您在下面显示的连接字符串中使用占位符表达式;这提供了灵活性和坚持使用文件的方法的能力,而不是通过数据库配置类来执行。application.properties

spring.esign.datasource.jdbc-url=jdbc:mysql://${ESIGN_DB_HOST}:3306/e-sign?allowPublicKeyRetrieval=true&useSSL=false

一旦我们决定了上述方法,并且如果我们需要在较低的环境中出于任何原因解决任何问题,我们就可以使用界面来查看已解决的 URL:ApplicationListener

爪哇岛
@Component
public class ApplicationReadyLogger implements ApplicationListener<ApplicationReadyEvent> {private final Environment environment;public ApplicationReadyLogger(Environment environment) {this.environment = environment;}@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {String jdbcUrl = environment.getProperty("spring.esign.datasource.jdbc-url");System.out.println("Resolved JDBC URL: " + jdbcUrl);}
}

如果主机名配置有问题,它将在应用程序启动时显示为错误。但是,在应用程序启动后,由于上述实现,我们可以在应用程序日志中看到数据库 URL。请注意,在基础设施团队希望对数据库编写器主机名保持保密的生产环境中,我们不应这样做。ApplicationReadyLogger

使用上述步骤,我们可以将数据库主机名配置为文件内部连接字符串中的环境变量。application.properties

使用数据库主机名的环境变量连接到数据敏感数据库可以增强安全性和灵活性,并为云基础架构和 DevOps 团队提供更多功能。使用占位符表达式可确保我们的配置保持清晰且可维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sklearn详细基础教程(科普篇)

Scikit-learn&#xff08;简称sklearn&#xff09;是Python中一个强大且易于使用的机器学习库&#xff0c;它基于NumPy、SciPy和matplotlib等Python库构建&#xff0c;提供了丰富的工具集&#xff0c;包括数据预处理、特征选择、模型训练、评估和预测等功能。以下是sklearn的详…

研0 冲刺算法竞赛 day22 P1928 外星密码

P1928 外星密码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;递归处理&#xff0c;分类处理 代码&#xff1a; #include<iostream> #include<stack> using namespace std; #include <cstring> char copl[20005];string handle() {int …

使用Java和Spring AMQP构建消息驱动应用

使用Java和Spring AMQP构建消息驱动应用 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 消息驱动应用程序在现代系统架构中扮演着重要角色&#xff0c;特别是在处理高并发和异步任务时。Spring AMQ…

【笔记-软考】层次式架构-表现层框架设计

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-27 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 设计模式 表现层设计模式主要包括MVC、MVP、MVVM三种&#xff0c;用来分离显示部分和业务处理部分&#xff08;显示部分发生变化的概…

LeetCode209 长度最小的子数组

前言 题目&#xff1a; 209.长度最小的子数组 文档&#xff1a; 代码随想录——长度最小的子数组 编程语言&#xff1a; C 解题状态&#xff1a; 没有思路&#xff0c;暴力解法都没思路… 思路 注意&#xff0c;子数组指的是连续子数组&#xff0c;不然本题就没有意义了。 代…

全网最详细!! Linux 安装、配置教程

一、下载安装包 首先去官网下载VMware最新版本&#xff0c;以及发行版CentOS -7&#xff0c;懒得下载的可以私信我&#xff0c;我给你发包 其中&#xff0c;CentOS&#xff08;Community Enterprise Operating System&#xff09;是一个基于Linux的开源操作系统&#xff0c;它是…

【日常记录-Docker】容器退出机制

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-25 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 Docker容器退出机制是指容器停止运行并退出的一系列行为与规则&#xff0c;其决定了容器何时以及如何停止运行。了解并掌握容器…

华为OD机试 - 停车场车辆统计 - 贪心算法(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华…

小米8 刷 澎湃OS 面具 插件优化调度教程

参考&#xff1a;文档: https://topjohnwu.github.io/Magisk/ 官方地址: https://github.com/topjohnwu/Magisk/releases lsposed: https://github.com/LSPosed/LSPosed Shamiko: https://github.com/LSPosed/LSPosed.github.io/releases 小米8 移植版 澎湃OS1.0.2 MI8_Dippe…

微服务注册中心

目录 1.微服务的注册中心 1.1 注册中⼼的主要作⽤ 1.2 常⻅的注册中⼼ 2.nacos简介 2.1 nacos实战⼊⻔ 2.2.1 搭建nacos环境 2.2.2 将商品微服务注册到nacos 3.服务调⽤Ribbon⼊⻔ 3.1 Ribbon概述 3.1.1 什么是Ribbon 3.1.2 Ribbon的主要作⽤ 3.2.2 ⼯程改造 4.服务…

TIM定时器输入捕获

TIM定时器输入捕获 文章目录 TIM定时器输入捕获1. 输入捕获1. 输入捕获的工作原理2. 输入捕获的应用场景 2.输入捕获配置流程测量频率和占空比的函数 1. 输入捕获 输入捕获是STM32定时器的一项重要功能&#xff0c;它允许微控制器捕捉外部信号的变化&#xff08;通常是边沿变化…

多区域DNS以及主从DNS的搭建

搭建多域dns服务器&#xff1a; 搭建DNS多区域功能&#xff08;Multi-Zone DNS&#xff09;主要是为了满足复杂网络环境下的多样化需求&#xff0c;提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境&#xff1a; 在大型组织、跨国公司或跨地域服务中&#xff0c;网…

大模型学习笔记 - LLM指令微调

LLM 指令微调 LLM 指令微调 0. 概览1. 指令数据的构建 1.1 基于现有NLP任务数据集构建1.2 基于日常对话数据构建1.3 基于合成数据构建1.4 指令数据构建的提升方法 2. 指令微调的策略 2.1 优化设置2.2 数据组织策略 3. 参数高效的模型微调 3.1 低秩适配微调方法3.2 其他高效微调…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求&#xff0c;需要使用flutter 来做一个圆形进度条&#xff0c;这可难倒我了&#xff0c;毕竟我是做前端的&#xff0c;flutter 之前接触的也少&#xff0c;但没办法&#xff0c;既然需求有了&#xff0c;也得硬着头皮上了&#xff0c;先来看看做的效果。…

Angular 18.2.0 的新功能增强和创新

一.Angular 增强功能 Angular 是一个以支持开发强大的 Web 应用程序而闻名的平台&#xff0c;最近发布了 18.2.0 版本。此更新带来了许多新功能和改进&#xff0c;进一步增强了其功能和开发人员体验。在本文中&#xff0c;我们将深入探讨 Angular 18.2.0 为开发人员社区提供的…

C语言-TCP通信创建流程

TCP通信创建流程 1. 客户端创建TCP连接 在整个流程中, 主要涉及以下⼏个接⼝socket() : 创建套接字, 使⽤的套接字类型为流式套接字connect() : 连接服务器send() : 数据发送recv() : 数据接收创建套接字 首先&#xff0c;我们需要创建套接字&#xff0c;套接字是通信的基础…

构建查询洞察 UI

本文字数&#xff1a;2631&#xff1b;估计阅读时间&#xff1a;7 分钟 作者&#xff1a;Bucky Schwarz 本文在公众号【ClickHouseInc】首发 我们最近发布了 Query Insights 的初步实现&#xff0c;为 ClickHouse Cloud 用户提供了一种便捷的方法来查看和解释查询日志。该功能对…

MySQL索引、事务(数据库管理与高可用)

一、索引的概念 索引&#xff1a;排序的列表&#xff0c;对数据进行快速的查询&#xff1b; 针对不同的产品需求&#xff0c;或者不同的数据库结构&#xff0c;会创建不同的索引&#xff1b; 1&#xff1a;普通索引&#xff08;默认索引&#xff09; 2&#xff1a;唯一索引…

ubuntu开启 远程登录 允许root远程登录

如果没有22端口服务 sudo apt update sudo apt install openssh-server sudo ufw allow.ssh sudo passwd root 修改配置文件 sudo vim /etc/ssh/sshd_config Port 22 修改为 Port 22 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes service ssh restart …

推荐一个酷炫高逼格的服务器探针的监控工具,免费开源(附源码)

背景 作为一名攻城狮&#xff0c;面对各种服务器内存飙高、CPU猛增、磁盘打满等等服务器问题&#xff0c;可谓是伤透了我们的心。 不仅要开发&#xff0c;还要处理这些问题&#xff0c;大把的时间浪费了&#xff0c;这时候一个好的全面的监控工具尤为重要了。 所以&#xff…