前言
本文基于nacos 1.0.1版本
小声BB:懒得弄排版了,直接上笔记
- Nacos,如果使用高版本的 mysql, 启动时需要把mysql-connector放到plugin/mysql文件夹下,因为项目默认依赖的mysql-connector 5.1.34,所以会导致驱动不生效而连接失败
原因:com.alibaba.nacos.config.server.service.BasicDataSourceServiceImpl
这个类中有设定好老版本和高版本的mysql驱动路径,如下
static {
try {
Class.forName(MYSQL_HIGH_LEVEL_DRIVER);
JDBC_DRIVER_NAME = MYSQL_HIGH_LEVEL_DRIVER;
log.info("Use Mysql 8 as the driver");
} catch (ClassNotFoundException e) {
log.info("Use Mysql as the driver");
JDBC_DRIVER_NAME = DEFAULT_MYSQL_DRIVER;
}
}
如果是直接在编译器中启动该程序的话,需要找到nacos-all/pom.xml 里修改mysql-connector的version,如果是直接从程序包里启动的话,则将jar包添加到plugins/mysql 即可
P.S. 由于连接DB失败并不影响应用启动,但是会导致设定好的登陆用户名密码无法使用,所以如果发现用户名密码设定失败的话,去查看日志会发现有可能就是SB的问题
-
补充1.:淦,用了上述的方法毫无作用,还是连不上数据库,必须要自己重新编译,这项目有坑,无法兼容高版本MYSQL
com.alibaba.nacos.naming.healthcheck
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
这个地方必须低版本MYSQL才有这个类,高版本的路径已经变了
所以上面这段兼容代码完全木有卵用
-
windows的cmd脚本里默认了是stand alone单机模式的,想要在windows下测试集群得修改startup.cmd脚本,里面的MODE改成默认cluster集群模式
Just like this
Nacos 支持环境隔离,参考阿里的nacos blog
https://nacos.io/zh-cn/blog/address-server.html关于1.和2.的补充,查看update log里说1.0.0已经支持MYSQL 8的driver了,然而我用1.0.1还是不行……issue里貌似也有不少抱怨的,先不管了
nacos-config 就是一个配置中心的作用,用于分布式全局配置的作用,实际上跟.properties文件的属性配置类似,但它可以用于分布式环境中的集中式中心配置的作用,例如在nacos集群中配置好了相应的属性,那么应用程序中可以直接通过注解式的代码进行访问,单台nacos服务器配置的属性可以自动同步到整个集群
Just like this:
@RefreshScope
class SampleController {
@Value("${user.name}")
String userName;
@Value("${user.age}")
int age;
}
如上的代码中的user.name和age就是从配置中心中获得的,更多细节参考:
https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md
Nacos-config 的配置有部分是先于application就开始使用的,所以必须要写在bootstrap.properties上,如果写到application.properties上会扑街
Nacos 集群模式搭建的时候,有可能会因为局域网的网卡问题导致集群leader选举失败,需要进行网卡设置,具体参考文档中的https://nacos.io/zh-cn/docs/deployment.html
关于8的补充,我使用了网卡配置,开启了局域网IP选项为true,并且设置了127.0.0.1为本机IP,日志显示集群选举成功,但是服务注册依旧扑街,返回503 server is down,翻issue发现是bughttps://github.com/alibaba/nacos/issues/1189,维护者说是1.0.0的bug,将会在1.0.1 fix,然鹅在下使用的1.0.1了还是有这个bug,但是暂时不知道是不是跟我单机环境开启集群造成的问题,后续有了测试服务器再尝试
最后解决的方法是使用了网络上的ip,设置局域网IP开关为false,结果就注册成功了,先记录下ConfigService不能直接得到,要通过NacosConfigProperties注入然后configServiceInstance()方法获得
nacos的SDK提供了配置中心和服务中心的操作API,基本的CRUD操作都有,具体查看https://nacos.io/zh-cn/docs/sdk.html
nacos集成了spring cloud的ribbon和feign,可以直接用它们来做基础的RPC。RPC的URL中记得加入目标服务的context-root,因为从nacos里获取到的只有一个IP,实例化请求的时候url如果没有context-root就无法指向到正确的接口内
nacos默认有一个nacos/nacos的账号密码,会在nacos实例第一次启动时自动生成数据到users表中,可以将其删除,然后使用
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder这个类,类似:
System.out.println(new BCryptPasswordEncoder().encode("password"));
来生成密码,该工具类在spring-security-core包中有,然后在users表中插入账号密码,账号明文存储,密码则使用加密后的字符串存入,然后在roles表中给对应账号插入ROLE_ADMIN,则可以新建管理员账号