<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        分布式數據庫中間件–(2)Cobar與客戶端的握手認證

        來源:懂視網 責編:小采 時間:2020-11-09 12:56:23
        文檔

        分布式數據庫中間件–(2)Cobar與客戶端的握手認證

        分布式數據庫中間件–(2)Cobar與客戶端的握手認證:Cobar啟動完成,監聽特定端口。整個認證的流程圖: NIOAcceptor類繼承自Thread類,該類的對象會以線程的方式運行,進行連接的監聽。NIOAcceptor啟動的初始化過程如下:1 、打開一個selector,獲取一個ServerSocketChannel對象,對該對象的so
        推薦度:
        導讀分布式數據庫中間件–(2)Cobar與客戶端的握手認證:Cobar啟動完成,監聽特定端口。整個認證的流程圖: NIOAcceptor類繼承自Thread類,該類的對象會以線程的方式運行,進行連接的監聽。NIOAcceptor啟動的初始化過程如下:1 、打開一個selector,獲取一個ServerSocketChannel對象,對該對象的so
        注意最后一個this指針參數,表示將該連接作為附件,注冊到selector,當有感興趣的時間發生時,函數selector.selectedKeys()返回的SelectionKey集合中的對象中使用key.attachment()即可獲取到上面注冊時綁定的connection對象指針附件。目的就是為了通過該附件對象調用該連接類中定義的read函數來完成功能。如下所示:
         private void read(NIOConnection c) {
         try {
         c.read();
         } catch (Throwable e) {
         c.error(ErrorCode.ERR_READ, e);
         }
         }
        6、 連接類中定義的read函數定義在AbstractConnection類中。在該read函數(該read函數涉及到的邏輯比較復雜,先不深究)中,完成從channel中讀取數據到buffer,然后從buffer中提取byte數據交給具體子類(FrontendConnection)的handle()方法進行處理。 7、 該方法會從processor的線程池中獲取一個線程,來異步執行數據的處理。處理會調用成員handler的handle方法來對數據進行處理。這里,在FrontendConnection的構造函數中定handler設置為FrontendAuthenticator(進行前端認證)。
         public void handle(final byte[] data) {
         // 從線程池獲取一個線程,異步處理前端數據
         	// 從processor中的線程池中獲取一個可以執行的線程,執行Runnable任務
         processor.getHandler().execute(new Runnable() {
         @Override
         public void run() {
         try {
         //調用具體NIOHandler子類的handle函數
         handler.handle(data);
         } catch (Throwable t) {
         error(ErrorCode.ERR_HANDLE_DATA, t);
         }
         }
         });
         }
        8、 handler在構造函數中初始化成前端認證處理器,用于處理前端權限認證。
         public FrontendConnection(SocketChannel channel) {
         super(channel);
         .....................
         //前端認證處理器
         this.handler = new FrontendAuthenticator(this);
         }
        9、 由于Cobar是基于MySQL協議的,所以需要分析一下MySQL協議的具體格式。下面就先分析一下MySQL認證數據包的格式: 每個報文都分為消息頭和消息體兩部分,其中消息頭是固定的四個字節,報文結構如下: mysql_protocol_struct 登錄認證報文的報文數據部分格式如下: mysql_protocol_auth_41 10、 FrontendAuthenticator類對上面的數據包的具體處理如下:
      1. 讀取信息到認證包對象
      2. 核對用戶
      3. 核對密碼
      4. 檢查schema
      5. 如果出現錯誤,會提示相應的錯誤信息,如果正確會向客戶端發送認證成功提示。
         public void handle(byte[] data) {
         // check quit packet
         if (data.length == QuitPacket.QUIT.length && data[4] == MySQLPacket.COM_QUIT) {
         source.close();
         return;
         }
         //新建認證包對象
         AuthPacket auth = new AuthPacket();
         //讀取認證包到對象
         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:
         //認證成功,向客戶端發送認證結果消息
         success(auth);
         }
         }
        在上面的auth.read函數中會按9中的協議格式進行讀取數據到auth對象。認證成功后會執行:
         protected void success(AuthPacket auth) {
         	//認證通過,設置連接屬性:已認證\用戶\數據庫\處理器
         source.setAuthenticated(true);
         source.setUser(auth.user);
         source.setSchema(auth.database);
         source.setCharsetIndex(auth.charsetIndex);
         //設置該連接的連接處理器為前端命令處理器
         source.setHandler(new FrontendCommandHandler(source));
         .......
         ByteBuffer buffer = source.allocate();
         source.write(source.writeToBuffer(AUTH_OK, buffer));
         }
        可以看到,在上面的函數中,設置連接對象source中的成員(是否認證、用戶、數據庫、編碼、處理該連接后續數據包的處理器【handle方法】) 然后回復認證成功的消息。后面客戶端再發送消息,會交給前端命令處理器進行處理。 客戶端進行鏈接的時候Cobar服務器的輸出:
        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接受連接數:0
        16:59:23,464 DEBUG 2>>NIOReactor接受連接數:1
        16:59:23,465 DEBUG select讀事件
        16:59:23,465 INFO com.alibaba.cobar.net.handler.FrontendAuthenticator接收的請求長度: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
        客戶端得到的回復:
        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客戶端的命令處理,具體后續會分析。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        分布式數據庫中間件–(2)Cobar與客戶端的握手認證

        分布式數據庫中間件–(2)Cobar與客戶端的握手認證:Cobar啟動完成,監聽特定端口。整個認證的流程圖: NIOAcceptor類繼承自Thread類,該類的對象會以線程的方式運行,進行連接的監聽。NIOAcceptor啟動的初始化過程如下:1 、打開一個selector,獲取一個ServerSocketChannel對象,對該對象的so
        推薦度:
        標簽: 握手 認證 客戶端
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 中中文字幕亚洲无线码| 亚洲精品美女久久久久99| 亚洲制服丝袜一区二区三区| 最好免费观看高清在线| 情人伊人久久综合亚洲| 久艹视频在线免费观看| 久久久亚洲欧洲日产国码是AV| 国产精品久免费的黄网站| 亚洲欧美日韩自偷自拍| 日本v片免费一区二区三区| 国产一区二区三区亚洲综合| 日本中文一区二区三区亚洲| a毛看片免费观看视频| 日韩免费观看视频| 日韩精品无码免费视频| 亚洲熟妇无码乱子AV电影| 今天免费中文字幕视频| 亚洲日韩国产精品无码av| 午夜电影免费观看| 日本永久免费a∨在线视频| 亚洲自偷自偷在线制服| 24小时免费看片| 亚洲国产精品无码第一区二区三区| 波霸在线精品视频免费观看| 久久亚洲中文字幕精品一区 | 亚洲国产精品自产在线播放| 一级做受视频免费是看美女 | 自拍偷自拍亚洲精品播放| 国产一区二区三区在线免费| 国产免费MV大全视频网站| 亚洲美女aⅴ久久久91| 韩国欧洲一级毛片免费| 成av免费大片黄在线观看| 亚洲综合色一区二区三区小说| 又黄又大的激情视频在线观看免费视频社区在线 | 免费不卡中文字幕在线| 一区二区三区无码视频免费福利| 国产区卡一卡二卡三乱码免费| 亚洲中文无码a∨在线观看| 免费观看a级毛片| 国色精品va在线观看免费视频|