主頁 > 軟體設計 > 學習筆記:分庫分表之中間件Mycat實戰

學習筆記:分庫分表之中間件Mycat實戰

2020-12-05 14:04:01 軟體設計

點關注,不迷路!

本文已整理成檔案!

文章目錄

    • 1.資料切分概念
      • 垂直切分
      • 水平切分
    • 2.什么是Mycat
      • 應用場景
    • 3.Mycat中的核心概念及配置
      • 核心概念
      • 安裝與配置
        • linux安裝
    • 4. MyCat配置
      • 配置Mycat環境引數
      • 配置Mycat邏輯庫與用戶
      • 配置邏輯庫(schema)
      • 邏輯表配置
      • 配置分片(dataNode)
      • 配置物理庫分片映射(dataHost)
      • 表切分規則配置
    • 5.Mycat讀寫分離實戰
    • 6.Mycat 全域序列號

最近也整理了一些資料!分享給需要面試刷題的朋友,也祝愿大家順利拿到自己想要的offer,這份資料主要包含了Java基礎,資料結構,jvm,多執行緒等等,由于篇幅有限,以下只展示小部分面試題,有需要完整版的朋友可以點一點鏈接跳轉領取,鏈接:戳這里免費下載,獲取碼:csdn

1.資料切分概念

資料的切分(Sharding)根據其切分規則的型別,可以分為兩種切分模式,一種是按照不同的表(或者Schema)來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分;另外一則是根據表中的資料的邏輯關系,將同一個表中的資料按照某種條件拆分到多臺資料庫(主機)上面,這種切分稱之為資料的水平(橫向)切分, 垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統,在這種系統中,可以很容易做到將不同業務模塊所使用的表分拆到不同的資料庫中,根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰, 水平切分于垂直切分相比,相對來說稍微復雜一些,因為要將同一個表中的不同資料拆分到不同的資料庫中,對于應用程式來說,拆分規則本身就較根據表名來拆分更為復雜,后期的資料維護也會更為復雜一些,

垂直切分

一個資料庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分布到
不同 的資料庫上面,這樣也就將資料或者說壓力分擔到不同的庫上面,如下圖:
在這里插入圖片描述
一般來講業務存在著復雜 join 的場景是難以切分的,往往業務獨立的易于切分,如何切分,切分到何種程度是考驗技術架構的一個難題, 下面來分析下垂直切分的優缺點:

優點:

  • 拆分后業務清晰,拆分規則明確,
  • 系統之間整合或擴展容易,
  • 資料維護簡單,

缺點:

  • 部分業務表無法 join,只能通過介面方式解決,提高了系統復雜度,
  • 受每種業務不同的限制存在單庫性能瓶頸,不易資料擴展跟性能提高,
  • 事務處理復雜, 由于垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過于龐大,存在單庫讀寫與存盤瓶頸,所以就需要水平拆分來做解決,

水平切分

相對于垂直拆分,水平拆分不是將表做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料,簡單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中的某些行切分到一個資料庫,而另外的某些行又切分到其他的資料庫中,如圖:
在這里插入圖片描述
拆分資料就需要定義分片規則,關系型資料庫是行列的二維模型,拆分的第一原則是找到拆分維度,幾種典型的分片規則包括: ? 按照用戶 ID 求模,將資料分散到不同的資料庫,具有相同資料用戶的資料都被分散到一個庫中, ? 按照日期,將不同月甚至日的資料分散到不同的庫中, ? 按照某個特定的欄位求摸,或者根據特定范圍段分散到不同的庫中,
在這里插入圖片描述
優點:

  • 拆分規則抽象好,join 操作基本可以資料庫做,
  • 不存在單庫大資料,高并發的性能瓶頸,
  • 應用端改造較少,
  • 提高了系統的穩定性跟負載能力,

缺點:

  • 拆分規則難以抽象,
  • 分片事務一致性難以解決,
  • 資料多次擴展難度跟維護量極大,
  • 跨庫 join 性能較差,

垂直切分和水平切分都有缺點,但共同的缺點有:

  • 引入分布式事務的問題,
  • 跨節點 Join 的問題,
  • 跨節點合并排序分頁問題,
  • 多資料源管理問題,

針對資料源管理,目前主要有兩種思路:

A. 客戶端模式,在每個應用程式模塊中配置管理自己需要的一個(或者多個)資料源,直接訪問各個資料 庫,在模塊內完成資料的整合;

B. 通過中間代理層來統一管理所有的資料源,后端資料庫集群對前端應用程式透明;

集中式代理 proxy mycat

嵌入應用去中心化架構 sharding-jdbc

基于主機行程的去中心化架構 sharding-sidecar service mesh

資料切分原則

第一原則:能不切分盡量不要切分,

第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好,

第三原則:資料切分盡量通過資料冗余或表分組來降低跨庫 Join 的可能,

第四原則:由于資料庫中間件對資料 Join 實作的優劣難以把握,而且實作高性能難度極大,業務讀取盡量 少使用多表 Join,

2.什么是Mycat

定義

  • 一個徹底開源的,面向企業應用開發的大資料庫集群
  • 支持事務、ACID、可以替代MySQL的加強版資料庫
  • 一個可以視為MySQL集群的企業級資料庫,用來替代昂貴的Oracle集群
  • 一個融合記憶體快取技術、NoSQL技術、HDFS大資料的新型SQL Server
  • 結合傳統資料庫和新型分布式資料倉庫的新一代企業級資料庫產品
  • 一個新穎的資料庫中間件產品
    官網地址

在這里插入圖片描述
跨分片資料合并
在這里插入圖片描述

應用場景

Mycat 發展到現在,適用的場景已經很豐富,而且不斷有新用戶給出新的創新性的方案,以下是幾個典
型的 應用場景:

  • 單純的讀寫分離,此時配置最為簡單,支持讀寫分離,主從切換
  • 分表分庫,對于超過 1000 萬的表進行分片,最大支持 1000 億的單表分片
  • 多租戶應用,每個應用一個庫,但應用程式只連接 Mycat,從而不改造程式本身,實作多租戶化
  • 報表系統,借助于 Mycat的分表能力,處理大規模報表的統計
  • 替代 Hbase,分析大資料
  • 作為海量資料實時查詢的一種簡單有效方案,比如 100 億條頻繁查詢的記錄需要在 3 秒內查詢出來結果, 除了基于主鍵的查詢,還可能存在范圍查詢或其他屬性查詢,此時 Mycat 可能是最簡單有效的選擇

3.Mycat中的核心概念及配置

核心概念

  • 資料庫中間件
    Mycat 是資料庫中間件,就是介于資料庫與應用之間,進行資料處理與互動的中間服務,
    在這里插入圖片描述
  • 邏輯庫(schema)
    通常對實際應用來說,并不需要知道中間件的存在,業務開發人員只需要知道資料庫的概念,所以
    資料庫中間件可以被看做是一個或多個資料庫集群構成的邏輯庫
    在這里插入圖片描述
  • 邏輯表(table)
    邏輯表,可以是資料切分后,分布在一個或多個分片庫中,也可以不做資料切分,不分片,只有一
    個表構成,
    1. 分片表 分片表,是指那些原有的很大資料的表,需要切分到多個資料庫的表,這樣,每個分
      片都有一部分資料,所有分片構成了完整的資料, 例如在 mycat 配置中的 t_node 就屬于分
      片表,資料按照規則被分到 dn1,dn2 兩個分片節點(dataNode) 上,在這里插入圖片描述

    2. 非分片表
      一個資料庫中并不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表
      來說的,就是那些不需要進行資料切分的表,
      如下配置中 t_node,只存在于分片節點(dataNode)dn1 上,
      在這里插入圖片描述

  • 分片節點(dataNode)
    資料切分后,一個大表被分到不同的分片資料庫上面,每個表分片所在的資料庫就是分片節
    (dataNode)
  • 節點主機(dataHost) 資料切分后,每個分片節點(dataNode)不一定都會獨占一臺機器,同一機
    器上面可以有多個分片資料庫, 這樣一個或多個分片節點(dataNode)所在的機器就是節點主機
    (dataHost),為了規避單節點主機并發數限 制,盡量將讀寫壓力高的分片節點(dataNode)均
    衡的放在不同的節點主機(dataHost),
  • 分片規則(rule)
    一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把資料分到 某個分片
    的規則就是分片規則,資料切分選擇合適的分片規則非常重要,將極大的避免后續資料處理的難
    度,
  • 全域序列號(sequence)
    資料切分后,原有的關系資料庫中的主鍵約束在分布式條件下將無法使用,因此需要引入外部機制
    保證資料 唯一性標識,這種保證全域性的資料唯一標識的機制就是全域序列號(sequence),

安裝與配置

基于原始碼

  • MyCAT-Server 原始碼下載 MyCAT-Server 倉庫地址

  • 原始碼除錯與配置 MyCAT 目前主要通過組態檔的方式來定義邏輯庫和相關配置: ?MYCAT_HOME/conf/schema.xml 中定義邏輯庫,表、分片節點等內容.
    ?MYCAT_HOME/conf/rule.xml 中定義分片規則.
    ? MYCAT_HOME/conf/server.xml 中定義用戶以及系統相關變數,如埠等.

  • 原始碼運行 MyCAT 入口程式是 org.opencloudb.MycatStartup.java ,需要設定MYCAT_HOME 目
    錄,為你工程當前所在目錄(src/main) , 設定完 MYCAT 主目錄后即可正常運行 MyCAT 服務,

在這里插入圖片描述

linux安裝

# 下載
wget http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-
20190927161129-linux.tar.gz
#解壓進入mycat目錄
#啟動mycat
./bin/mycat start
#停止
./bin/mycat stop
#重啟服務
./bin/mycat restart
#查看啟動狀態
./bin/mycat status

conf 目錄下存放組態檔,server.xml 是 Mycat 服務器引數調整和用戶授權的組態檔,schema.xml 是邏 輯庫定義和表以及分片定義的組態檔,rule.xml 是分片規則的組態檔,分片規則的具體一些引數資訊單獨存 放為檔案

4. MyCat配置

  • bin 啟動目錄
  • conf 配置目錄存放組態檔:
  • server.xml:是Mycat服務器引數調整和用戶授權的組態檔,
  • schema.xml:是邏輯庫定義和表以及分片定義的組態檔,
  • rule.xml: 是分片規則的組態檔,分片規則的具體一些引數資訊單獨存放為檔案,也在這個目錄
    下,組態檔修改需要重啟MyCAT,
  • log4j.xml: 日志存放在logs/log中,每天一個檔案,日志的配置是在conf/log4j.xml中,根據
    自己的需要可以調整輸出級別為debug debug級別下,會輸出更多的信
    息,方便排查問題,
  • autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties,
    sequence_db_conf.properties 分片相關的id分片規則組態檔
  • lib MyCAT自身的jar包或依賴的jar包的存放目錄,
  • logs MyCAT日志的存放目錄,日志存放在logs/log中,每天一個檔案

下面圖片描述了Mycat最重要的3大組態檔:
在這里插入圖片描述

配置Mycat環境引數

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
 <system>
 <property name="defaultSqlParser">druidparser</property>
  </system>
</mycat:server>

如例子中配置的所有的Mycat引數變數都是配置在server.xml 檔案中,system標簽下配置所有的引數,如果需要配置某個變數添加相應的配置即可,例如添加啟動埠8066,默認為8066:

<property name="serverPort">8066</property>

其他所有變數類似,

配置Mycat邏輯庫與用戶

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
</user>
</mycat:server>

如例子中配置的所有的Mycat連接的用戶與邏輯庫映射都是配置在server.xml 檔案中,user標簽下配置所有的引數,例如例子中配置了一個mycat用戶供應用連接到mycat,同時mycat 在schema.xml中配置后了一個邏輯庫TESTDB,配置好邏輯庫與用戶的映射關系,

配置邏輯庫(schema)

Mycat作為一個中間件,實作mysql協議,那么對前端應用連接來說就是一個資料庫,也就有資料庫的配置,mycat的資料庫配置是在schema.xml中配置,配置好后映射到server.xml里面的用戶就可以了,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema  xmlns:mycat="http://org.opencloudb/">
 <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
   <table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>
   <table name="ht_jy_login_log" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-date_jylog"/>
 </schema>
 <dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/>
 <dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>
 <dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100"
balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
  <heartbeat>show status like 'wsrep%'</heartbeat>
  <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
  </writeHost> 
 </dataHost>
</mycat:schema >

上面例子配置了一個邏輯庫TESTDB,同時配置了t_user,ht_jy_login_log兩個分片表,

邏輯表配置

<table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>

table 標簽 是邏輯表的配置 其中
name代表表名,
dataNode代表表對應的分片,
Mycat默認采用分庫方式,也就是一個表映射到不同的庫上,
rule代表表要采用的資料切分方式,名稱對應到rule.xml中的對應配置,如果要分片必須配置,

配置分片(dataNode)

<dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/>
 <dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>

表切分后需要配置映射到哪幾個資料庫中,Mycat的分片實際上就是庫的別名,例如上面例子配置了兩個分片dn1,dn2 分別對應到物理機映射dataHost localhost1 的兩個庫上,

配置物理庫分片映射(dataHost)

<dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100"
balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
  <heartbeat>show status like 'wsrep%'</heartbeat>
  <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
  </writeHost> 
 </dataHost>

Mycat作為資料庫代理需要邏輯庫,邏輯用戶,表切分后需要配置分片,分片也就需要映射到真實的物理主機上,至于是映射到一臺還是一臺的多個實體上,Mycat并不關心,只需要配置好映射即可,例如例子中:
配置了一個名為localhost1的物理主機(dataHost)映射,

heartbeat 標簽代表Mycat需要對物理庫心跳檢測的陳述句,正常情況下生產案例可能配置主從,或者多寫 或者單庫,無論哪種情況Mycat都需要維持到資料庫的資料源連接,因此需要定時檢查后端連接可以性,心跳陳述句就是來作為心跳檢測,

writeHost 此標簽代表 一個邏輯主機(dataHost)對應的后端的物理主機映射,例如例子中寫庫hostM1 映射到127.0.0.1:3306,如果后端需要做讀寫分離或者多寫 或者主從則通過配置 多個writeHost 或者readHost即可,

dataHost 標簽中的 writeType balance 等標簽則是不同的策略,具體參考指南,

表切分規則配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule  xmlns:mycat="http://org.opencloudb/">
 <tableRule name="sharding-by-hour">
  <rule>
   <columns>createTime</columns>
   <algorithm>sharding-by-hour</algorithm>
  </rule>
 </tableRule>
 <function name="sharding-by-hour"
class="org.opencloudb.route.function.LatestMonthPartion">
  <property name="splitOneDay">24</property>
 </function>
</mycat:rule >

資料切分中作為表切分規則中最重要的配置,表的切分方式決定了資料切分后的性能好壞,因此也是最重要的配置,

如上面例子配置了一個切分規則,名為sharding-by-hour 對應的切分方式(function )是按日期切
分,該配置中:

tableRule

name 為schema.xml 中table 標簽中對應的 rule=“sharding-by-hour” ,也就是配置表的分片規則,columns 是表的切分欄位: createTime 創建日期,algorithm 是規則對應的切分規則:映射到function 的name,

function

function 配置是分片規則的配置,

name 為切分規則的名稱,名字任意取,但是需要與tableRule 中匹配,

class 是切分規則對應的切分類,寫死,需要哪種規則則配置哪種,例如本例子是按小時分片:org.opencloudb.route.function.LatestMonthPartion

property 標簽是切分規則對應的不同屬性,不同的切分規則配置不同,

5.Mycat讀寫分離實戰

Mysql同步原理

在這里插入圖片描述
Mysql同步方案
在這里插入圖片描述
docker配置

# master
docker run --name mysql_master -v /root/mysql-cluster/master/:/etc/mysql/conf.d/
-e MYSQL_ROOT_PASSWORD=root -p 3316:3306 -d mysql:5.7
# slave1
docker run --name mysql_slave1 -v /root/mysql-cluster/slave1/:/etc/mysql/conf.d/
-e MYSQL_ROOT_PASSWORD=root -p 3326:3306 -d mysql:5.7
# slave2
docker run --name mysql_slave2 -v /root/mysql-cluster/slave2/:/etc/mysql/conf.d/
-e MYSQL_ROOT_PASSWORD=root -p 3336:3306 -d mysql:5.7

讀寫分離配置
配置 mysql 端主從的資料自動同步,mycat 不負責任何的資料同步問題
配置schema.xml

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" >
<heartbeat>show slave status</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="localhost2:3306" user="root" password="123456"
weight="1" />
</writeHost>
</dataHost>
強制走從:
/*!mycat:db_type=slave*/ select * from travelrecord
強制走寫:
/*!mycat:db_type=master*/ select * from travelrecord

6.Mycat 全域序列號

  • 本地檔案方式
    配置schema.xml
<table name="travelrecord" dataNode="dn1" autoIncrement="true"
primaryKey="id" />

編輯 server.xml

#修改主鍵生成策略
<property name="sequnceHandlerType">0</property>

編輯sequence_conf.properties

#TRAVELRECORD 是表名稱
#HISIDS 表示歷史分段(一般無特殊需要則可以不配置)
#MINID 最小id
#MAXID 最大id
#CURID 當前id
TRAVELRECORD.HISIDS=
TRAVELRECORD.MINID=10001
TRAVELRECORD.MAXID=20000
TRAVELRECORD.CURID=10000
  • 本地時間戳方式
    ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重復累加)
    配置schema.xml
<table name="travelrecord" dataNode="dn1" autoIncrement="true" primaryKey="id"
/>

配置server.xml

<property name="sequnceHandlerType">2</property>

在 mycat 下配置:sequence_time_conf.properties

WORKID=0-31 #任意整數
DATAACENTERID=0-31 #任意整數

多個個 mycat 節點下每個 mycat 配置的 WORKID,DATAACENTERID 不同,組成唯一標識,總共支持32*32=1024 種組合,

多個個 mycat 節點下每個 mycat 配置的 WORKID,DATAACENTERID 不同,組成唯一標識,總共支持32*32=1024 種組合,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/230341.html

標籤:其他

上一篇:想進BAT?這個技能必須掌握,不是高并發也不是分布式

下一篇:永遠不會的二分(二分做不對)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more