• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    分布式數(shù)據(jù)庫(kù)中間件–(2)Cobar與客戶端的握手認(rèn)證

    來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 12:56:23
    文檔

    分布式數(shù)據(jù)庫(kù)中間件–(2)Cobar與客戶端的握手認(rèn)證

    分布式數(shù)據(jù)庫(kù)中間件–(2)Cobar與客戶端的握手認(rèn)證:Cobar啟動(dòng)完成,監(jiān)聽特定端口。整個(gè)認(rèn)證的流程圖: NIOAcceptor類繼承自Thread類,該類的對(duì)象會(huì)以線程的方式運(yùn)行,進(jìn)行連接的監(jiān)聽。NIOAcceptor啟動(dòng)的初始化過(guò)程如下:1 、打開一個(gè)selector,獲取一個(gè)ServerSocketChannel對(duì)象,對(duì)該對(duì)象的so
    推薦度:
    導(dǎo)讀分布式數(shù)據(jù)庫(kù)中間件–(2)Cobar與客戶端的握手認(rèn)證:Cobar啟動(dòng)完成,監(jiān)聽特定端口。整個(gè)認(rèn)證的流程圖: NIOAcceptor類繼承自Thread類,該類的對(duì)象會(huì)以線程的方式運(yùn)行,進(jìn)行連接的監(jiān)聽。NIOAcceptor啟動(dòng)的初始化過(guò)程如下:1 、打開一個(gè)selector,獲取一個(gè)ServerSocketChannel對(duì)象,對(duì)該對(duì)象的so
    注意最后一個(gè)this指針參數(shù),表示將該連接作為附件,注冊(cè)到selector,當(dāng)有感興趣的時(shí)間發(fā)生時(shí),函數(shù)selector.selectedKeys()返回的SelectionKey集合中的對(duì)象中使用key.attachment()即可獲取到上面注冊(cè)時(shí)綁定的connection對(duì)象指針附件。目的就是為了通過(guò)該附件對(duì)象調(diào)用該連接類中定義的read函數(shù)來(lái)完成功能。如下所示:
     private void read(NIOConnection c) {
     try {
     c.read();
     } catch (Throwable e) {
     c.error(ErrorCode.ERR_READ, e);
     }
     }
    6、 連接類中定義的read函數(shù)定義在AbstractConnection類中。在該read函數(shù)(該read函數(shù)涉及到的邏輯比較復(fù)雜,先不深究)中,完成從channel中讀取數(shù)據(jù)到buffer,然后從buffer中提取byte數(shù)據(jù)交給具體子類(FrontendConnection)的handle()方法進(jìn)行處理。 7、 該方法會(huì)從processor的線程池中獲取一個(gè)線程,來(lái)異步執(zhí)行數(shù)據(jù)的處理。處理會(huì)調(diào)用成員handler的handle方法來(lái)對(duì)數(shù)據(jù)進(jìn)行處理。這里,在FrontendConnection的構(gòu)造函數(shù)中定handler設(shè)置為FrontendAuthenticator(進(jìn)行前端認(rèn)證)。
     public void handle(final byte[] data) {
     // 從線程池獲取一個(gè)線程,異步處理前端數(shù)據(jù)
     	// 從processor中的線程池中獲取一個(gè)可以執(zhí)行的線程,執(zhí)行Runnable任務(wù)
     processor.getHandler().execute(new Runnable() {
     @Override
     public void run() {
     try {
     //調(diào)用具體NIOHandler子類的handle函數(shù)
     handler.handle(data);
     } catch (Throwable t) {
     error(ErrorCode.ERR_HANDLE_DATA, t);
     }
     }
     });
     }
    8、 handler在構(gòu)造函數(shù)中初始化成前端認(rèn)證處理器,用于處理前端權(quán)限認(rèn)證。
     public FrontendConnection(SocketChannel channel) {
     super(channel);
     .....................
     //前端認(rèn)證處理器
     this.handler = new FrontendAuthenticator(this);
     }
    9、 由于Cobar是基于MySQL協(xié)議的,所以需要分析一下MySQL協(xié)議的具體格式。下面就先分析一下MySQL認(rèn)證數(shù)據(jù)包的格式: 每個(gè)報(bào)文都分為消息頭和消息體兩部分,其中消息頭是固定的四個(gè)字節(jié),報(bào)文結(jié)構(gòu)如下: mysql_protocol_struct 登錄認(rèn)證報(bào)文的報(bào)文數(shù)據(jù)部分格式如下: mysql_protocol_auth_41 10、 FrontendAuthenticator類對(duì)上面的數(shù)據(jù)包的具體處理如下:
  • 讀取信息到認(rèn)證包對(duì)象
  • 核對(duì)用戶
  • 核對(duì)密碼
  • 檢查schema
  • 如果出現(xiàn)錯(cuò)誤,會(huì)提示相應(yīng)的錯(cuò)誤信息,如果正確會(huì)向客戶端發(fā)送認(rèn)證成功提示。
     public void handle(byte[] data) {
     // check quit packet
     if (data.length == QuitPacket.QUIT.length && data[4] == MySQLPacket.COM_QUIT) {
     source.close();
     return;
     }
     //新建認(rèn)證包對(duì)象
     AuthPacket auth = new AuthPacket();
     //讀取認(rèn)證包到對(duì)象
     auth.read(data);
     // check user
     if (!checkUser(auth.user, source.getHost())) {
     failure(ErrorCode.ER_ACCESS_DENIED_ERROR, "Access denied for user '" + auth.user + "'");
     return;
     }
     // check password
     if (!checkPassword(auth.password, auth.user)) {
     failure(ErrorCode.ER_ACCESS_DENIED_ERROR, "Access denied for user '" + auth.user + "'");
     return;
     }
     // check schema
     switch (checkSchema(auth.database, auth.user)) {
     case ErrorCode.ER_BAD_DB_ERROR:
     failure(ErrorCode.ER_BAD_DB_ERROR, "Unknown database '" + auth.database + "'");
     break;
     case ErrorCode.ER_DBACCESS_DENIED_ERROR:
     String s = "Access denied for user '" + auth.user + "' to database '" + auth.database + "'";
     failure(ErrorCode.ER_DBACCESS_DENIED_ERROR, s);
     break;
     default:
     //認(rèn)證成功,向客戶端發(fā)送認(rèn)證結(jié)果消息
     success(auth);
     }
     }
    在上面的auth.read函數(shù)中會(huì)按9中的協(xié)議格式進(jìn)行讀取數(shù)據(jù)到auth對(duì)象。認(rèn)證成功后會(huì)執(zhí)行:
     protected void success(AuthPacket auth) {
     	//認(rèn)證通過(guò),設(shè)置連接屬性:已認(rèn)證\用戶\數(shù)據(jù)庫(kù)\處理器
     source.setAuthenticated(true);
     source.setUser(auth.user);
     source.setSchema(auth.database);
     source.setCharsetIndex(auth.charsetIndex);
     //設(shè)置該連接的連接處理器為前端命令處理器
     source.setHandler(new FrontendCommandHandler(source));
     .......
     ByteBuffer buffer = source.allocate();
     source.write(source.writeToBuffer(AUTH_OK, buffer));
     }
    可以看到,在上面的函數(shù)中,設(shè)置連接對(duì)象source中的成員(是否認(rèn)證、用戶、數(shù)據(jù)庫(kù)、編碼、處理該連接后續(xù)數(shù)據(jù)包的處理器【handle方法】) 然后回復(fù)認(rèn)證成功的消息。后面客戶端再發(fā)送消息,會(huì)交給前端命令處理器進(jìn)行處理。 客戶端進(jìn)行鏈接的時(shí)候Cobar服務(wù)器的輸出:
    16:59:19,388 INFO ===============================================
    16:59:19,389 INFO Cobar is ready to startup ...
    16:59:19,389 INFO Startup processors ...
    16:59:19,455 INFO Startup connector ...
    16:59:19,460 INFO Initialize dataNodes ...
    16:59:19,506 INFO dnTest1:0 init success
    16:59:19,514 INFO dnTest3:0 init success
    16:59:19,517 INFO dnTest2:0 init success
    16:59:19,527 INFO CobarServer is started and listening on 8066
    16:59:19,527 INFO ===============================================
    16:59:23,459 DEBUG 1>>NIOReactor接受連接數(shù):0
    16:59:23,464 DEBUG 2>>NIOReactor接受連接數(shù):1
    16:59:23,465 DEBUG select讀事件
    16:59:23,465 INFO com.alibaba.cobar.net.handler.FrontendAuthenticator接收的請(qǐng)求長(zhǎng)度:62
    58 0 0 1 5 166 15 0 0 0 0 1 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 114 111 111 116 0 20 169 171 247 102 133 96 158 224 121 22 226 229 88 244 119 238 185 61 124 219 
    16:59:23,468 INFO [thread=Processor1-H0,class=ServerConnection,host=192.168.137.8,port=46101,schema=null]'root' login success
    客戶端得到的回復(fù):
    yan@yan-Z400:~$ mysql -uroot -p** -P8066 -h192.168.137.8
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.1.48-cobar-1.2.7 Cobar Server (ALIBABA)
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql>
    MySQL客戶端的命令處理,具體后續(xù)會(huì)分析。

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    分布式數(shù)據(jù)庫(kù)中間件–(2)Cobar與客戶端的握手認(rèn)證

    分布式數(shù)據(jù)庫(kù)中間件–(2)Cobar與客戶端的握手認(rèn)證:Cobar啟動(dòng)完成,監(jiān)聽特定端口。整個(gè)認(rèn)證的流程圖: NIOAcceptor類繼承自Thread類,該類的對(duì)象會(huì)以線程的方式運(yùn)行,進(jìn)行連接的監(jiān)聽。NIOAcceptor啟動(dòng)的初始化過(guò)程如下:1 、打開一個(gè)selector,獲取一個(gè)ServerSocketChannel對(duì)象,對(duì)該對(duì)象的so
    推薦度:
    標(biāo)簽: 握手 認(rèn)證 客戶端
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产午夜亚洲精品国产成人小说 | 99在线精品视频| 狠狠色伊人久久精品综合网| 97久久国产亚洲精品超碰热| 亚洲一区二区精品视频| 国产在线拍揄自揄视精品不卡| 久久久亚洲精品蜜桃臀| 欧美精品在线一区二区三区| 国产成人精品午夜福利| 久久香蕉国产线看观看精品yw| 亚洲精品国产自在久久 | 无码人妻精品一区二区三区66 | 精品国产综合区久久久久久| 2021国产三级精品三级在专区| 国产精品久久99| 国产精品九九九久久九九| 国产精品高清视亚洲精品| 91精品国产91久久综合| 国产精品久久久亚洲| 精品熟女少妇av免费久久| 在线涩涩免费观看国产精品| 亚洲国产精品专区在线观看| 日韩熟女精品一区二区三区| 欧美精品一二区| 国产精品合集一区二区三区| 精品无码久久久久久久久久| 国产成人精品日本亚洲专区| 精品一卡2卡三卡4卡免费视频| 97精品久久天干天天天按摩| 国产精品内射后入合集| 国产日产韩国精品视频| 人人妻人人澡人人爽欧美精品| 亚洲国产一二三精品无码| 午夜精品久久久久久中宇| 日韩精品专区AV无码| 久久精品亚洲中文字幕无码麻豆| 日韩精品区一区二区三VR| 国产精品亚洲精品日韩已满| 国产欧美精品一区二区三区 | 久久精品九九亚洲精品| 国产欧美日韩综合精品一区二区|