定制小程序开发主要是针对于配置文件定制小程序开发当中的配置,定制小程序开发存储到数据库的时候,定制小程序开发加密成密文。然后Nacos定制小程序开发展示出来的是明文。定制小程序开发因为我们有时候会在配定制小程序开发置文件存储很多敏感信息,定制小程序开发例如数据库连接方式,定制小程序开发或者第三方存储系统的相关信息。定制小程序开发出于此考虑,
Nacos在2.1定制小程序开发版本新发布了配置文件加密功能
,定制小程序开发根本不需要我们自己来实现,定制小程序开发很轻松的就能实现 配置内容 功能。
定制小程序开发要实现的效果如下:这是要存储的配置
配置文件都是放在
config_info
表当中的,然后配置内容是放在content
字段当中的,假如不配置加密,content
字段里面都是存放的明文,添加加密后,里面存储的都是密文,但是在客户端展示配置的时候都是明文。
总的来说官网写的并不是很明确,还有版本各种问题,导致自己也是踩了好多坑,再加上功能是Nacos刚实现的,网上资料可参考的少之又少,然后专门总结了这一篇文章,希望帮助到更多的人吧!
目录
一、前言
注意:这个是Nacos2.1以及以上版本刚发布的功能
2.1版本发布功能介绍:
官网介绍加密插件:
使用前提:如果你
没有使用mysql持久化数据
而是用的nacos内嵌数据库存储的数据,并且使用的不是2.1版本,而是用的2.0.4 - 2.1
版本,那么想使用加密功能,首先需要把nacos/data
文件删除掉。使用内嵌数据库的我们都知道,表根本都不是我们创建的,是程序自动创建的,老版本当中自动创建的表当中并没有encrypted_data_key
这个字段。
Nacos 默认提供 AES 的实现。用户也可以自定义加解密的实现方式。具体的实现在 仓库。
在 Nacos 服务端启动的时候就会加载所有依赖的加解密算法,然后
通过发布配置的 dataId 的前缀
来进行匹配是否需要加解密和使用的加解密算法。
注意:想要使用加密是需要进行修改源码的,通过在源码上进行引入依赖,然后再重新打包。
重点有两个步骤,如下:
- 因为插件那个项目没有上传maven仓库,那也就是我们想要使用他,就需要下载下来,然后打包到本地仓库。
- 然后再下载下来nacos源码,将插件依赖添加到nacos源码当中,再将nacos打包。
- 然后我们通过自己打包的nacos,启动后会发现他已经存在加密功能了。
二、下载Nacos源码并启动
下载源码有两种方式,一种是通过git clone直接克隆仓库到本地,一种是直接下载zip源码包,然后解压。
方式一:克隆最新的代码:git clone https://github.com/alibaba/nacos.git
方式二:下载zip:github源码地址:
下载好之后直接通过ider打开项目如下:
打开源码会发现Nacos也是分了好多子模块,至于他的模块依赖关系,大家可以自行查看,本篇就不具体描述了。目前我们只需要关注哪个是项目启动的入口。如下图所示的
console
模块,通过这个模块的springboot启动类,我们就可以启动Nacos项目了。
Nacos默认是集群启动方式,所以需要指定为单机启动(不然会启动报错的):
-Dnacos.standalone=true
配置数据库持久化
可以选择不配置,不配置就是使用的Nacos默认的
derby
内嵌数据库,但是为了看加密后的变化,我这里选择使用了mysql
初始化脚本:
spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=truedb.user=rootdb.password=root
- 1
- 2
- 3
- 4
- 5
- 6
启动后测试看看是否可以访问:
三、下载插件源码
下载插件源码:
关于这一步我被坑了好长时间,这个插件他依赖了Nacos源码当中的
nacos-common
模块,那我们就需要保证下载的nacos版本和插件依赖的版本是保持一致的,不然引入插件后启动nacos直接会启动失败的。
下载下来的时候他引入的是2.1.0-BETA
版本
而我的nacos下载下来的源码是2.1.1
版本,所以一定要让他两个是一个版本,否则nacos引入插件的依赖后,就会出现jar包冲突,然后启动不起来。
改完之后直接mvn install
四、Nacos源码当中添加依赖
这块其实也有坑,官网说的
${nacos-aes-encryption-plugin.version}
可以获取插件的最新版本。压根源码当中没有定义${nacos-aes-encryption-plugin.version}
这个变量。
所以我们需要在nacos的父工程依赖手动添加nacos-aes-encryption-plugin
版本管理。
<properties> <nacos-aes-encryption-plugin.version>1.0.0-SNAPSHOT</nacos-aes-encryption-plugin.version></properties><dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-aes-encryption-plugin</artifactId> <version>${nacos-aes-encryption-plugin.version}</version> </dependency> </dependencies></dependencyManagement>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
然后在config模块下添加如下依赖:
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-aes-encryption-plugin</artifactId></dependency>
- 1
- 2
- 3
- 4
五、打包测试使用
在nacos源码的目录下执行:
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
- 1
打好后,包路径:nacos\distribution\target
打完包解压发现后竟然application.properties
当中没有刚刚加的mysql配置了。
我们刚刚改的是console模块下的application.properties
,启动运行发现配置文件也生效了,但是打包没生效。其实要想让打包生效需要改这个配置文件。
包括启动方式也是,默认是集群方式启动,可以 改如下文件,改完之后直接打包,然后就不用再修改了。
剩下直接通过bin
目录下的startup.cmd
启动即可
他主要是依靠dataId的命名来区分是否要进行加密的。配置前缀使用
cipher-[加密算法名称]-dataId
来标识这个配置需要加密,系统会自动识别并加密。例如使用 AES 算法来解密配置:cipher-aes-application-dev.yml
。
dataId没有加密的时候命名规则是:
公式:${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
- 1
然后基于这一点,我们就可以自行测试使用了,这里我直接创建了两个文件,一个是加密的,一个是不加密的:
存储在数据库如下:一个是明文,一个是加密过后的
六、项目当中也需要添加依赖
关于springboot当中如何使用Nacos注册中心,本篇就不介绍了,如果不会使用的可以参考这篇文章:
因为我们对Nacos进行使用了加密,所以我们连接nacos配置中心的业务代码当中也需要添加加密插件,他得
需要依靠加密插件进行解密
。
我使用的cloud-alibaba 2021.0.1.0+ springboot2.6.8
,截止到现在可都是官网推荐的最稳定版本,但是我发现一个问题,我nacos加密之后,项目有时候都起不来了,这是什么原因呢?
仔细看依赖会发现问题,
cloud-alibaba 2021.0.1.0
他实际上引入的是nacos1.4.2版本,而我们用的Nacos是2.1.1版本。
所以我们需要矫正一下依赖版本,将client1.4.2排除,然后引入2.1.1版本,要不然版本不同会报错,出各种问题!
完整的依赖如下:
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <springboot.version>2.6.8</springboot.version> <springcloud.alibaba.version>2021.0.1.0</springcloud.alibaba.version></properties><dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${springcloud.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement><dependencies> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <exclusions> <exclusion> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.1.1</version> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web + actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--cloud新版本默认将bootstrap移除了,所以需要添加如下依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--切记这个包是本地包,nacos并没有上传中央仓库--> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-aes-encryption-plugin</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency></dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
我要读取这个加密的dev,配置文件如下:
spring: profiles: active: dev # 表示开发环境 application: name: application cloud: nacos: # 这个是服务注册 discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 # 这个是配置中心相关的 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置,这块就是文件名字后缀,一定要注意 name: cipher-aes-application #平时都是用application.name当文件名,但是现在有了加密,我们不想让服务名加个cipher-aes不好看,所以通过这个来指定文件名,这样既可以读取到加密的配置文件,然后服务名称又保留了我们想要保留的名字
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
@RestController@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11