微服務之注冊中心與ShardingSphere關于分庫分表的那些事

小伙伴們,你們好呀!我是老寇!跟我一起學習注冊中心與ShardingSphere怎么一起使用

使用

nacos-shardingsphere例子,請點擊我

注意:需要自己提前創建數據庫和表

create database kcloud_platform_test;DROP TABLE IF EXISTS "public"."boot_sys_user_202401";
CREATE TABLE "public"."boot_sys_user_202401" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202401"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202401"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202401"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202401" ADD CONSTRAINT "boot_sys_user_202401_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202402";
CREATE TABLE "public"."boot_sys_user_202402" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202402"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202402"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202402"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202402" ADD CONSTRAINT "boot_sys_user_202402_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202403";
CREATE TABLE "public"."boot_sys_user_202403" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202403"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202403"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202403"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202403" ADD CONSTRAINT "boot_sys_user_202403_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202404";
CREATE TABLE "public"."boot_sys_user_202404" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202404"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202404"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202404"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202404" ADD CONSTRAINT "boot_sys_user_202404_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202405";
CREATE TABLE "public"."boot_sys_user_202405" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202405"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202405"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202405"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202405" ADD CONSTRAINT "boot_sys_user_202405_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202406";
CREATE TABLE "public"."boot_sys_user_202406" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202406"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202406"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202406"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202406" ADD CONSTRAINT "boot_sys_user_202406_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202407";
CREATE TABLE "public"."boot_sys_user_202407" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202407"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202407"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202407"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202407" ADD CONSTRAINT "boot_sys_user_202407_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202408";
CREATE TABLE "public"."boot_sys_user_202408" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202408"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202408"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202408"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202408" ADD CONSTRAINT "boot_sys_user_202408_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202409";
CREATE TABLE "public"."boot_sys_user_202409" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202409"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202409"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202409"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202409" ADD CONSTRAINT "boot_sys_user_202409_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202410";
CREATE TABLE "public"."boot_sys_user_202410" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202410"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202410"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202410"."create_time" IS '創建時間';
ALTER TABLE "public"."boot_sys_user_202410" ADD CONSTRAINT "boot_sys_user_202410_pkey" PRIMARY KEY ("id");
INSERT INTO "public"."boot_sys_user_202410" VALUES (1, 'boot_sys_user_202410_用戶1', '2024-10-26 20:14:22');DROP TABLE IF EXISTS "public"."boot_sys_user_202411";
CREATE TABLE "public"."boot_sys_user_202411" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202411"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202411"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202411"."create_time" IS '創建時間';ALTER TABLE "public"."boot_sys_user_202411" ADD CONSTRAINT "boot_sys_user_202411_pkey" PRIMARY KEY ("id");DROP TABLE IF EXISTS "public"."boot_sys_user_202412";
CREATE TABLE "public"."boot_sys_user_202412" (
"id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50)  NOT NULL,
"create_time" timestamp(6) NOT NULL
)
;
COMMENT ON COLUMN "public"."boot_sys_user_202412"."id" IS 'ID';
COMMENT ON COLUMN "public"."boot_sys_user_202412"."name" IS '名稱';
COMMENT ON COLUMN "public"."boot_sys_user_202412"."create_time" IS '創建時間';ALTER TABLE "public"."boot_sys_user_202412" ADD CONSTRAINT "boot_sys_user_202412_pkey" PRIMARY KEY ("id");CREATE TABLE "public"."t_user" ("id" int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,"name" varchar(20) NOT NULL,"creator" int8 NOT NULL DEFAULT 0,"editor" int8 NOT NULL DEFAULT 0,"create_time" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,"update_time" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,"del_flag" int2 NOT NULL DEFAULT 0,"version" int4 NOT NULL DEFAULT 0,"tenant_id" int8 NOT NULL DEFAULT 0,CONSTRAINT "t_user_pkey" PRIMARY KEY ("id")
);
COMMENT ON COLUMN "public"."t_user"."id" IS 'ID';
COMMENT ON COLUMN "public"."t_user"."name" IS '名稱';
COMMENT ON COLUMN "public"."t_user"."creator" IS '創建人';
COMMENT ON COLUMN "public"."t_user"."editor" IS '編輯人';
COMMENT ON COLUMN "public"."t_user"."create_time" IS '創建時間';
COMMENT ON COLUMN "public"."t_user"."update_time" IS '修改時間';
COMMENT ON COLUMN "public"."t_user"."del_flag" IS '刪除標識 0未刪除 1已刪除';
COMMENT ON COLUMN "public"."t_user"."version" IS '版本號';
COMMENT ON COLUMN "public"."t_user"."tenant_id" IS '租戶ID';
INSERT INTO "public"."t_user" VALUES (1, '老寇', 1, 1, '2025-04-17 22:35:13.722422', '2025-04-17 22:35:13.722422', 0, 0, 0);
1.引入依賴
  <dependencies><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency></dependencies>
2.配置分庫分表&讀寫分離

注意:對shardingsphere數據庫用戶名/密碼進行加密與解密

class ShardingSphereTest {@Testvoid testCrypto() throws Exception {// 私鑰加密,公鑰解密String str = "123456";String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ4o6sn4WoPmbs7DR9mGQzuuUQM9erQTVPpwxIzB0ETYkyKffO097qXVRLA6KPmaV+/siWewR7vpfYYjWajw5KkCAwEAAQ==";String encryptStr = CryptoUtils.encrypt(str);String decryptStr = CryptoUtils.decrypt(publicKey, encryptStr);Assertions.assertEquals(str, decryptStr);}}

application-shardingsphere.yaml【nacos配置】

# 加密公鑰
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ4o6sn4WoPmbs7DR9mGQzuuUQM9erQTVPpwxIzB0ETYkyKffO097qXVRLA6KPmaV+/siWewR7vpfYYjWajw5KkCAwEAAQ==
dataSources:# 主表【數據庫配置,請按照作者來,請不要瞎幾把改!!!】master:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: org.postgresql.DriverjdbcUrl: jdbc:postgresql://postgresql:5432/kcloud_platform_test?tcpKeepAlive=true&reWriteBatchedInserts=true&stringtype=unspecified&ApplicationName=laokou-sample-shardingsphere&useSSL=falseusername: ENC(VZamSTMi224AH6RUtJGXNldiDp/XEL2ozRhBUu/o9ChodT4JEb9kE/j0EFhXKbjsfvLVacUW0AUzetA6OrNJug==)password: ENC(laIHkPM/z03tYjA95hES4+BhyjyhvrPjJynrC65oDyXnUTP0Tge1UxwERWFBbHoOOQZ2GzzUrRhEYJ3jFb89eQ==)# 從表【數據庫配置,請按照作者來,請不要瞎幾把改!!!】slave:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: org.postgresql.DriverjdbcUrl: jdbc:postgresql://postgresql:5432/kcloud_platform_test?tcpKeepAlive=true&reWriteBatchedInserts=true&stringtype=unspecified&ApplicationName=laokou-sample-shardingsphere&useSSL=falseusername: ENC(VZamSTMi224AH6RUtJGXNldiDp/XEL2ozRhBUu/o9ChodT4JEb9kE/j0EFhXKbjsfvLVacUW0AUzetA6OrNJug==)password: ENC(laIHkPM/z03tYjA95hES4+BhyjyhvrPjJynrC65oDyXnUTP0Tge1UxwERWFBbHoOOQZ2GzzUrRhEYJ3jFb89eQ==)
rules:
- !SHARDINGtables:# 分表的表名boot_sys_user:# 分表規則,按月份分表actualDataNodes: master.boot_sys_user_20240$->{1..9},master.boot_sys_user_2024$->{10..12}# 分表策略tableStrategy:# 規格standard:# 按創建時間字段分表shardingColumn: create_date# 自定義分表算法名稱shardingAlgorithmName: laokou_table_inline# 主鍵生成策略keyGenerateStrategy:# 主鍵字段名稱column: id# 主鍵生成采用的算法名稱keyGeneratorName: snowflake# 自定義分表算法shardingAlgorithms:# 自定義分表算法名稱laokou_table_inline:# 時間范圍分片算法type: INTERVALprops:# 分片鍵的時間戳格式datetime-pattern: "yyyy-MM-dd HH:mm:ss"# 真實表的后綴格式sharding-suffix-pattern: "yyyyMM"# 時間分片下界值datetime-lower: "2024-01-01 00:00:00"# 時間分片上界值datetime-upper: "2024-12-31 23:59:59"# 分片間隔datetime-interval-amount: 1# 按月分表datetime-interval-unit: "months"# 主鍵生成器keyGenerators:# 雪花算法配置snowflake:# 雪花算法type: SNOWFLAKE# 屬性props:# 機器工作IDwork-id: 123
- !READWRITE_SPLITTING# 數據源分組dataSourceGroups:# 讀寫分離配置laokou_readwrite_data_sources:# 主節點寫入writeDataSourceName: master# 從節點讀取readDataSourceNames:- slave# 自定義負載均衡算法名稱loadBalancerName: laokou_load_balance_algorithm# 自定義負載均衡算法loadBalancers:# 自定義負載均衡算法名稱laokou_load_balance_algorithm:# 輪詢調度算法type: ROUND_ROBIN
# 屬性配置
props:# 顯示SQL語句sql-show: true
3.使用
spring:datasource:dynamic:datasource:master:# 拉取nacos的配置url: jdbc:shardingsphere:nacos:application-shardingsphere.yaml# 這個配置請寫死,請不要瞎幾把改【基于spi發現】# 這個配置請寫死,請不要瞎幾把改【基于spi發現】# 這個配置請寫死,請不要瞎幾把改【基于spi發現】driver-class-name: org.laokou.common.shardingsphere.config.nacos.NacosShardingSphereDrivercloud:# nacos的使用,請參考本教程組件【nacos】一節有詳細介紹nacos:discovery:server-addr: nacos:8848username: nacospassword: nacosnamespace: publiccluster-name: laokou-clustergroup: DEFAULT_GROUPconfig:server-addr: nacos:8848username: nacospassword: nacosnamespace: publiccluster-name: laokou-cluster# https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc# 指定讀取的文件格式file-extension: yamlgroup: DEFAULT_GROUPrefresh-enabled: true
4.啟動nacos和laokou-sample-shardingsphere【略】
5.啟動并訪問 http://localhost:9033

擴展

眾所周知,市面上的配置中心五花八門,如何適配各種配置中心?,跟隨我來擴展吧!

在開始之前,我們先來看一下ShardingSphereDriver 了解整個加載流程【基于SPI發現】
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

這個流程也很簡單,其實就是將yaml文件的數據轉換成以shardingsphere形式的數據源,因此,我們可以將公共部分進行抽象,只需要補充各個配置中心拉取配置的代碼。

在這里插入圖片描述

nacos為例【nacos與consul、apollo類似,我就不一個一個展示啦~】

AbstractShardingSphereDriver

/*** Abstract ShardingSphere driver.** @author laokou*/
@SuppressWarnings("UseAbstractOfJDBCDriverClass")
public abstract class AbstractShardingSphereDriver implements Driver {private static final int MAJOR_DRIVER_VERSION = 5;private static final int MINOR_DRIVER_VERSION = 5;@HighFrequencyInvocation(canBeCached = true)@Overridepublic Connection connect(final String url, final Properties info) throws SQLException {return acceptsURL(url) ? getDriverDataSourceCache().get(url, getDriverUrlPrefix()).getConnection() : null;}@Overridepublic boolean acceptsURL(final String url) {return null != url && url.startsWith(getDriverUrlPrefix());}@Overridepublic DriverPropertyInfo[] getPropertyInfo(final String url, final Properties info) {return new DriverPropertyInfo[0];}@Overridepublic int getMajorVersion() {return MAJOR_DRIVER_VERSION;}@Overridepublic int getMinorVersion() {return MINOR_DRIVER_VERSION;}@Overridepublic boolean jdbcCompliant() {return false;}@Overridepublic Logger getParentLogger() {return Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);}abstract protected AbstractDriverDataSourceCache getDriverDataSourceCache();abstract protected String getDriverUrlPrefix();}

AbstractDriverDataSourceCache

/*** Abstract Driver data source cache.** @author laokou*/
public abstract class AbstractDriverDataSourceCache {private final Map<String, DataSource> DATASOURCE_MAP = new ConcurrentHashMap<>(MapUtil.initialCapacity(16));/*** Get data source.* @param url URL* @param urlPrefix URL prefix* @return got data source*/public DataSource get(final String url, final String urlPrefix) {if (DATASOURCE_MAP.containsKey(url)) {return DATASOURCE_MAP.get(url);}return DATASOURCE_MAP.computeIfAbsent(url,driverUrl -> createDataSource(ShardingSphereURL.parse(driverUrl.substring(urlPrefix.length()))));}abstract protected AbstractShardingSphereURLLoadEngine getShardingSphereURLLoadEngine(ShardingSphereURL url);private <T extends Throwable> DataSource createDataSource(final ShardingSphereURL url) throws T {try {AbstractShardingSphereURLLoadEngine urlLoadEngine = getShardingSphereURLLoadEngine(url);return YamlShardingSphereDataSourceFactory.createDataSource(urlLoadEngine.loadContent());}catch (final IOException ex) {throw (T) new SQLException(ex);}catch (final SQLException ex) {throw (T) ex;}catch (Exception e) {throw new RuntimeException(e);}}}

AbstractShardingSphereURLLoadEngine

/*** Abstract ShardingSphere URL load engine.** @author laokou*/
@Slf4j
public abstract class AbstractShardingSphereURLLoadEngine {private static final Pattern ENC_PATTERN = Pattern.compile("^ENC\\((.*)\\)$");private static final String PUBLIC_KEY = "public-key";private static final String CRYPTO_PREFIX = "ENC(";private static final String CRYPTO_SUFFIX = ")";protected final ShardingSphereURL url;protected AbstractShardingSphereURLLoadEngine(final ShardingSphereURL url) {this.url = url;}/*** Load configuration content.* @return loaded content*/public byte[] loadContent() throws Exception {return resolvePropertyValue(getContent()).getBytes(StandardCharsets.UTF_8);}abstract protected String getContent() throws IOException, NacosException;private String resolvePropertyValue(String value) {List<String> list = getList(value);if (list.isEmpty()) {throw new SystemException("S_ShardingSphere_PullConfigError", "無法拉取ShardingSphere配置");}List<String> strList = list.stream().filter(i -> i.startsWith(PUBLIC_KEY)).toList();String publicKey = StringConstant.EMPTY;if (CollectionUtil.isNotEmpty(strList)) {publicKey = strList.getFirst().substring(11).trim();}StringBuilder stringBuilder = new StringBuilder();String finalPublicKey = publicKey;list.forEach(item -> {if (!item.startsWith(PUBLIC_KEY)) {if (item.contains(CRYPTO_PREFIX) && item.contains(CRYPTO_SUFFIX)) {int index = item.indexOf(StringConstant.RISK);String key = item.substring(0, index + 2);String val = item.substring(index + 2).trim();stringBuilder.append(key).append(decrypt(finalPublicKey, val)).append("\n");}else {stringBuilder.append(item).append("\n");}}});return stringBuilder.toString();}private List<String> getList(String value) {List<String> list = new ArrayList<>(256);try (LineNumberReader reader = new LineNumberReader(new InputStreamReader(new ByteArrayInputStream(value.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8))) {String str;while (ObjectUtil.isNotNull((str = reader.readLine()))) {// #開頭直接丟棄if (!str.trim().startsWith(WELL_NO)) {list.add(str);}}}catch (IOException e) {log.error("錯誤信息:{}", e.getMessage());}return list;}/*** 字符串解密.* @param cipherText 加密字符串* @param publicKey 公鑰*/private String decrypt(String publicKey, String cipherText) {if (StringUtils.hasText(cipherText)) {Matcher matcher = ENC_PATTERN.matcher(cipherText);if (matcher.find()) {try {return CryptoUtils.decrypt(publicKey, matcher.group(1));}catch (Exception e) {log.error("ShardingSphere decrypt error", e);}}}return cipherText;}}

NacosShardingSphereDriver

/*** Nacos ShardingSphere driver.** @author laokou*/
@SuppressWarnings("UseNacosOfJDBCDriverClass")
public final class NacosShardingSphereDriver extends AbstractShardingSphereDriver {private static final String DRIVER_URL_PREFIX = "jdbc:shardingsphere:nacos:";static {try {DriverManager.registerDriver(new NacosShardingSphereDriver());}catch (final SQLException ex) {throw new DriverRegisterException(ex);}}private final NacosDriverDataSourceCache dataSourceCache = new NacosDriverDataSourceCache();@Overrideprotected AbstractDriverDataSourceCache getDriverDataSourceCache() {return dataSourceCache;}@Overrideprotected String getDriverUrlPrefix() {return DRIVER_URL_PREFIX;}}

NacosDriverDataSourceCache

/*** Nacos Driver data source cache.** @author laokou*/
@Getter
public final class NacosDriverDataSourceCache extends AbstractDriverDataSourceCache {@Overrideprotected AbstractShardingSphereURLLoadEngine getShardingSphereURLLoadEngine(ShardingSphereURL url) {return new NacosShardingSphereURLLoadEngine(url);}}

NacosShardingSphereURLLoadEngine

/*** Nacos ShardingSphere URL load engine.** @author laokou*/
@Slf4j
public final class NacosShardingSphereURLLoadEngine extends AbstractShardingSphereURLLoadEngine {private static final String BIND_YAML_NAME = "bootstrap.yml";private static final String YAML_FORMAT = "yaml";private static final String NACOS_CONFIG_PREFIX = "spring.cloud.nacos.config";public NacosShardingSphereURLLoadEngine(ShardingSphereURL url) {super(url);}@Overrideprotected String getContent() throws IOException, NacosException {// Nacos拉取配置NacosConfigProperties properties = PropertyUtil.bindOrCreate(NACOS_CONFIG_PREFIX, NacosConfigProperties.class,BIND_YAML_NAME, YAML_FORMAT);String group = properties.getGroup();NacosConfigManager nacosConfigManager = new NacosConfigManager(properties);ConfigService configService = nacosConfigManager.getConfigService();String dataId = url.getConfigurationSubject();Preconditions.checkArgument(StringUtil.isNotEmpty(dataId),"Nacos dataId is required in ShardingSphere driver URL.");return configService.getConfig(dataId, group, 5000);}}

配置SPI發現

注意:在resources目錄下創建META-INF/services文件夾,創建 java.sql.Driver 文件

org.laokou.common.shardingsphere.config.nacos.NacosShardingSphereDriver
org.laokou.common.shardingsphere.config.apollo.ApolloShardingSphereDriver
org.laokou.common.shardingsphere.config.consul.ConsulShardingSphereDriver

在這里插入圖片描述
總結:集成其他的配置中心,只需繼承三個抽象類。

  • AbstractShardingSphereDriver
  • AbstractDriverDataSourceCache
  • AbstractShardingSphereURLLoadEngine

注意:consul和apollo需要你們自行補充

ApolloShardingSphereURLLoadEngine

/*** Apollo ShardingSphere URL load engine.** @author laokou*/
@Slf4j
public final class ApolloShardingSphereURLLoadEngine extends AbstractShardingSphereURLLoadEngine {public ApolloShardingSphereURLLoadEngine(ShardingSphereURL url) {super(url);}@Overrideprotected String getContent() {// 補充拉取配置的代碼return null;}}

ConsulShardingSphereURLLoadEngine

/*** Consul ShardingSphere URL load engine.** @author laokou*/
@Slf4j
public final class ConsulShardingSphereURLLoadEngine extends AbstractShardingSphereURLLoadEngine {public ConsulShardingSphereURLLoadEngine(ShardingSphereURL url) {super(url);}@Overrideprotected String getContent() {// 補充拉取配置的代碼return null;}}

我是老寇,我們下次再見啦!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93494.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python遇到異常流程

在 Python 中&#xff0c;程序遇到異常時的退出行為取決于是否對異常進行了捕獲和處理&#xff1a;未捕獲的異常&#xff1a; 如果異常發生后沒有被 try-except 語句捕獲&#xff0c;程序會立即終止&#xff0c;并返回一個非零的退出碼&#xff08;通常是 1&#xff09;&#x…

【開源大模型和閉源大模型分別有哪些?兩者的對比?部署私有化模型的必要性有哪些?】

以下是關于開源與閉源大模型的詳細對比及私有化部署必要性的分析&#xff0c;結合最新行業動態和技術趨勢&#xff1a;一、開源 vs 閉源大模型代表列表 1. 開源大模型&#xff08;2024年主流&#xff09;模型名稱參數量機構特點LLaMA-38B-70BMeta商業使用需授權&#xff0c;多語…

SpringBoot--JWT

一、JWT 的簡單了解1. 什么是 JWT&#xff1f;JWT&#xff08;JSON Web Token&#xff09;是一種開放標準&#xff08;RFC 7519&#xff09;&#xff0c;用于在 各方之間安全地傳輸信息。它基于 JSON 格式&#xff0c;信息通過 數字簽名 的方式保證不可篡改&#xff0c;常用于 …

OpenTelemetry、Jaeger 與 Zipkin:分布式鏈路追蹤方案對比與實踐

OpenTelemetry、Jaeger 與 Zipkin&#xff1a;分布式鏈路追蹤方案對比與實踐 問題背景介紹 隨著微服務架構的普及&#xff0c;服務之間調用鏈路變得異常復雜&#xff0c;單一服務故障或性能瓶頸往往牽一發動全身。分布式鏈路追蹤&#xff08;Distributed Tracing&#xff09;能…

云原生俱樂部-RH124知識點總結(1)

RH124內容不是很多&#xff0c;但是也不知道多少能夠寫完&#xff0c;細節性的東西不會太多&#xff0c;但是確保每個都能夠有印象能理解。本來是打算一篇文章寫完的&#xff0c;但最后還是決定寫一個系列。至于RH124和RH134的內容為什么放在了k8s系列的后面&#xff0c;那只是…

Redis面試精講 Day 25:Redis實現分布式Session與購物車

【Redis面試精講 Day 25】Redis實現分布式Session與購物車 在高并發、多節點的現代Web應用架構中&#xff0c;傳統的本地Session存儲方式已無法滿足分布式系統的需求。如何實現跨服務、高可用、低延遲的用戶狀態管理&#xff0c;成為后端開發和面試中的高頻考點。今天是“Redi…

本地文件上傳到gitee倉庫的詳細步驟

本地文件上傳到gitee倉庫的詳細步驟 &#x1f530; 一、前期準備 注冊 Gitee 賬號 訪問 Gitee 官網完成注冊并登錄。 網址&#xff1a;https://gitee.com/ 安裝 Git 下載 Git 官方客戶端并完成安裝。 下載網址&#xff1a;https://git-scm.com/downloads 配置 Git 全局信息&…

7 索引的監控

1. 查看索引的監控狀態 GET /_cat/indices/log2?v&formatjson[{"health" : "yellow","status" : "open","index" : "log2","uuid" : "1OnzbVbJRn2grc5k198LlA","pri" : "…

【秋招筆試】2025.08.10米哈游秋招機考真題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍在線刷題 bishipass.com 米哈游 題目一:圖書館整理計劃 1??:貪心策略從左到右固定每個位置的最優元素 2??:使用線段樹維護區間最小值信息,支持單點更新和區間查詢 3??:每次選…

恒創科技:日本服務器 ping 不通?從排查到解決的實用指南

玩游戲、做跨境業務時&#xff0c;突然發現日本服務器 ping 不通&#xff0c;簡直能讓人瞬間焦慮 —— 這到底是網絡崩了&#xff0c;還是服務器出問題了?在本文中&#xff0c;我們將探討如何排除日本服務器 ping 請求故障&#xff0c;附帶常見原因及解決辦法。先搞清楚&#…

ThinkPHP的Controller獲取request對象的幾種方式

文章目錄環境在Controller中獲取Request對象構造器注入操作方法注入繼承BaseController助手函數Facade參考環境 Windows 11 專業版XAMPP 8.2.12 PHP 8.2.12VSCode 1.103.0 在Controller中獲取Request對象 要想在Controller中獲取Request對象&#xff0c;有以下幾種方式&…

week2-[循環結構]找出正數

week2-[循環結構]找出正數 題目描述 給定 NNN 個整數A1,A2,…,ANA_1,A_2,\ldots,A_NA1?,A2?,…,AN?。請求出這 NNN 個數中有多少個數是正數&#xff0c;并求出這些正數的平均值。如果 A1,A2,…,ANA_1,A_2,\ldots,A_NA1?,A2?,…,AN? 不存在正數&#xff0c;那么輸出 “Non…

Android平臺RTSP播放器選型指南:從開源方案到跨平臺低延遲專業SDK

1. 引言&#xff1a;Android RTSP 播放的三條路徑 在 Android 平臺實現 RTSP 播放&#xff0c;看似只是“能播起來”的問題&#xff0c;實際上是一個涉及延遲、穩定性、解碼性能、協議兼容、工程可控性等多維指標的綜合選型問題。 從安防監控、教育互動&#xff0c;到單兵指揮…

Linux安裝及遠程連接知識實踐

文章目錄一、VMware創建虛擬機故障及解決匯總1. 鏡像下載2. 鏡像選擇安裝3.安裝VMware遇到的相關問題4. VMware操作系統的安裝4.1 選擇系統的引導4.2 修改網卡名為eth0的形式(和CentOS7以前保持一致)4.3 進入下一步安裝界面4.4 進入到安裝摘要頁面(INSTALLATION SUMMARY)4.5 配…

F Core 批量寫與“軟實時”一致性:ExecuteUpdate / COPY / SqlBulkCopy 的取舍與事務權衡

EF Core 批量寫與“軟實時”一致性&#xff1a;ExecuteUpdate / COPY / SqlBulkCopy 的取舍與事務權衡 ? &#x1f4da; 目錄EF Core 批量寫與“軟實時”一致性&#xff1a;ExecuteUpdate / COPY / SqlBulkCopy 的取舍與事務權衡 ?1. 術語與目標 &#x1f9ed;2. 技術選型總覽…

基于PSO粒子群多目標優化的微電網調度算法matlab仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序 4.系統原理簡介 4.1 改進粒子群算法 4.2 分布式電源與儲能模型公式 4.3 多目標函數 5.參考文獻 6.完整工程文件 1.課題概述 微電網優化調度的核心是在滿足系統約束&#xff08;如功率平衡、設備出力限制等&#xff09;的前…

Spring AI ChatClient集成Deepseek

Spring AI ChatClient集成Deepseek 下文將簡述如何通過spring ai集成deepseek實現智能對話。在開始之前你需要在deepseek官網申請一個apikey,并設置到系統變量中&#xff0c;保障安全性。 ChatModel 在集成deepseek前&#xff0c;我們先要了解一個chat model&#xff0c;chat m…

Azure微軟云內網接入問題

1. 域名解析失敗 azure需要給ClientSecretCredentialBuilder和AzureResourceManager都配置HTTP 代理,但還是會域名解析失敗,netty會調用InetAddress.getByName解析域名.最終只能在hosts文件寫死host和ip映射關系 2. netty版本不匹配,導致報錯netty某個方法找不到 azure只用引入…

【IDEA】設置Debug調試時調試器不進入特定類(Spring框架、Mybatis框架)

問題 以Ruoyi-Vue項目為例&#xff0c;以Debug方式啟動項目&#xff0c;在com.ruoyi.web.controller.system.SysUserController#list()方法中的userService.selectUserList(user)處打上斷點&#xff0c;訪問[系統管理–用戶管理]頁面&#xff0c;程序就會執行到該斷點處此時按下…

OpenCV 視頻處理全解析

OpenCV 視頻處理全解析&#xff1a;從基礎操作到高級應用?在計算機視覺領域&#xff0c;視頻處理是一個核心且廣泛應用的技術方向。無論是安防監控、自動駕駛還是短視頻特效&#xff0c;都離不開對動態視頻流的智能分析與處理。OpenCV 作為最流行的開源計算機視覺庫&#xff0…