🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c=1000,移動端可微信小程序搜索“歷代文學”)總架構師,
15年
工作經驗,精通Java編程
,高并發設計
,Springboot和微服務
,熟悉Linux
,ESXI虛擬化
以及云原生Docker和K8s
,熱衷于探索科技的邊界,并將理論知識轉化為實際應用。保持對新技術的好奇心,樂于分享所學,希望通過我的實踐經歷和見解,啟發他人的創新思維。在這里,我希望能與志同道合的朋友交流探討,共同進步,一起在技術的世界里不斷學習成長。
技術合作請加本人wx(注明來自csdn):foreast_sea
Nacos-3.0.0適配PostgreSQL數據庫
引言
前段時間寫了一篇文章叫“Nacos-2.4.0
最新版本,postgresql插件適配器修改分享”,旨在解決nacos適配PostgreSQL
數據庫的問題,因為阿里巴巴nacos開發團隊太忙了,一直忙著迭代開發nacos,給大家持續貢獻更多更優秀的功能。
但是每次發布nacos
版本時,卻忘了及時更新nacos
對應的其他數據源支持,比如大家常用的PostgreSQL
數據庫,就有好多伙伴在網上搜索nacos的PostgreSQL
數據庫支持插件!卻很難找到一個現成能用的,最終都只能接受一個辦法,那就是下載nacos
的多數據源項目源碼自己在本地修改bug
后打包!有這類需求的朋友,心里應該都清楚,幾經折騰很想放棄,但是心有不甘,好不容易走到下載代碼后,修改打包這一步,換來的卻是無數次失敗,真的夠大家使勁折騰一番!
好了,廢話不多說,相信大家都知道了,前幾天nacos
官方發出了新版本3.0.0
正式版,這個版本可謂是花了不少心血啊,前后差不多耗時三五個月,新版本確實有很多大家備受期待的功能,比如:
- 身份驗證機制?:支持多種身份驗證方式,如
OAuth 2.0
和JWT
,確保只有經過授權的用戶才能訪問敏感數據。 - 細粒度權限控制?:管理員可以為不同的用戶和角色設置詳細的權限,實現更精細的訪問控制。
- 加密算法?:引入更強大的加密算法,如AES-256,確保數據在傳輸和存儲過程中的安全性?。
- 配置灰度管理?:支持記錄配置灰度歷史,方便用戶在配置灰度變更后能夠查詢到之前的變更歷史記錄和內容,提升了配置變更期間的穩定性和可用性?。
- 尋址邏輯統一?:優化了客戶端和服務端的尋址模塊,減少了代碼冗余,提高了系統的穩定性和可維護性?。
看到這些新特性,相信大家心里應該都迫不及待想體驗了,不過對于使用MySQL
的朋友們,確實很方便,不需要那么折騰,因為nacos自身默認使用的就是Mysql,因此本文可能不太需要關注。但是對于想用其他數據庫的朋友們,比如想基于PostgreSQL
數據庫存儲nacos數據的朋友們,今天這篇文章就是大家期待的!
本文重點介紹基于Nacos-3.0.0
最新版本如何用PostgreSQL
數據庫來存儲,也就是如何打造或直接獲取能適配Nacos-3.0.0
的PostgreSQL
數據庫插件。
Nacos-3.0.0
版本最直接最快集成PostgreSQL
數據源的方法就是引入依賴,這也是本文重點,也就是核心部分,我把它放這里:
<dependency><groupId>com.sinhy</groupId><artifactId>nacos-postgresql-datasource-plugin-ext</artifactId><version>3.0.0</version>
</dependency>
我已將pg數據源插件打成了jar包,傳到maven中央倉庫,大家只需下載該jar,然后放入nacos
的home
目錄下的plugins
插件目錄,再配置pg
數據源信息,即可使用!
一、PostgreSQL
數據庫源碼地址
為了方便后續及時更新Nacos每個版本對應的PostgreSQL
數據庫插件,我們特意基于官方提供的Nacos插件工程進行了二開,然后打算后續自己維護這部分功能,因此給大家分享:
Nacos-3.0.0
的PostgreSQL
數據庫插件源碼地址
https://github.com/lilinhai/nacos-datasource-plugin-ext
注意:目前該工程中,只有PostgreSQL插件可以正常使用,其余數據庫暫未做相關深入適配和測試!
1.1 nacos-3.0.0新增表config_info_gray
config_info_gray
這個表是nacos-3.0.0新增的,用于灰度管理配置,支持記錄配置灰度歷史,方便用戶在配置灰度變更后能夠查詢到之前的變更歷史記錄和內容,提升了配置變更期間的穩定性和可用性?。以下是該表的postgresql
適配。
DROP TABLE IF EXISTS "config_info_gray";
CREATE TABLE "config_info_gray" ("id" bigserial NOT NULL,"data_id" varchar(255) NOT NULL,"group_id" varchar(128) NOT NULL,"content" text NOT NULL,"md5" varchar(32),"src_user" text,"src_ip" varchar(100) NOT NULL,"gmt_create" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,"gmt_modified" timestamp(6) NOT NULL,"app_name" varchar(128) DEFAULT NULL::character varying,"tenant_id" varchar(128) DEFAULT ''::character varying,"gray_name" varchar(128) NOT NULL,"gray_rule" text NOT NULL,"encrypted_data_key" varchar(256) NOT NULL
);
COMMENT ON COLUMN "config_info_gray"."id" IS '自增ID';
COMMENT ON COLUMN "config_info_gray"."data_id" IS 'data_id';
COMMENT ON COLUMN "config_info_gray"."group_id" IS 'group_id';
COMMENT ON COLUMN "config_info_gray"."content" IS 'content';
COMMENT ON COLUMN "config_info_gray"."md5" IS 'md5';
COMMENT ON COLUMN "config_info_gray"."src_user" IS 'src_user';
COMMENT ON COLUMN "config_info_gray"."src_ip" IS 'src_ip';
COMMENT ON COLUMN "config_info_gray"."gmt_create" IS 'gmt_create';
COMMENT ON COLUMN "config_info_gray"."gmt_modified" IS 'gmt_modified';
COMMENT ON COLUMN "config_info_gray"."app_name" IS 'app_name';
COMMENT ON COLUMN "config_info_gray"."tenant_id" IS 'tenant_id';
COMMENT ON COLUMN "config_info_gray"."gray_name" IS 'gray_name';
COMMENT ON COLUMN "config_info_gray"."gray_rule" IS 'gray_rule';
COMMENT ON COLUMN "config_info_gray"."encrypted_data_key" IS 'encrypted_data_key';-- ----------------------------
-- Primary Key structure for table config_info_gray
-- ----------------------------
ALTER TABLE "config_info_gray" ADD CONSTRAINT "config_info_gray_pkey" PRIMARY KEY ("id");
1.2 nacos-3.0.0廢棄表config_info_aggr
config_info_aggr
表在Nacos 3.0
版本中不存在了?。在Nacos
的早期版本中,config_info_aggr
表用于存儲聚合后的配置信息,主要用于集群環境中配置信息的聚合和同步。然而,在Nacos 3.0
版本中,這一功能已經被重新設計和優化,不再依賴于單獨的config_info_aggr
表來實現。
1.3 Nacos 3.0中的變化
Nacos 3.0
版本對配置管理進行了重大改進,主要包括以下幾個方面:
- 去中心化存儲?:在
Nacos 3.0
中,配置信息不再集中存儲在單一的數據庫表中,而是分散存儲在多個表中,每個服務或命名空間都有自己的數據表。這種設計減少了單一故障點,提高了系統的可靠性和擴展性。 - 優化查詢性能?:通過改進查詢邏輯和索引策略,
Nacos 3.0
顯著提升了查詢性能,尤其是在大規模配置管理場景下。 - 更好的兼容性和擴展性?:新版本支持更多的數據庫類型和更靈活的配置管理策略,使得
Nacos
能夠更好地適應不同的使用場景和需求。
Nacos 3.0版本的功能改進
Nacos 3.0
不僅去除了config_info_aggr
表,還引入了其他重要的功能和改進:
- 更強的擴展性?:支持更多的服務發現和配置管理場景,包括微服務架構、云原生應用等。
- 更高的可靠性?:通過分布式架構設計,提高了系統的穩定性和可用性。
- 更好的性能?:優化了查詢和處理速度,尤其是在大數據量下表現更佳。
- 更靈活的配置管理?:支持更細粒度的配置管理和權限控制,滿足不同團隊和項目的需求。
二、灰度配置適配
增加了一個抽象類,用于適配其他數據庫多灰度配置表的支持:
public abstract class BaseConfigInfoGrayMapper extends AbstractDataSourceMapper implements ConfigInfoGrayMapper
{/*** <pre>構造方法</pre>* @since 2025-04-27 10:03* @param databaseDialect*/protected BaseConfigInfoGrayMapper(DatabaseDialect databaseDialect){super(databaseDialect);}@Overridepublic String getTableName(){return TableConstant.CONFIG_INFO_GRAY;}@Overridepublic MapperResult findAllConfigInfoGrayForDumpAllFetchRows(MapperContext context){String sql = " SELECT id,data_id,group_id,tenant_id,gray_name,gray_rule,app_name,content,md5,gmt_modified " + " FROM config_info_gray ORDER BY id ";sql = databaseDialect.getLimitPageSqlWithOffset(sql, context.getStartRow(), context.getPageSize());return new MapperResult(sql, Collections.emptyList());}
}
三、源碼打包構建
源碼下載本地后,也可以手動打包構建,輸出pg插件,如下圖:
執行maven構建命令:
clean package
將輸出jar到target目錄下:
將jar拷貝到nacos的plugins目錄下即可
四、nacos3.0 基于pg啟動
啟動需要輸入安全密鑰:
輸入后回車、即可訪問
8080
(管理端口)端口:
五、插件概述
5.1、簡介
從Nacos2.2版本開始,Nacos提供了數據源擴展插件,以便讓需要進行其他數據庫適配的用戶自己編寫插件來保存數據。當前項目插件目前已簡單適配Postgresql。
當前插件項目地址:
https://github.com/lilinhai/nacos-datasource-plugin-ext
當前項目是基于Nacos3.0.0
版本的擴展插件口進行開發,同時也是基于以下項目的一個分支進行的而開:
https://github.com/nacos-group/nacos-plugin/tree/develop/nacos-datasource-plugin-ext
很感謝阿里nacos
團隊的貢獻,你們一如既往的迭代nacos
版本,給你們說聲辛苦了,但是卻忘記了nacos
的其他數據源適配,比如postgresql
。
5.2、插件工程結構說明
nacos-datasource-plugin-ext-base
工程為數據庫插件操作的適配抽象定義。
nacos-postgresql-datasource-plugin-ext
工程可打包適配Postgresql
的數據庫插件
六、下載和使用
6.1、插件引入
方式一:將nacos
的postgresql
插件下載下來,將依賴手動拷貝到nacos
的home
目錄下的plugins
目錄下(nacos-3.0.0/plugins
)即可。
- 以下
nacos
的postgresql
插件版本僅支持nacos3.0.0
,采用jdk17
編譯級:
<dependency><groupId>com.sinhy</groupId><artifactId>nacos-postgresql-datasource-plugin-ext</artifactId><version>3.0.0</version>
</dependency>
方式二:下載當前插件項目源碼,打包為jar包,將該文件的路徑配置到startup.sh
文件中,使用Nacos
的loader.path
機制指定該插件的路徑,可修改startup.sh
中的loader.path
參數的位置進行指定。
6.2、修改數據庫配置文件
在application.properties
文件中聲明postgresql
的配置信息:
spring.sql.init.platform=postgresql#spring.datasource.platform=postgresql### Count of DB:
db.num=1### Connect URL of DB:
db.url.0=jdbc:postgresql://127.0.0.1:5432/nacos?currentSchema=public&useUnicode=true&tcpKeepAlive=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&reWriteBatchedInserts=true&ApplicationName=nacos_java
db.user.0=nacos
db.password.0=nacos
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
db.pool.config.driverClassName=org.postgresql.Driver# 如果是 oracle 則需要改為 SELECT * FROM dual
# db.pool.config.connectionTestQuery=SELECT 1
6.3、導入Postgresql的數據庫腳本文件
導入nacos-postgresql
的腳本文件,腳本文件在nacos-postgresql-datasource-plugin-ext/src/main/resources/schema
文件夾下面.
上面操作完成后,啟動Nacos
即可。
七、其他數據庫插件開發
可參考nacos-postgresql-datasource-plugin-ext
工程,新創建Maven項目,實現AbstractDatabaseDialect
類,重寫相關的分頁操作邏輯與方法,并創建相應的mapper實現。
八、參考資料
https://github.com/nacos-group/nacos-plugin/tree/develop/nacos-datasource-plugin-ext