Sharding-Proxy基本功能用法介紹
Sharding-Proxy是一個(gè)分布式數(shù)據(jù)庫(kù)中間件,定位為透明化的數(shù)據(jù)庫(kù)代理端。作為開(kāi)發(fā)人員可以完全把它當(dāng)成數(shù)據(jù)庫(kù),而它具體的分片規(guī)則在Sharding-Proxy中配置。它的整體架構(gòu)圖如下:
在架構(gòu)圖中,中間的藍(lán)色方塊就是我們的中間件Sharding-Proxy,下面連接的是數(shù)據(jù)庫(kù),我們可以配置每一個(gè)數(shù)據(jù)庫(kù)的分片,還可以配置數(shù)據(jù)庫(kù)的讀寫(xiě)分離,影子庫(kù)等等。上方則是我們的業(yè)務(wù)代碼,他們統(tǒng)一連接Sharding-Proxy,就像直接連接數(shù)據(jù)庫(kù)一樣,而具體的數(shù)據(jù)插入哪一個(gè)數(shù)據(jù)庫(kù),則由Sharding-Proxy中的分片規(guī)則決定。再看看右側(cè),右側(cè)是一些數(shù)據(jù)庫(kù)的工具,比如:MySQL CLI,這是MySQL的命令行;Workbench是MySQL自己出的一個(gè)管理工具;還可以連接其他的工具,比如:Navicat,SQLYog等。最后再來(lái)看看左側(cè),是一個(gè)注冊(cè)中心,目前支持最好的是Zookeeper,在注冊(cè)中心中,我們可以統(tǒng)一配置分片規(guī)則,讀寫(xiě)數(shù)據(jù)源等,而且是實(shí)時(shí)生效的,在管理多個(gè)Sharding-Proxy時(shí),非常的方便。而官方也給我們提供了界面化的工具——ShardingSphere-UI,使用起來(lái)非常的方便。
Sharding-Proxy的安裝
我們可以在Sharding-Proxy官網(wǎng)上找的下載目錄,再找到Sharding-Proxy的下載鏈接,下載最新版本的二進(jìn)制包。然后把二進(jìn)制包(tar.gz)上傳到服務(wù)器的目錄中,這個(gè)目錄可以自定義,/opt
或者/usr/local
都可以,然后解壓,命令如下:
tar -zxvf apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz
解壓后,進(jìn)入到sharding-proxy的conf目錄,這個(gè)目錄sharding-proxy的配置目錄,我們所有的數(shù)據(jù)源、分片規(guī)則、讀寫(xiě)分離等都在此目錄下配置。
[root@centOS-1 conf]# ll 總用量 28 -rw-r--r--. 1 root root 3019 6月 4 15:24 config-encrypt.yaml -rw-r--r--. 1 root root 3633 7月 7 13:51 config-master_slave.yaml -rw-r--r--. 1 root root 2938 6月 4 15:24 config-shadow.yaml -rw-r--r--. 1 root root 5463 7月 7 14:08 config-sharding.yaml -rw-r--r--. 1 root root 1322 6月 4 15:24 logback.xml -rw-r--r--. 1 root root 2171 7月 7 15:19 server.yaml
- logback.xml是日志的配置。
- server.yaml是Sharding-Proxy的一些基礎(chǔ)配置,比如:賬號(hào)、密碼、注冊(cè)中心等。
- 剩下的所有以config開(kāi)頭的yaml文件,都是一個(gè)邏輯數(shù)據(jù)源,我們可以看到最常見(jiàn)的兩個(gè)config-sharding.yaml(分片的配置),config-master_slave.yaml(讀寫(xiě)分離的配置)。注意,如果我們要配置分片+讀寫(xiě)分離,要不要在兩個(gè)配置文件中配置呢?不需要的,我們只需要在config-sharding.yaml中配置就可以了,如果要配置單獨(dú)的讀寫(xiě)分離,則需要按照config-master_slave.yaml配置。單獨(dú)的讀寫(xiě)分離和分片+讀寫(xiě)分離在配置上,還是有一些區(qū)別的。
這些配置我們?cè)诤竺鏁?huì)展開(kāi)講。Sharding-Proxy默認(rèn)支持的數(shù)據(jù)庫(kù)是PostgreSQL,而我們大多數(shù)都是使用的MySQL,在這里我們的數(shù)據(jù)庫(kù)使用的是MySQL,我們要將mysql-connector-java.jar這個(gè)jar包放入lib目錄,這里推薦使用5.x版本的jar包,如果使用8.x可能會(huì)有一些位置的錯(cuò)誤。
最后,我們執(zhí)行bin目錄下的start.sh就可以運(yùn)行了。
./bin/start.sh
Sharding-Proxy默認(rèn)的啟動(dòng)端口是3307,我們?cè)谶B接的時(shí)候要格外注意一下。
server.yaml配置
下面我們看看server.yaml文件中,都具體配置哪些內(nèi)容,我們用vim打開(kāi)文件,
vim server.yaml
文件的內(nèi)容如下:
######################################################################################### # # If you want to configure orchestration, authorization and proxy properties, please refer to this file. # ######################################################################################### # #orchestration: # orchestration_ds: # orchestrationType: registry_center,config_center # instanceType: zookeeper # serverLists: 192.168.73.131:2181 # namespace: sharding-proxy # props: # overwrite: false # retryIntervalMilliseconds: 500 # timeToLiveSeconds: 60 # maxRetries: 3 # operationTimeoutMilliseconds: 500 authentication: users: root: password: root sharding: password: sharding authorizedSchemas: sharding_db
- 其中,orchestration是連接zookeeper注冊(cè)中心,這里我們暫時(shí)用不到,將其注釋掉。
- authentication中,配置的是用戶名和密碼,以及授權(quán)的數(shù)據(jù)庫(kù),在這里,我們配置了兩個(gè)用戶,分別為:root/root和sharding/sharding,其中root默認(rèn)授權(quán)所有的數(shù)據(jù)庫(kù),而sharding用戶則授權(quán)sharding_db數(shù)據(jù)庫(kù)。在這里的數(shù)據(jù)庫(kù)(schema)是邏輯數(shù)據(jù)庫(kù),在config-*.yaml中配置的。
config-sharding.yaml的配置
這個(gè)文件是Sharding-Proxy的核心的配置,所有的分片規(guī)則都在這個(gè)文件中配置,讓我們一起來(lái)看看吧,
schemaName: sharding_db dataSources: ds_1: url: jdbc:mysql://192.168.73.132:3306/shard_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 master_ds: url: jdbc:mysql://192.168.73.131:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 slave_ds_0: url: jdbc:mysql://192.168.73.130:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50
- 在這個(gè)配置文件中,總共分為3個(gè)部分,我們先看看前面2個(gè)部分。
- schemaName:是邏輯數(shù)據(jù)庫(kù)的名稱,這里我們叫做sharding_db。在server.yaml文件中,授權(quán)的schema就是這里的schemaName。
- 第二部分是數(shù)據(jù)源,在dataSources里邊,我們配置了3個(gè)數(shù)據(jù)源。分別是ds_1、master_ds和slave_ds_0。我們先來(lái)說(shuō)一下數(shù)據(jù)庫(kù)的規(guī)劃吧,我們的數(shù)據(jù)將通過(guò)user_id進(jìn)行數(shù)據(jù)庫(kù)的分片,總共有2個(gè)分片,user_id尾數(shù)為奇數(shù)的將分配到ds_1的數(shù)據(jù)庫(kù)中,user_id尾數(shù)為偶數(shù)的,將分配到ds_0中,但是我們的數(shù)據(jù)源中沒(méi)有ds_0呀,ds_0將由master_ds和slave_ds_0組成一個(gè)讀寫(xiě)分離數(shù)據(jù)源。
接下來(lái)再看看具體分片的配置,
shardingRule: masterSlaveRules: ds_0: masterDataSourceName: master_ds slaveDataSourceNames: - slave_ds_0 tables: t_order: actualDataNodes: ds_${0..1}.t_order_${1..2} tableStrategy: inline: shardingColumn: order_id algorithmExpression: t_order_${order_id % 2 + 1} keyGenerator: type: SNOWFLAKE column: order_id t_order_item: actualDataNodes: ds_${0..1}.t_order_item_${1..2} tableStrategy: inline: shardingColumn: order_id algorithmExpression: t_order_item_${order_id % 2 + 1} keyGenerator: type: SNOWFLAKE column: id defaultDatabaseStrategy: inline: shardingColumn: user_id algorithmExpression: ds_${user_id % 2} defaultTableStrategy: none: defaultDataSourceName: ds_0
- 分片的配置都在shardingRule下。
- 在這里我們要配置讀寫(xiě)分離主從數(shù)據(jù)源,在這里我們配置的是分片+讀寫(xiě)分離,和單純的讀寫(xiě)分離配置是不一樣的。讀寫(xiě)分離的配置在masterSlaveRules下,我們配置讀寫(xiě)分離數(shù)據(jù)源ds_0,指定主庫(kù)的數(shù)據(jù)源masterDataSourceName為master_ds,master_ds在上面的數(shù)據(jù)源中已經(jīng)配置,而從數(shù)據(jù)源slaveDataSourceNames可以配置多個(gè),也就是一主多從的配置,我們用數(shù)組的方式進(jìn)行配置,- slave_ds_0指定從數(shù)據(jù)源為slave_ds_0,如果有多個(gè)從數(shù)據(jù)源,可以配置多個(gè)。
- 我們先跳過(guò)tables的配置,往下看,defaultDataSourceName,默認(rèn)數(shù)據(jù)源,我們指定ds_0。這個(gè)配置非常有用,在我們的項(xiàng)目中,并不是所有的表都要進(jìn)行水平切分,只有數(shù)據(jù)量比較大的表才會(huì)用到水平切分,比如:訂單表(t_order)和訂單明細(xì)表(t_order_item)。而其他的表數(shù)據(jù)量沒(méi)有那么大,單庫(kù)單表就可以完全支撐,這些表沒(méi)有分片規(guī)則,而我們指定了默認(rèn)的數(shù)據(jù)源,當(dāng)我們操作這些沒(méi)有分片規(guī)則的表時(shí),都統(tǒng)一使用默認(rèn)的數(shù)據(jù)源。
- defaultTableStrategy,默認(rèn)表的分片規(guī)則,這里我們配置的是none,沒(méi)有。也就是說(shuō)所有的分片表都要配置表的分片規(guī)則。
- defaultDatabaseStrategy,默認(rèn)數(shù)據(jù)庫(kù)的分片規(guī)則,這里我們配置它的規(guī)則為行內(nèi)表達(dá)式,分片字段為user_id,規(guī)則為
ds_${user_id % 2}
,當(dāng)user_id為偶數(shù)時(shí),數(shù)據(jù)源為ds_0,也就是前面配置的讀寫(xiě)分離數(shù)據(jù)源;而當(dāng)user_id為奇數(shù)時(shí),數(shù)據(jù)源為ds_1。如果我們的表的分片規(guī)則中,沒(méi)有配置數(shù)據(jù)源的分片規(guī)則,將使用這個(gè)默認(rèn)數(shù)據(jù)源的分片策略。 - 最后再來(lái)看看tables的配置,這里配置的是分片表的規(guī)則,我們配置兩個(gè)表,t_order和t_order_item。每個(gè)分片表都由3部分組成。首先,actualDataNodes,實(shí)際的數(shù)據(jù)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)是在MySQL中真實(shí)存在的,以t_order的配置為例,ds_${0..1}.t_order_${1..2},說(shuō)明t_order的數(shù)據(jù)節(jié)點(diǎn)有4個(gè),分表為ds_0.t_order_1、ds_0.t_order_2、ds_1.t_order_1和ds_1.t_order_2。再來(lái)看表的分片規(guī)則,tableStrategy,它的規(guī)則也是用行內(nèi)表達(dá)式配置的,分片字段為order_id,規(guī)則為t_order_${order_id % 2 + 1},當(dāng)order_id為奇數(shù)時(shí),數(shù)據(jù)會(huì)分配到表t_order_1中;當(dāng)order_id為偶數(shù)時(shí),會(huì)分配到表t_order_2中。
整個(gè)的分片策略就配置完了,決定每條數(shù)據(jù)的具體分片由兩個(gè)字段決定,user_id決定數(shù)據(jù)分配到哪一個(gè)數(shù)據(jù)源中,order_id決定數(shù)據(jù)分配到哪一個(gè)表中。這就是分片+讀寫(xiě)分離的配置,如果要進(jìn)行更詳細(xì)的配置,可以參考官方文檔,這里不贅述了。
config-master_slave.yaml的配置
如果我們只配置數(shù)據(jù)源的讀寫(xiě)分離,而不進(jìn)行分片配置,就需要參照這個(gè)配置文件進(jìn)行配置了,雖然分片+讀寫(xiě)分離的配置已經(jīng)有了讀寫(xiě)分離的配置,但是他倆之間還是有一些細(xì)微的區(qū)別的,我們來(lái)看看這個(gè)文件中的內(nèi)容吧,
schemaName: master_slave_db dataSources: master_ds: url: jdbc:mysql://192.168.73.131:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 slave_ds: url: jdbc:mysql://192.168.73.130:3306/sharding_order?serverTimezone=Asia/Shanghai&useSSL=false username: imooc password: Imooc@123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 slave_ds_1: url: jdbc:mysql://127.0.0.1:3306/demo_ds_slave_1?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 masterSlaveRule: name: ds_0 masterDataSourceName: master_ds slaveDataSourceNames: - slave_ds - slave_ds_1
- 首先,我們還是定義邏輯數(shù)據(jù)庫(kù)的名稱,schemaName: master_slave_db,叫做master_slave_db。
- 然后在dataSources中定義數(shù)據(jù)源,這些配置的結(jié)構(gòu)是通用,和前面沒(méi)有區(qū)別,我們配置了3個(gè)數(shù)據(jù)源,一主兩從,master_ds(主)、slave_ds(從)和slave_ds_1(從)。
- 最后就是主從的規(guī)則masterSlaveRule,在前面分片+讀寫(xiě)分離的配置中,叫做masterSlaveRules,復(fù)數(shù)形式。說(shuō)明在單獨(dú)的讀寫(xiě)分離配置中,只能配置一個(gè)主從數(shù)據(jù)源。主從數(shù)據(jù)源的名字叫做ds_0,主數(shù)據(jù)源masterDataSourceName是master_ds,從數(shù)據(jù)源slaveDataSourceNames配置了兩個(gè),slave_ds和slave_ds_1。
這里只是單純的配置主從讀寫(xiě)分離數(shù)據(jù)源,如果要配置分片+讀寫(xiě)分離,請(qǐng)參照前面的配置。
config-shadow.yaml影子庫(kù)配置
在現(xiàn)在微服務(wù)盛行的情況下,系統(tǒng)被切分的很細(xì),這對(duì)于測(cè)試,尤其是壓測(cè)是非常難的,如果在測(cè)試環(huán)境部署一套和生產(chǎn)一模一樣的環(huán)境,是非常浪費(fèi)資源的。而如果只部署一兩個(gè)服務(wù),又不能進(jìn)行全鏈路的整體壓測(cè)。而我們的解決方案是在生產(chǎn)環(huán)境直接進(jìn)行壓測(cè),得出的結(jié)果也是真實(shí)有效的。那么這些壓測(cè)的數(shù)據(jù)怎么辦,如果不做特殊的處理,就和生產(chǎn)的真實(shí)數(shù)據(jù)混在一起了。
這里我們就需要配置影子數(shù)據(jù)庫(kù)了,所有壓測(cè)數(shù)據(jù)都會(huì)有一個(gè)特殊的標(biāo)識(shí),sharding-proxy根據(jù)這個(gè)特殊的標(biāo)識(shí),將壓測(cè)的數(shù)據(jù)分配到影子庫(kù)中,和生產(chǎn)的真實(shí)數(shù)據(jù)隔離開(kāi),我們看看具體怎么配置
schemaName: sharding_db dataSources: ds: url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 shadow_ds: url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 shadowRule: column: shadow shadowMappings: ds: shadow_ds
- 前面還是邏輯數(shù)據(jù)庫(kù)的名稱和數(shù)據(jù)源的配置。在數(shù)據(jù)源我們配置了兩個(gè),一個(gè)是真實(shí)的數(shù)據(jù)庫(kù)ds,另一個(gè)是影子庫(kù)shadow_ds,所有壓測(cè)的數(shù)據(jù)都會(huì)分配的影子庫(kù)中。
- shadowRule中配置影子庫(kù)的規(guī)則,column,影子庫(kù)字段標(biāo)識(shí),所有壓測(cè)數(shù)據(jù),在程序中,將此字段設(shè)置為true。shadowMappings是主庫(kù)和影子庫(kù)的映射關(guān)系,ds數(shù)據(jù)庫(kù)的影子庫(kù)是shadow_ds。
影子庫(kù)的配置在我們壓測(cè)中還是十分有用的,將測(cè)試數(shù)據(jù)和生產(chǎn)數(shù)據(jù)隔離開(kāi),不會(huì)影響到生產(chǎn)數(shù)據(jù)。
config-encrypt.yaml數(shù)據(jù)加密配置
最后我們?cè)倏纯磾?shù)據(jù)加密的配置,一些用戶的信息是不希望在數(shù)據(jù)庫(kù)中以明文存在的,比如:用戶的身份證號(hào)、銀行卡號(hào)。但是,在使用的時(shí)候,我們還要把它解密回來(lái)。當(dāng)然,我們可以在程序中,針對(duì)這些字段進(jìn)行加解密,這里呢,我們看看Sharding-Proxy為我們提供的數(shù)據(jù)加密配置。我們看一下配置文件,
schemaName: encrypt_db dataSource: url: jdbc:mysql://127.0.0.1:3306/demo_ds?serverTimezone=UTC&useSSL=false username: root password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 encryptRule: encryptors: encryptor_aes: type: aes props: aes.key.value: 123456abc tables: t_card_no: columns: card_no: cipherColumn: card_no_cipher encryptor: encryptor_aes
- 邏輯庫(kù)與數(shù)據(jù)源的配置略過(guò)。
- 在加密規(guī)則encryptRule中,我們先定義加密算法,encryptor_aes,它的類型是aes,key是123456abc,這個(gè)key我們可以修改,但是一旦用這個(gè)key產(chǎn)生數(shù)據(jù),就不要再改了,如果改了,舊數(shù)據(jù)就不能正確的解密了。
- 然后在tables中定義加密數(shù)據(jù)的表t_card_no,加密的列為card_no,這個(gè)列是邏輯列,在表中不是真實(shí)存在的,當(dāng)你的sql中無(wú)論查詢、插入,出現(xiàn)這個(gè)字段,都會(huì)進(jìn)行加密處理。而cipherColumn是加密后存儲(chǔ)數(shù)據(jù)的列,encryptor則是加密的規(guī)則。例如,我們執(zhí)行insert into t_card_no (card_no) values ('123456'),card_no列在表t_card_no中并不存在,t_card_no中存在的是card_no_cipher列,我們執(zhí)行成功后,card_no_cipher列存的是密文數(shù)據(jù);當(dāng)我們執(zhí)行select card_no from t_card_no 時(shí),雖然表t_card_no沒(méi)有card_no 列,但是可以將card_no_cipher列解密,card_no 顯示解密后的值。
數(shù)據(jù)加密在實(shí)際的應(yīng)用中還是比較多的。
總結(jié)
到此這篇關(guān)于Sharding-Proxy基本功能用法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- sharding-jdbc5.0.0實(shí)現(xiàn)分表實(shí)踐
- 利用Sharding-Jdbc進(jìn)行分庫(kù)分表的操作代碼
- 使用sharding-jdbc實(shí)現(xiàn)水平分庫(kù)+水平分表的示例代碼
- Sharding-JDBC自動(dòng)實(shí)現(xiàn)MySQL讀寫(xiě)分離的示例代碼
- SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫(kù)分表的實(shí)踐
- SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫(xiě)分離的示例
- 使用Sharding-JDBC對(duì)數(shù)據(jù)進(jìn)行分片處理詳解
- ShardingSphere jdbc集成多數(shù)據(jù)源的實(shí)現(xiàn)步驟
- SpringBoot集成Sharding Jdbc使用復(fù)合分片的實(shí)踐
- Java使用Sharding-JDBC分庫(kù)分表進(jìn)行操作
- Sharding JDBC讀寫(xiě)分離實(shí)現(xiàn)原理及實(shí)例
相關(guān)文章
MyBatis的CRUD中的不同參數(shù)綁定查詢實(shí)現(xiàn)
本文主要介紹了MyBatis的CRUD中的不同參數(shù)綁定查詢實(shí)現(xiàn),主要包括單個(gè)參數(shù)傳遞綁定,序號(hào)參數(shù)傳遞綁定,注解參數(shù)傳遞綁定,pojo(對(duì)象)參數(shù)傳遞綁定,map參數(shù)傳遞綁定這幾種類型,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12SpringBoot使用異步線程池實(shí)現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送
本文主要介紹了SpringBoot使用異步線程池實(shí)現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹
很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個(gè)概念2014-04-04Java工具類實(shí)現(xiàn)高效編寫(xiě)報(bào)表
對(duì)于報(bào)表數(shù)據(jù)大部分情況下使用寫(xiě)sql的方式為大屏/報(bào)表提供數(shù)據(jù)來(lái)源,但是對(duì)于某些復(fù)雜情況下僅僅使用sql無(wú)法實(shí)現(xiàn),這篇文章主要介紹了Java工具類實(shí)現(xiàn)高效編寫(xiě)報(bào)表2022-11-11java圖論弗洛伊德和迪杰斯特拉算法解決最短路徑問(wèn)題
這篇文章主要為大家介紹了java圖論弗洛伊德算法和迪杰斯特拉算法解決最短路徑的問(wèn)題示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11Spring?Security權(quán)限管理實(shí)現(xiàn)接口動(dòng)態(tài)權(quán)限控制
這篇文章主要為大家介紹了Spring?Security權(quán)限管理實(shí)現(xiàn)接口動(dòng)態(tài)權(quán)限控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06