详解MybatisPlus集成nacos导致druid连接不上数据库

问题

mp加密与druid和nacos结合,首次项目启动成功,后续访问无法连接数据库

导致原因

项目首次加载由于会去nacos读取一遍配置,刚好mp启动的时候也会去读取配置好key值,所以启动的时候不会报错
由于nacos有自动刷新配置功能,后面自动刷新的时候mp不会再读取命令行配置key,导致无法解密,从而连接数据库失败

解决方案

知道原因之后,我们可以修改druid连接数据库的配置,因为druid自带数据库加解密,参考ConfigFilter类就可以知道,druid会去读取外部的配置文件,可以通过这种方法解决

注意事项

  • 由于mp这个配置的key值只会读取一次,通过SafetyEncryptProcessor这个类来解密。后续是存储在MapPropertySource这里面,源码得知
  • druid的过滤器比mp写的解密还要先执行,这个是重点,因为key只读取一次,而且过滤器也只会执行一次,所以不能从mp下手
  • 交换bean的注入顺序也无法解决(大概原因是druid过滤器比mp执行还要优先,此处不知道是否有新的解决方案)

附源码

package com.hpf.cloud.filter;

import com.alibaba.druid.filter.config.ConfigFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.proxy.jdbc.DataSourceProxy;
import com.baomidou.mybatisplus.core.toolkit.AES;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.SimpleCommandLinePropertySource;
import org.springframework.stereotype.Component;

import java.sql.SQLException;
import java.util.Properties;

/**
 * @description: 兼容druid与mp加解密,重写druid的解密,替换为mp的解密方式
 * @datetime: 2020/11/22 16:12
 * @author: huangpengfei
 */
@NoArgsConstructor
@Slf4j
@Component
public class DruidForMybatisPlusDecryptFilter extends FilterAdapter {

  /**
   * 获取命令行中的key
   */
  @Autowired
  private ConfigurableEnvironment configurableEnvironment;

  /**
   * 重写获取密码解密
   * 1. 参考DruidFilter的代码,取的是file类型的配置文件,这里从启动参数中获取即可
   * 2. 如果不配置,且不需要解密则放行
   *
   * @param dataSourceProxy
   */
  @Override
  public void init(DataSourceProxy dataSourceProxy) {
    if (!(dataSourceProxy instanceof DruidDataSource)) {
      log.error("ConfigLoader only support DruidDataSource");
    }
    DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;
    String mpwKey = null;
    for (PropertySource<?> ps : configurableEnvironment.getPropertySources()) {
      if (ps instanceof SimpleCommandLinePropertySource) {
        SimpleCommandLinePropertySource source = (SimpleCommandLinePropertySource) ps;
        mpwKey = source.getProperty("mpw.key");
        break;
      }
    }
    if (null != mpwKey) {
      // 证明加密
      Properties properties = this.setProperties(dataSource, mpwKey);
      try {
        // 将信息配置进druid
        DruidDataSourceFactory.config(dataSource, properties);
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    log.info("数据库连接成功!");
  }

  /**
   * 通过命令行的密钥进行解密
   *
   * @param dataSource 数据源
   * @param mpwKey   解密key
   * @return
   */
  private Properties setProperties(DruidDataSource dataSource, String mpwKey) {
    Properties properties = new Properties();
    // 先解密
    try {
      String userName = AES.decrypt(dataSource.getUsername().substring(4), mpwKey);
      properties.setProperty(DruidDataSourceFactory.PROP_USERNAME, userName);
      dataSource.setUsername(userName);
      String password = AES.decrypt(dataSource.getPassword().substring(4), mpwKey);
      properties.setProperty(DruidDataSourceFactory.PROP_PASSWORD, password);
      dataSource.setPassword(password);
      String url = AES.decrypt(dataSource.getUrl().substring(4), mpwKey);
      properties.setProperty(DruidDataSourceFactory.PROP_URL, url);
      dataSource.setUrl(url);
    } catch (Exception e) {
      log.info("druid decrypt failed!");
      e.printStackTrace();
    }
    return properties;
  }

}

ps
nacos集成后一直刷新配置,频率很高,这是因为版本问题,修改客户端和服务端的版本即可

到此这篇关于详解MybatisPlus集成nacos导致druid连接不上数据库的文章就介绍到这了,更多相关MybatisPlus druid连接不上内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot使用 druid 连接池来优化分页语句

    一.前言 一个老系统随着数据量越来越大,我们察觉到部分分页语句拖慢了我们的速度. 鉴于老系统的使用方式,不打算使用pagehelper和mybatis-plus来处理,加上系统里使用得是druid连接池,考虑直接使用druid来优化. 二.老代码 老代码是使用得一个mybatis插件进行的分页,分页的核心代码如下: // 记录统计的 sql String countSql = "select count(0) from (" + sql+ ") tmp_count"

  • SpringBoot整合Druid数据库连接池的方法

    一,Druid是什么? Druid是Java语言中最好的数据库连接池.Druid能够提供强大的监控和扩展功能. 二, 在哪里下载druid maven中央仓库: http://central.maven.org/maven2/com/alibaba/druid/ 三, 怎么获取Druid的源码 Druid是一个开源项目,源码托管在github上,源代码仓库地址是 https://github.com/alibaba/druid.同时每次Druid发布正式版本和快照的时候,都会把源码打包,你可以从

  • 关于数据库连接池Druid使用说明

    根据综合性能,可靠性,稳定性,扩展性,易用性等因素替换成最优的数据库连接池. Druid:druid-1.0.29 数据库 Mysql.5.6.17 替换目标:替换掉C3P0,用druid来替换 替换原因: 1.性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 .hikariCP的高性能得益于最大限度的避免锁竞争. 2.druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性. 3.综合性能,扩展性等方面,可考虑使用druid或

  • 数据库阿里连接池 druid配置详解

    Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也逐渐印入了大家的眼帘.接下来本教程就说一下druid的简单使用. 首先从 http://repo1.maven.org/maven2/com/alibaba/druid/下载最新的jar包.如果想使用最新的源码编译,可以从 https://github.com/alibaba/druid下载源码,然

  • springboot配置druid连接池的方法示例

    Druid的简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSource.Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验.Druid是阿里巴巴开发的号称为监控而生的数据库连接池! Druid的功能 1.替换DBCP和C3P0.Druid提供了一个高效.功能强大.可扩展性好的数据库连接池. 2.可以监控数据库

  • Spring Boot集成Druid数据库连接池

    1. 前言 Druid数据库连接池由阿里巴巴开源,号称是java语言中最好的数据库连接池,是为监控而生的.Druid的官方地址是:https://github.com/alibaba/druid 通过本文,我们可以看到 Spring Boot 如何配置数据源 Spring Boot 如何集成Druid数据库连接池 如何打开并访问Druid数据库连接池的监控功能 Spring Boot 使用JdbcTemplate操作数据库 2. 配置pom.xml <parent> <groupId&g

  • spring boot配置druid连接池的完整步骤

    Druid的简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSource.Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验.Druid是阿里巴巴开发的号称为监控而生的数据库连接池! Druid的功能 1.替换DBCP和C3P0.Druid提供了一个高效.功能强大.可扩展性好的数据库连接池. 2.可以监控数据库

  • Spring Boot使用Druid连接池的示例代码

    Druid是Java语言中最好的数据库连接池.Druid相比于其他的数据库连接池,有两大特性: 监控数据库,有利于分析线上数据库问题 更容易扩展,同时也很高效. 今天演示一下Spring Boot集成Druid. 实战 1.添加Maven依赖. Spring Boot版本使用的是1.x的,2.x的版本druid starter还不支持.不过自定义也是没问题的. <!--starter-web 方便我们查看效果--> <dependency> <groupId>org.s

  • 详解MybatisPlus集成nacos导致druid连接不上数据库

    问题 mp加密与druid和nacos结合,首次项目启动成功,后续访问无法连接数据库 导致原因 项目首次加载由于会去nacos读取一遍配置,刚好mp启动的时候也会去读取配置好key值,所以启动的时候不会报错 由于nacos有自动刷新配置功能,后面自动刷新的时候mp不会再读取命令行配置key,导致无法解密,从而连接数据库失败 解决方案 知道原因之后,我们可以修改druid连接数据库的配置,因为druid自带数据库加解密,参考ConfigFilter类就可以知道,druid会去读取外部的配置文件,可

  • 详解mybatis-plus的 mapper.xml 路径配置的坑

    mybatis-plus今天遇到一个问题,就是mybatis 没有读取到mapper.xml 文件. 特此记录一下,问题如下: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.husy.mapper.SystemUserMapper.findUserByName at com.baomidou.mybatisplus.core.override.MybatisMapperMe

  • 详解MyBatis-Plus updateById方法更新不了空字符串/null解决方法

    最近遇到了Mybatis-Plus updateById(),更新某一个字段为null,却发现没有更新成功,发现有一个博客记录挺好的.转载过来,方便自己看. 一.简介 因为最近在忙项目,好久都没有更新博客,最近在项目中刚好遇到一个问题,就是在使用MyBatis-Plus updateById(xxx)的时候,居然更新不了字符串或者null,本文分享两种解决方案,具体大家可以根据自己的需求选择一种方法解决. 二.原理 在实际项目中,难免更新的时候,有可能会把已有的值更新成空字符串或者null,但是

  • 详解mybatis-plus配置找不到Mapper接口路径的坑

    mybatis-plus今天遇到一个问题,就是mybatis 没有读取到mapper.xml 文件. 特此记录一下,问题如下: at com.baomidou.mybatisplus.core.override.MybatisMapperMethod$SqlCommand.<init>(MybatisMapperMethod.java:242) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.<init>(

  • 详解Spring集成Redis的两种方式

    目录 一.使用Jedis方式集成 1.增加依赖 2.配置项 3.配置连接池 4.测试 使用spring-data-redis 1.引入依赖 2.配置项 3.使用 4.可能会遇到的坑 哨兵和集群 总结: 在工作中,我们用到分布式缓存的时候,第一选择就是Redis,今天介绍一下SpringBoot如何集成Redis的,分别使用Jedis和Spring-data-redis两种方式. 一.使用Jedis方式集成 1.增加依赖 <!-- spring-boot-starter-web不是必须的,这里是为

  • 详解SpringBoot集成消息队列的案例应用

    目录 背景 方案规划 统一设计 集成Redis消息队列 集成ActiveMQ消息队列 使用示例 背景 最近在对公司开发框架进行优化,框架内涉及到多处入库的日志记录,例如登录日志/操作日志/访问日志/业务执行日志,集成在业务代码中耦合度较高且占用业务操作执行时间,所以准备集成相关消息队列进行代码解耦 方案规划 现有的成熟消息队列组件非常多,例如RabbitMQ,ActiveMQ,Kafka等,考虑到业务并发量不高且框架已经应用于多个项目平稳运行,准备提供基于Redis的消息队列和集成ActiveM

  • 详解MybatisPlus中@Version注解的使用

    目录 1. 简单介绍 2. 注解说明 3. 什么是乐观锁 3.1 乐观锁简介 3.2 乐观锁实例 4. 实例代码 1. 简单介绍 嗨,大家好,今天给想给大家分享一下关于Mybatis-plus 的 Service 层的一些方法的使用.今天没有总结,因为都是一些API没有什么可以总结的,直接看着调用就可以了. 下面我们将介绍 @Version 注解的用法,以及每个属性的实际意义和用法 2. 注解说明 在 MyBatis Plus 中,使用 @Version 实现乐观锁,该注解用于字段上面 3. 什

  • 详解宝塔Linux面板FTP无法连接的解决办法

    如果使用的是阿里云服务器,需要在安全组设置中,对22.21端口放行,并且被动端口(39000 - 40000)也需要处于放行状态 宝塔Linux面板在使用sftp用最高权限连接时一切正常,但是使用在宝塔里面创建的ftp的账号密码,就无法登陆,相信大家遇到过这样的问题.遇到这样的问题,需要修改一些配置. 第一步:进入宝塔Linux面板中的软件管理,找到Pure-Ftpd 1.0.47点设置 第二步:点击配置修改:如图所示,查找"ForcePassiveIP"(位置188行左右),搜索:

  • 详解MyBatis-Plus Wrapper条件构造器查询大全

    一.引言 那么那么那么今天来说下MP中强大的条件查询功能. 本章是基于上个案例来讲的:MyBaits-Plus 快速入门案例 二.具体操作 首先来说说基本的查询吧,根据主键或者简单的查询条件进行查询. /** * 通过单个ID主键进行查询 */ @Test public void selectById() { User user = userMapper.selectById(1094592041087729666L); System.out.println(user); } /** * 通过多

  • 详解Mybatis-plus中更新date类型数据遇到的坑

    最近一年的项目都是在使用Mybatis-plus,感觉挺好用的,也没遇到很多问题,但是在最近项目上线之后,遇到了一些新的需要,在进行新版本开发的时候就开始遇到坑了,今天来说一下更新数据中有date类型数据的时候会出现的问题. 实体类部分字段如下: @Data @Builder @NoArgsConstructor @AllArgsConstructor public class ProductPo implements Serializable { /** * 产品主键,自增 */ privat

随机推荐