前言:
博主从win换成mac后,想试着自己配一下docker环境,花了足足3到4天的时间。
由于中土存在各种中间件的兼容问题,mac版和win版的不一致,中间件版本过新等问题,且大多数博客对于版本的描述不够清晰,很难帮到忙,故博主斗胆记录一下,希望对大家有帮助。
环境:
- springboot: 2.7.0
- nacos: 2.1.0
- elasticsearch: 8.2.0
- kibana: 8.2.0
- springcloud: 2021.0.3
- springcloudalibaba: 2021.0.1
- mysql: 8.0.26
- redis: 7
- rabbitmq: 3.9.11
- jdk: 8
- kafka: 3.5.11
mysql8
目前网上的博客大多都是mysql5.7版本之类的,8版本的较少,所以会出一些错误。
特别是连接数据库的时候,大家发现明明我的账号密码都对的,为什么还是说连接错误呢?这其实很可能不是我们自己的问题。
下面给出我的连接数据库的配置:
datasource:
url: jdbc:mysql://db:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: XXXXXXXX
druid:
initial-size: 5 #连接池初始化大小
min-idle: 10 #最小空闲连接数
max-active: 20 #最大连接数
web-stat-filter:
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据
stat-view-servlet: #访问监控网页的登录用户名和密码
login-username: druid
login-password: druid
这里需要注意的是一下几点:
1、如果你把项目放到docker里面,就不要用localhost了,要么你直接用ip地址,要么就和我一样用这种别名。
而这种别名的配置则放在docker-compose里面。
这个在文章最后会给大家放一个链接将docker-compose怎么写。
2、由于版本升级和docker的原因,在连接数据库的时候最好加上这些后缀:
2.1、useUnicode=true&characterEncoding=utf-8:一旦设置了之后,不管数据库是什么编码,读取的时候都会转换成UTF-8,存取的时候还是会按数据库编码存
2.2、serverTimezone=Asia/Shanghai:问题在 MySQL8.0的驱动包跟之前不一样了,默认时区是全球统一时间 (UTC),北京时间是 UTC+8,这句话不加就导致了很多人就算不在docker里面都连不上数据库,mysql8就很烦。
2.3、useSSL=false:useSSL=true是进行安全验证,一般通过证书或者令牌什么的,useSSL=false就是通过账号密码进行连接,通常使用useSSL=false,这个也是mysql8的问题,不过这个问题并不是到了8之后才有的,5.7之后就存在这个问题了。ssl会认证用户的服务器,然后加密数据,最后维护数据的完整性。但是我们用docker相当于把它部署到一个linux服务器上,所以用不到这个。
2.4、allowPublicKeyRetrieval=true。
这个指令比较玄学,是由于报了下面错误才用的,Public Key Retrieval is not allowed(不允许检索公钥)。博主也去网上查了很多资料,大家的话大差不差,就是在第一次连接的时候会出问题,第二次连的时候貌似数据库就缓存的这个配置信息,既然加上能用,大家就加上。有一些朋友也说到,如果我们使用一些可视化工具比如navicat这类的也能解决。
另一种法是:使用指令mysql -u root -p指令进入mysql,将验证方式修改为“mysql_native_password”
USE mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;