前言
本文基于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
BAT代碼 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,則可以新建管理員賬號