部署Nacos也能踩坑?Nacos2.3.1部署踩坑记录

发布于:2024-05-06 ⋅ 阅读:(22) ⋅ 点赞:(0)

前言

笔者最近在写一个微服务的项目,在技术选型方面采用了Dubbo作为RPC框架,注册中心选用了Nacos,在部署Nacos的时候,本着怎么方便怎么来的缘故,我选用了Nacos Docker进行部署,却没想到在鉴权上也踩了一些坑,特写一篇文章记录一下。

Nacos Docker部署

Nacos部署

Nacos的部署我参考的官方的文档,版本是2.3.1,

首先克隆Nacos-Docker的项目,进入目录。

git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker

可以发现项目的结构如下: image.png

我们重点关注以下几个目录:

  • example:存放一些docker-compose的yaml文件。挂载数据卷默认也是挂载到这个目录。里面就有集群配置和单机配置,MySQL配置和Derby配置等。
  • env:存放环境变量,如MySQL密码等。

⚠️注意:构建前在env目录这里改一下MySQL密码,笔者因为图方便就没有改默认MySQL密码,结果第二天发现数据库被黑客入侵删库了!😭

这里我们采用单机部署的方式。Nacos默认采用的是本地数据库Derby来存储配置数据,我们一般将Derby换成MySQL数据库存储。

如果需要5.7版本的,运行下面命令:

docker-compose -f example/standalone-mysql-5.7.yaml up

如果需要8.0版本的,运行下面命令:

docker-compose -f example/standalone-mysql-8.yaml up

鉴权配置

通过上面的命令,我们已经成功将Nacos部署到了服务器。

Nacos默认是没有开启鉴权的,用户可以直接通过localhost:8848/nacos访问,然而这样做是非常不安全的,即使这是个简单的测试机。因此我们需要开启Nacos的鉴权功能。

这里主要讲一些Docker环境中的鉴权配置,以及我踩的一些坑。

首先,我们在example目录下找到自己用的docker-compose文件,比如我用的是standalone-mysql-8.yaml,在里面可以看到nacos的环境变量放在../env/nacos-standlone-mysql.env

version: "3.8"
services:
  nacos:
    image: nacos/nacos-server:${NACOS_VERSION}
    container_name: nacos-standalone-mysql
    env_file:
      - ../env/nacos-standlone-mysql.env

打开这个env文件,添加上下面的参数开启鉴权。

NACOS_AUTH_ENABLE=true
NACOS_AUTH_IDENTITY_KEY=自定义的KEY
NACOS_AUTH_IDENTITY_VALUE=自定义的VALUE

重启容器,本以为这样就完事了,但是我用配置的KEY和VALUE怎么登都登不上Nacos,怎么回事?原来这个KEY和VALUE是用于token鉴权的,和能不能用账号密码登录上Nacos没关系

我又按照网络上的博客配置了:

NACOS_AUTH_USERNAME=
NACOS_AUTH_PASSWORD=

结果也无法登录!老版本可能是通过配置这两个参数来设账号密码,新版本的文档中压根就没有这两个参数!

正确做法

先说结论,正确做法是:在MySQL中,分别在users表和roles表中插入用户相关的数据

INSERT INTO users (username, password, enabled) VALUES ('nacos', 'BCrypt加密后的密码', 1);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

注意⚠️:password需要通过BCrypt加密,可以通过一些在线工具网站进行加密。

我好奇的点是按理说Docker构建的时候应该自带一个默认的用户,这次怎么没有呢?我们找一些MySQL8的Dockerfile文件,看看里面用的SQL是怎么样子的。

可以看到,MySQL8的Dockerfile中使用的SQL脚本来自于网络:

image.png

点进去一看,果然,这里面只有建表语句,并没有在数据库表中插入Nacos账户密码的语句。

但是这个点并没有在官方文档中写出来,至少quick start和鉴权那一章节都没有写,导致我还是花了不少时间来发现这个问题的,第一次部署Nacos的小伙伴怎么会想到需要自己手动在表中插入用户数据呢?

结语

本人之前只在本地部署过Nacos1.x版本的,并且没有通过MySQL做数据挂载。因此在部署Nacos2.3.1 Docker并配置MySQL的时候踩了一点小坑。

总结下来,如果您也要部署Nacos2.3.1 Docker并开启鉴权,正确做法是:在MySQL中分别在users表和roles表中插入用户相关的数据

配置好鉴权后,我在Dubbo地址中将Nacos地址写成: dubbo.registry.address=nacos://我的IP:8848?namespace=我的命名空间&&username=账户&&password=密码,Dubbo就能够正常向Nacos做服务注册啦😆。