標籤: 租車

  • C++ Primer Plus(一)

    完整閱讀C++ Primer Plus 

      系統重新學習C++語言部分,記錄重要但易被忽略的,關鍵但易被遺忘的。

     

    預備

      1、C++相對於C增加了最關鍵的兩項,面向對象和范型編程。

     

    處理數據

      2、對於變量明,C++沒有長度限制;同時,以兩個下劃線或一個下劃線和大寫字母開頭的名稱被保留給實現(編譯器及其使用的資源)使用;以一個下劃線開頭的名稱被保留給實現,用作全局標識符。

      3、C++11提供一種大括號初始化器,可以用它初始化任何類型。

    1 int ham = {24};
    2 int ems{7};
    3 int roc = {}; // 為0
    4 int rhs{};

      4、對於整型字面值,如果第一位為1~9則為十進制;如果第一位為0,第二位為1~7,則是八進制;如果前兩位為0x或0X,則為十六進制。如果希望使用cout輸出八進制或十六進制格式的整數,可以使用cout的控制符(這三個控制符都被包含在std命名空間)。

    1 cout << dec << a; // 10進制,默認的
    2 cout << oct << b; // 8進制
    3 cout << hex << c; // 16進制

      5、cout.put()、cin.get()的用法,可參照C語言中get()與put()的用法。

      6、C++有一種表示特殊字符的機制,他獨立於鍵盤,被稱作通用字符名。通用字符名以\u或\U開頭,前者後面是8個十六進制位,後者後面則是16個十六進制位。這些位表示的是ISO10646碼點。

      7、對於寬字符類型wcha_t,cin和cout無法很好的處理,此時應該使用wcinwcout

      8、C++11新增了char16_t和char32_t類型,C++11使用前綴u表示前者,U表示後者;並與形式為\u00F6和\U0000222B的通用字符名匹配。

    1 u'C' u“be good”   U'R' U”dirty rat”

      

    複合類型

      9、cin使用空白(空格、製表符、換行符)來確定字符串結束的位置,而cin.getline()可以依據換行符來讀取整行,並且可以制定最多讀取字符的數量。

      10、可以使用沒有名稱的結構類型,方法是省略名稱,同時定義一個結構類型和一個這種類型的變量,不常用,可用作臨時變量。

      11、C++允許對一個整數強制類型轉換為一個枚舉值,並參与賦值操作;同時可以有多個值相同的枚舉值,目前枚舉值也可以使用long,long long類型的值。對於較小的值編譯器會使用一個字節甚至更少的的字節,對於包含long類型的枚舉,會使用4個字節。

      12、在C中允許給指針直接賦字面值,但C++不允許,必須進行類型轉換。

     

    循環和關係表達式

      13、前綴遞增,前綴遞減,解除引用運算符的優先級相同,以從右往左的方式進行結合;後綴遞增,後綴遞減的優先級相同,但比前綴運算符的優先級高,以從左往右的方式結合。

      14、 cin.get(ch)和cin.get()的區別。

    屬性 cin.get(ch) cin.get()
    傳遞輸入字符的方式 賦值給參數ch 將函數返回值賦給ch
    用於字符輸入時函數的返回值  istream對象(執行bool轉換後為true)  int類型的字符編碼
    到達EOF時函數的返回值   istream對象(執行bool轉換後為false) EOF 

     

    函數——C++編程模塊

      15、如果數據類型本身並不是指針,則可以將const數據或者非const數據的地址賦給指向const的指針,但只能將非const數據的地址賦給非const指針

     

    函數探幽

      16、函數重載后,在調用函數時,如果沒有完全相同的參數類型,編譯器會做強制類型轉換進行匹配,但如果有多個可轉換的類型(也就是說有多個重載過的函數),C++將拒絕這種函數調用。

      17、函數重載的關鍵是函數的參數列表,也成為特徵標,以下兩個聲明互斥:

    1 long gronk(int n, float m);
    2 double gronk(int n, float m);

      C++不允許這種方式的重載,返回類型可以不同,但特徵標必須也不同。

      18、對於重載了引用參數的函數,C++將選擇調用最匹配的版本,這使得能夠根據參數是左值引用,const類型的左值引用還是右值引用來定製函數的行為。

      19、 函數模板並非函數定義,在使用模板時,編譯器會針對特定的類型生成函數實例,這種實例化方式被稱為隱式實例化

      20、C++允許顯式實例化,也就是說可以針對特定類型使用模板生成特定的實例。

    1 template void Swap<int>(int, int); // 用<>指定類型,在聲明前加template

      它的語義為“使用Swap()模板生成int類型的函數定義”。

      與顯式實例化不同的是,顯式具體化使用下面兩個等價的聲明之一:

    1 template<> void Swap<int>(int, int);
    2 template<> void Swap(int, int);

      它們的語義是,“不要使用Swap模板來生產函數定義,而應使用專門為int類型显示地定義的函數定義”。

      21、還可以在程序中創建顯式實例化:

    1 template <class T>
    2 T Add(T a, T b){ return a + b; }
    3 int m = 6;
    4 double n = 9.8;
    5 cout << Add<double>(m, n) << endl;

      由於這裏显示實例化中的特定類型為double,所以變量m會被強制類型轉換成double類型。

      22、對於函數重載函數模板函數模板重載,C++將選擇哪個版本?

      請看這裏———>   C++ 函數重載,函數模板和函數模板重載,選擇哪一個?

      23、C++11,在函數模板中,當無法得知一個變量的值時,可以使用decltype關鍵字來決定返回值類型:

    1 template<class T1, class T2>
    2 void ft(T1 x, T2 y)
    3 {
    4     decltype(x+y) xpy = x + y; // 此時xpy的類型就是x+y后的類型
    5 }

      24、decltype關鍵字本質上更複雜一些,編譯器必須遍歷一個核對錶去確定類型,現在有如下聲明:

    1 decltype(expression) var;

      第一,expression是一個沒有用括號括起來的標識符,則var的類型與該標識符相同,包括const等限定符。

      第二,如果expression是一個函數調用,則於與函數的返回值相同,這裏並不執行函數,只是查看返回值類型。

      第三,如果expression是一個左值,並且expression是被括號括起的,var會是引用類型,否則第一步就會處理。

      第四,到了這裏,var的類型只能與expression相同。

      25、C++11,在函數模板中,當無法得知返回值類型時,一般不可以直接使用關鍵字decltype來得到返回值類型,因為此時往往decltype後面表達式中的變量還不在作用域內,此時,需要使用後置返回類型

    1 template<class T1, class T2>
    2 auto gt(T1 x, T2 y) -> decltype(x+y) // 此時x,y已在作用域內
    3 {
    4     return x + y;
    5 }

      auto表示是一個佔位符,表示後置返回類型提供的類型。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 一篇文章搞懂filebeat(ELK)

    一篇文章搞懂filebeat(ELK)

    本文使用的filebeat是7.7.0的版本
    本文從如下幾個方面說明:

    • filebeat是什麼,可以用來幹嘛
    • filebeat的原理是怎樣的,怎麼構成的
    • filebeat應該怎麼玩

    一、filebeat是什麼

    1.1、filebeat和beats的關係

      首先filebeat是Beats中的一員。
      Beats在是一個輕量級日誌採集器,其實Beats家族有6個成員,早期的ELK架構中使用Logstash收集、解析日誌,但是Logstash對內存、cpu、io等資源消耗比較高。相比Logstash,Beats所佔系統的CPU和內存幾乎可以忽略不計。
    目前Beats包含六種工具:

    • Packetbeat:網絡數據(收集網絡流量數據)
    • Metricbeat:指標(收集系統、進程和文件系統級別的CPU和內存使用情況等數據)
    • Filebeat:日誌文件(收集文件數據)
    • Winlogbeat:windows事件日誌(收集Windows事件日誌數據)
    • Auditbeat:審計數據(收集審計日誌)
    • Heartbeat:運行時間監控(收集系統運行時的數據)

    1.2、filebeat是什麼

      Filebeat是用於轉發和集中日誌數據的輕量級傳送工具。Filebeat監視您指定的日誌文件或位置,收集日誌事件,並將它們轉發到Elasticsearch或 Logstash進行索引。

      Filebeat的工作方式如下:啟動Filebeat時,它將啟動一個或多個輸入,這些輸入將在為日誌數據指定的位置中查找。對於Filebeat所找到的每個日誌,Filebeat都會啟動收集器。每個收集器都讀取單個日誌以獲取新內容,並將新日誌數據發送到libbeat,libbeat將聚集事件,並將聚集的數據發送到為Filebeat配置的輸出。

           工作的流程圖如下:

     

    1.3、filebeat和logstash的關係

      因為logstash是jvm跑的,資源消耗比較大,所以後來作者又用golang寫了一個功能較少但是資源消耗也小的輕量級的logstash-forwarder。不過作者只是一個人,加入http://elastic.co公司以後,因為es公司本身還收購了另一個開源項目packetbeat,而這個項目專門就是用golang的,有整個團隊,所以es公司乾脆把logstash-forwarder的開發工作也合併到同一個golang團隊來搞,於是新的項目就叫filebeat了。

     

    二、filebeat原理是什麼

    2.1、filebeat的構成

      filebeat結構:由兩個組件構成,分別是inputs(輸入)和harvesters(收集器),這些組件一起工作來跟蹤文件並將事件數據發送到您指定的輸出,harvester負責讀取單個文件的內容。harvester逐行讀取每個文件,並將內容發送到輸出。為每個文件啟動一個harvester。harvester負責打開和關閉文件,這意味着文件描述符在harvester運行時保持打開狀態。如果在收集文件時刪除或重命名文件,Filebeat將繼續讀取該文件。這樣做的副作用是,磁盤上的空間一直保留到harvester關閉。默認情況下,Filebeat保持文件打開,直到達到close_inactive

    關閉harvester可以會產生的結果:

    • 文件處理程序關閉,如果harvester仍在讀取文件時被刪除,則釋放底層資源。
    • 只有在scan_frequency結束之後,才會再次啟動文件的收集。
    • 如果該文件在harvester關閉時被移動或刪除,該文件的收集將不會繼續

      一個input負責管理harvesters和尋找所有來源讀取。如果input類型是log,則input將查找驅動器上與定義的路徑匹配的所有文件,併為每個文件啟動一個harvester。每個input在它自己的Go進程中運行,Filebeat當前支持多種輸入類型。每個輸入類型可以定義多次。日誌輸入檢查每個文件,以查看是否需要啟動harvester、是否已經在運行harvester或是否可以忽略該文件

    2.2、filebeat如何保存文件的狀態

      Filebeat保留每個文件的狀態,並經常將狀態刷新到磁盤中的註冊表文件中。該狀態用於記住harvester讀取的最後一個偏移量,並確保發送所有日誌行。如果無法訪問輸出(如Elasticsearch或Logstash),Filebeat將跟蹤最後發送的行,並在輸出再次可用時繼續讀取文件。當Filebeat運行時,每個輸入的狀態信息也保存在內存中。當Filebeat重新啟動時,來自註冊表文件的數據用於重建狀態,Filebeat在最後一個已知位置繼續每個harvester。對於每個輸入,Filebeat都會保留它找到的每個文件的狀態。由於文件可以重命名或移動,文件名和路徑不足以標識文件。對於每個文件,Filebeat存儲唯一的標識符,以檢測文件是否以前被捕獲。

    2.3、filebeat何如保證至少一次數據消費

      Filebeat保證事件將至少傳遞到配置的輸出一次,並且不會丟失數據。是因為它將每個事件的傳遞狀態存儲在註冊表文件中。在已定義的輸出被阻止且未確認所有事件的情況下,Filebeat將繼續嘗試發送事件,直到輸出確認已接收到事件為止。如果Filebeat在發送事件的過程中關閉,它不會等待輸出確認所有事件后再關閉。當Filebeat重新啟動時,將再次將Filebeat關閉前未確認的所有事件發送到輸出。這樣可以確保每個事件至少發送一次,但最終可能會有重複的事件發送到輸出。通過設置shutdown_timeout選項,可以將Filebeat配置為在關機前等待特定時間

    三、filebeat怎麼玩

    3.1、壓縮包方式安裝

    本文採用壓縮包的方式安裝,linux版本,filebeat-7.7.0-linux-x86_64.tar.gz

    curl-L-Ohttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.0-linux-x86_64.tar.gz
    tar -xzvf filebeat-7.7.0-linux-x86_64.tar.gz

    配置示例文件:filebeat.reference.yml(包含所有未過時的配置項)
    配置文件:filebeat.yml

    3.2、基本命令

    詳情見官網:https://www.elastic.co/guide/en/beats/filebeat/current/command-line-options.html

    export   #導出
    run      #執行(默認執行)
    test     #測試配置
    keystore #秘鑰存儲
    modules  #模塊配置管理
    setup    #設置初始環境

    例如:./filebeat test config  #用來測試配置文件是否正確

    3.3、輸入輸出

    支持的輸入組件:

    Multilinemessages,Azureeventhub,CloudFoundry,Container,Docker,GooglePub/Sub,HTTPJSON,Kafka,Log,MQTT,NetFlow,Office365ManagementActivityAPI,Redis,s3,Stdin,Syslog,TCP,UDP(最常用的額就是log)

    支持的輸出組件:

    Elasticsearch,Logstash,Kafka,Redis,File,Console,ElasticCloud,Changetheoutputcodec(最常用的就是Elasticsearch,Logstash)

    3.4、keystore的使用

    keystore主要是防止敏感信息被泄露,比如密碼等,像ES的密碼,這裏可以生成一個key為ES_PWD,值為es的password的一個對應關係,在使用es的密碼的時候就可以使用${ES_PWD}使用

    創建一個存儲密碼的keystore:filebeat keystore create
    然後往其中添加鍵值對,例如:filebeatk eystore add ES_PWD
    使用覆蓋原來鍵的值:filebeat key store add ES_PWD–force
    刪除鍵值對:filebeat key store remove ES_PWD
    查看已有的鍵值對:filebeat key store list

    例如:後期就可以通過${ES_PWD}使用其值,例如:

    output.elasticsearch.password:”${ES_PWD}”

    3.5、filebeat.yml配置(log輸入類型為例)

    詳情見官網:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html

    type: log #input類型為log
    enable: true #表示是該log類型配置生效
    paths:     #指定要監控的日誌,目前按照Go語言的glob函數處理。沒有對配置目錄做遞歸處理,比如配置的如果是:
    - /var/log/* /*.log  #則只會去/var/log目錄的所有子目錄中尋找以".log"結尾的文件,而不會尋找/var/log目錄下以".log"結尾的文件。
    recursive_glob.enabled: #啟用全局遞歸模式,例如/foo/**包括/foo, /foo/*, /foo/*/* encoding:#指定被監控的文件的編碼類型,使用plain和utf-8都是可以處理中文日誌的
    exclude_lines: ['^DBG'] #不包含匹配正則的行
    include_lines: ['^ERR', '^WARN']  #包含匹配正則的行
    harvester_buffer_size: 16384 #每個harvester在獲取文件時使用的緩衝區的字節大小
    max_bytes: 10485760 #單個日誌消息可以擁有的最大字節數。max_bytes之後的所有字節都被丟棄而不發送。默認值為10MB (10485760)
    exclude_files: ['\.gz$']  #用於匹配希望Filebeat忽略的文件的正則表達式列表
    ingore_older: 0 #默認為0,表示禁用,可以配置2h,2m等,注意ignore_older必須大於close_inactive的值.表示忽略超過設置值未更新的
    文件或者文件從來沒有被harvester收集
    close_* #close_ *配置選項用於在特定標準或時間之後關閉harvester。 關閉harvester意味着關閉文件處理程序。 如果在harvester關閉
    後文件被更新,則在scan_frequency過後,文件將被重新拾取。 但是,如果在harvester關閉時移動或刪除文件,Filebeat將無法再次接收文件
    ,並且harvester未讀取的任何數據都將丟失。
    close_inactive  #啟動選項時,如果在制定時間沒有被讀取,將關閉文件句柄
    讀取的最後一條日誌定義為下一次讀取的起始點,而不是基於文件的修改時間
    如果關閉的文件發生變化,一個新的harverster將在scan_frequency運行后被啟動
    建議至少設置一個大於讀取日誌頻率的值,配置多個prospector來實現針對不同更新速度的日誌文件
    使用內部時間戳機制,來反映記錄日誌的讀取,每次讀取到最後一行日誌時開始倒計時使用2h 5m 來表示
    close_rename #當選項啟動,如果文件被重命名和移動,filebeat關閉文件的處理讀取
    close_removed #當選項啟動,文件被刪除時,filebeat關閉文件的處理讀取這個選項啟動后,必須啟動clean_removed
    close_eof #適合只寫一次日誌的文件,然後filebeat關閉文件的處理讀取
    close_timeout #當選項啟動時,filebeat會給每個harvester設置預定義時間,不管這個文件是否被讀取,達到設定時間后,將被關閉
    close_timeout 不能等於ignore_older,會導致文件更新時,不會被讀取如果output一直沒有輸出日誌事件,這個timeout是不會被啟動的,
    至少要要有一個事件發送,然後haverter將被關閉
    設置0 表示不啟動
    clean_inactived #從註冊表文件中刪除先前收穫的文件的狀態
    設置必須大於ignore_older+scan_frequency,以確保在文件仍在收集時沒有刪除任何狀態
    配置選項有助於減小註冊表文件的大小,特別是如果每天都生成大量的新文件
    此配置選項也可用於防止在Linux上重用inode的Filebeat問題
    clean_removed #啟動選項后,如果文件在磁盤上找不到,將從註冊表中清除filebeat
    如果關閉close removed 必須關閉clean removed
    scan_frequency #prospector檢查指定用於收穫的路徑中的新文件的頻率,默認10s
    tail_files:#如果設置為true,Filebeat從文件尾開始監控文件新增內容,把新增的每一行文件作為一個事件依次發送,
    而不是從文件開始處重新發送所有內容。
    symlinks:#符號鏈接選項允許Filebeat除常規文件外,可以收集符號鏈接。收集符號鏈接時,即使報告了符號鏈接的路徑,
    Filebeat也會打開並讀取原始文件。
    backoff: #backoff選項指定Filebeat如何积極地抓取新文件進行更新。默認1s,backoff選項定義Filebeat在達到EOF之後
    再次檢查文件之間等待的時間。
    max_backoff: #在達到EOF之後再次檢查文件之前Filebeat等待的最長時間
    backoff_factor: #指定backoff嘗試等待時間幾次,默認是2
    harvester_limit:#harvester_limit選項限制一個prospector并行啟動的harvester數量,直接影響文件打開數
    
    tags #列表中添加標籤,用過過濾,例如:tags: ["json"]
    fields #可選字段,選擇額外的字段進行輸出可以是標量值,元組,字典等嵌套類型
    默認在sub-dictionary位置
    filebeat.inputs:
    fields:
    app_id: query_engine_12
    fields_under_root #如果值為ture,那麼fields存儲在輸出文檔的頂級位置
    
    multiline.pattern #必須匹配的regexp模式
    multiline.negate #定義上面的模式匹配條件的動作是 否定的,默認是false
    假如模式匹配條件'^b',默認是false模式,表示講按照模式匹配進行匹配 將不是以b開頭的日誌行進行合併
    如果是true,表示將不以b開頭的日誌行進行合併
    multiline.match # 指定Filebeat如何將匹配行組合成事件,在之前或者之後,取決於上面所指定的negate
    multiline.max_lines #可以組合成一個事件的最大行數,超過將丟棄,默認500
    multiline.timeout #定義超時時間,如果開始一個新的事件在超時時間內沒有發現匹配,也將發送日誌,默認是5s
    max_procs #設置可以同時執行的最大CPU數。默認值為系統中可用的邏輯CPU的數量。
    name #為該filebeat指定名字,默認為主機的hostname
     

    3.6、實例一:logstash作為輸出

    filebeat.yml配置

    #=========================== Filebeat inputs =============================
    
    filebeat.inputs:
    
    # Each - is an input. Most options can be set at the input level, so
    # you can use different inputs for various configurations.
    # Below are the input specific configurations.
    
    - type: log
    
      # Change to true to enable this input configuration.
      enabled: true
    
      # Paths that should be crawled and fetched. Glob based paths.
      paths:  #配置多個日誌路徑
        - /var/logs/es_aaa_index_search_slowlog.log
        - /var/logs/es_bbb_index_search_slowlog.log
        - /var/logs/es_ccc_index_search_slowlog.log
        - /var/logs/es_ddd_index_search_slowlog.log
        #- c:\programdata\elasticsearch\logs\*
    
      # Exclude lines. A list of regular expressions to match. It drops the lines that are
      # matching any regular expression from the list.
      #exclude_lines: ['^DBG']
    
      # Include lines. A list of regular expressions to match. It exports the lines that are
      # matching any regular expression from the list.
      #include_lines: ['^ERR', '^WARN']
    
      # Exclude files. A list of regular expressions to match. Filebeat drops the files that
      # are matching any regular expression from the list. By default, no files are dropped.
      #exclude_files: ['.gz$']
    
      # Optional additional fields. These fields can be freely picked
      # to add additional information to the crawled log files for filtering
      #fields:
      #  level: debug
      #  review: 1
    
      ### Multiline options
    
      # Multiline can be used for log messages spanning multiple lines. This is common
      # for Java Stack Traces or C-Line Continuation
    
      # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
      #multiline.pattern: ^\[
    
      # Defines if the pattern set under pattern should be negated or not. Default is false.
      #multiline.negate: false
    
      # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
      # that was (not) matched before or after or as long as a pattern is not matched based on negate.
      # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
      #multiline.match: after
    
    
    #================================ Outputs =====================================
    
    #----------------------------- Logstash output --------------------------------
    output.logstash:
      # The Logstash hosts #配多個logstash使用負載均衡機制
      hosts: ["192.168.110.130:5044","192.168.110.131:5044","192.168.110.132:5044","192.168.110.133:5044"]  
      loadbalance: true  #使用了負載均衡
    
      # Optional SSL. By default is off.
      # List of root certificates for HTTPS server verifications
      #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
    
      # Certificate for SSL client authentication
      #ssl.certificate: "/etc/pki/client/cert.pem"
    
      # Client Certificate Key
      #ssl.key: "/etc/pki/client/cert.key"

    ./filebeat -e   #啟動filebeat

    logstash的配置

    input {
      beats {
        port => 5044   
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://192.168.110.130:9200"] #這裏可以配置多個
        index => "query-%{yyyyMMdd}" 
      }
    }

     

    3.7、實例二:elasticsearch作為輸出

    filebeat.yml的配置:

    ###################### Filebeat Configuration Example #########################
    
    # This file is an example configuration file highlighting only the most common
    # options. The filebeat.reference.yml file from the same directory contains all the
    # supported options with more comments. You can use it as a reference.
    #
    # You can find the full configuration reference here:
    # https://www.elastic.co/guide/en/beats/filebeat/index.html
    
    # For more available modules and options, please see the filebeat.reference.yml sample
    # configuration file.
    
    #=========================== Filebeat inputs =============================
    
    filebeat.inputs:
    
    # Each - is an input. Most options can be set at the input level, so
    # you can use different inputs for various configurations.
    # Below are the input specific configurations.
    
    - type: log
    
      # Change to true to enable this input configuration.
      enabled: true
    
      # Paths that should be crawled and fetched. Glob based paths.
      paths:
        - /var/logs/es_aaa_index_search_slowlog.log
        - /var/logs/es_bbb_index_search_slowlog.log
        - /var/logs/es_ccc_index_search_slowlog.log
        - /var/logs/es_dddd_index_search_slowlog.log
        #- c:\programdata\elasticsearch\logs\*
    
      # Exclude lines. A list of regular expressions to match. It drops the lines that are
      # matching any regular expression from the list.
      #exclude_lines: ['^DBG']
    
      # Include lines. A list of regular expressions to match. It exports the lines that are
      # matching any regular expression from the list.
      #include_lines: ['^ERR', '^WARN']
    
      # Exclude files. A list of regular expressions to match. Filebeat drops the files that
      # are matching any regular expression from the list. By default, no files are dropped.
      #exclude_files: ['.gz$']
    
      # Optional additional fields. These fields can be freely picked
      # to add additional information to the crawled log files for filtering
      #fields:
      #  level: debug
      #  review: 1
    
      ### Multiline options
    
      # Multiline can be used for log messages spanning multiple lines. This is common
      # for Java Stack Traces or C-Line Continuation
    
      # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
      #multiline.pattern: ^\[
    
      # Defines if the pattern set under pattern should be negated or not. Default is false.
      #multiline.negate: false
    
      # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
      # that was (not) matched before or after or as long as a pattern is not matched based on negate.
      # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
      #multiline.match: after
    
    
    #============================= Filebeat modules ===============================
    
    filebeat.config.modules:
      # Glob pattern for configuration loading
      path: ${path.config}/modules.d/*.yml
    
      # Set to true to enable config reloading
      reload.enabled: false
    
      # Period on which files under path should be checked for changes
      #reload.period: 10s
    
    #==================== Elasticsearch template setting ==========================
    
    
    #================================ General =====================================
    
    # The name of the shipper that publishes the network data. It can be used to group
    # all the transactions sent by a single shipper in the web interface.
    name: filebeat222
    
    # The tags of the shipper are included in their own field with each
    # transaction published.
    #tags: ["service-X", "web-tier"]
    
    # Optional fields that you can specify to add additional information to the
    # output.
    #fields:
    #  env: staging
    
    #cloud.auth:
    
    #================================ Outputs =====================================
    
    
    #-------------------------- Elasticsearch output ------------------------------
    output.elasticsearch:
      # Array of hosts to connect to.
      hosts: ["192.168.110.130:9200","92.168.110.131:9200"]
    
      # Protocol - either `http` (default) or `https`.
      #protocol: "https"
    
      # Authentication credentials - either API key or username/password.
      #api_key: "id:api_key"
      username: "elastic"
      password: "${ES_PWD}"   #通過keystore設置密碼

    ./filebeat -e   #啟動filebeat

    查看elasticsearch集群,有一個默認的索引名字filebeat-%{[beat.version]}-%{+yyyy.MM.dd}

     

     

     

    3.8、filebeat模塊

    官網:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html

    這裏我使用elasticsearch模式來解析es的慢日誌查詢,操作步驟如下,其他的模塊操作也一樣:

    前提: 安裝好Elasticsearch和kibana兩個軟件,然後使用filebeat

    具體的操作官網有:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules-quickstart.html

    第一步,配置filebeat.yml文件

    #============================== Kibana =====================================
    
    # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
    # This requires a Kibana endpoint configuration.
    setup.kibana:
    
      # Kibana Host
      # Scheme and port can be left out and will be set to the default (http and 5601)
      # In case you specify and additional path, the scheme is required: http://localhost:5601/path
      # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
      host: "192.168.110.130:5601"  #指定kibana
      username: "elastic"   #用戶
      password: "${ES_PWD}"  #密碼,這裏使用了keystore,防止明文密碼
    
      # Kibana Space ID
      # ID of the Kibana Space into which the dashboards should be loaded. By default,
      # the Default Space will be used.
      #space.id:
    
    #================================ Outputs =====================================
    
    # Configure what output to use when sending the data collected by the beat.
    
    #-------------------------- Elasticsearch output ------------------------------
    output.elasticsearch:
      # Array of hosts to connect to.
      hosts: ["192.168.110.130:9200","192.168.110.131:9200"]
    
      # Protocol - either `http` (default) or `https`.
      #protocol: "https"
    
      # Authentication credentials - either API key or username/password.
      #api_key: "id:api_key"
      username: "elastic"  #es的用戶
      password: "${ES_PWD}" # es的密碼
      #這裏不能指定index,因為我沒有配置模板,會自動生成一個名為filebeat-%{[beat.version]}-%{+yyyy.MM.dd}的索引

    第二步:配置elasticsearch的慢日誌路徑

    cd filebeat-7.7.0-linux-x86_64/modules.d
    

    vim  elasticsearch.yml

     

     

     

    第三步:生效es模塊

    ./filebeat modules elasticsearch

    查看生效的模塊

    ./filebeat modules list

     

     

     

    第四步:初始化環境

    ./filebeat setup -e

     

     

     

     

     第五步:啟動filebeat

    ./filebeat -e

    查看elasticsearch集群,如下圖所示,把慢日誌查詢的日誌都自動解析出來了:

     

     到這裏,elasticsearch這個module就實驗成功了

     

    參考

    官網:https://www.elastic.co/guide/en/beats/filebeat/current/index.html

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

    網頁設計最專業,超強功能平台可客製化

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • MySQL 性能優化之慢查詢

    MySQL 性能優化之慢查詢

    性能優化的思路

    1. 首先需要使用慢查詢功能,去獲取所有查詢時間比較長的SQL語句
    2. 其次使用explain命令去查詢由問題的SQL的執行計劃(腦補鏈接:點我直達1,點我直達2)
    3. 最後可以使用show profile[s] 查看由問題的SQL的性能使用情況
    4. 優化SQL語句

    介紹

      數據庫查詢快慢是影響項目性能的一大因素,對於數據庫,我們除了要優化SQL,更重要的是得先找到需要優化的SQL語句

      MySQL數據庫有一個“慢查詢日誌”功能,用來記錄查詢時間超過某個設定值的SQL,這將極大程度幫助我們快速定位到問題所在,以便對症下藥

    至於查詢時間的多少才算慢,每個項目、業務都有不同的要求。
        比如傳統企業的軟件允許查詢時間高於某個值,但是把這個標準方在互聯網項目或者訪問量大的網站上,估計就是一個Bug,甚至可能升級為一個功能缺陷。

      MySQL的慢查詢日誌功能,默認是關閉的,需要手動開啟

    開啟慢查詢功能

    查看是否開啟慢查詢功能

     

     

    參數說明:

    • slow_query_log:是否開啟慢查詢,on為開啟,off為關閉;
    • log-slow-queries:舊版(5.6以下版本)MySQL數據庫慢查詢存儲路徑,可以不設置該參數,系統則會給一個缺省的文件:host_name-slow.log
    • long_query_time:慢查詢閥值,當查詢時間多於設置的閥值時,記錄日誌,單位為秒。

    臨時開啟滿查詢功能

      在MySQL執行SQL語句設置,但是如果重啟MySQL的話會失效。

    set global slow_query_log=on;
    set global long_query_time=1;

    永久性開啟慢查詢

      修改:/etc/my.cnf,添加以下內容,然後重啟MySQL服務

    [mysqld]
    lower_case_table_names=1
    slow_query_log=ON
    slow_query_log_file=/usr/local/mysql/data/chenyanbindeMacBook-Pro-slow.log
    long_query_time=1

     

    查看滿查詢啟動狀態

    演示慢查詢

      為了演示方便,我們讓sql睡眠3秒!

    格式說明:

    • 第一行,SQL查詢執行的具體時間
    • 第二行,執行SQL查詢的連接信息,用戶和連接IP
    • 第三行,記錄了一些我們比較有用的信息,
      • Query_timme,這條SQL執行的時間,越長則越慢
      • Lock_time,在MySQL服務器階段(不是在存儲引擎階段)等待表鎖時間
      • Rows_sent,查詢返回的行數
      • Rows_examined,查詢檢查的行數,越長就越浪費時間
    • 第四行,設置時間戳,沒有實際意義,只是和第一行對應執行時間。
    • 第五行,執行的SQL語句記錄信息

    分析滿查詢日誌

    MySQL自帶的mysqldumpslow

     

     

     

    參數說明:

    • -s, 是表示按照何種方式排序,c、t、l、r分別是按照記錄次數、時間、查詢時間、返回的記錄數來排序,ac、at、al、ar,表示相應的倒敘;
    • -t, 是top n的意思,即為返回前面多少條的數據;
    • -g, 後邊可以寫一個正則匹配模式,大小寫不敏感的;

    MySQL性能fenix語句show profile(重要

    介紹

    • Query Profiler是MySQL自帶的一種query診斷分析工具,通過它可以分析出一條SQL語句性能瓶頸在什麼地方。
    • 通常使用explain,以及slow query log都無法做到精確分析,但是Query profiler卻可以定位出一條SQL執行的各種資源消耗情況,比如CPU、IO等,以及該SQL執行所耗費的時間等。不過該工具只有在MySQL5.0.37以上版本中才有實現
    • 默認的情況下,MySQL的該功能沒有打開,需要自己手動打開

    語句使用

    • show profileshow profiles語句可以展示當前會話(退出session后,profiling重置為0)中執行語句的資源使用情況。
    • show profiles:以列表形式显示最近發送到服務器上執行的語句的資源使用情況,显示的記錄數由變量:profiling_history_size控制,默認15條
    • show profile:只是最近一條語句執行的消息資源佔用信息,默認實現Status和Duration兩列

    開啟Profile功能

    • Profile功能由MySQL會話變量:profiling控制,默認是OFF關閉狀態。
    • 查看是否開啟了Profile功能
    select @@profiling;
    
    show variables like '%profil%';

     

    打開profiling功能

    set profiling=1;

     

    show profile用法

    SHOW PROFILE [type [, type] …… ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]]
    
    type: { ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY | PAGE FAULTS | SOURCE | SWAPS }

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※教你寫出一流的銷售文案?

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※回頭車貨運收費標準

    ※別再煩惱如何寫文案,掌握八大原則!

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 【Spring】BeanDefinition&PostProcessor不了解一下嗎?

    水稻:這两天看了BeanDefinition和BeanFactoryPostProcessor還有BeanPostProcessor的源碼。要不要了解一下

    菜瓜:six six six,大佬請講

    水稻:上次我們說SpringIOC容器是一個典型的工廠模式

    • 假如我們把Spring比作一個生產模型的大工廠,那麼.class文件就是原材料。而BeanDefinition就是創建模型的模具。不管是傳統的XML還是後面的註解,Spring在啟動的時候都會創建一個掃描器去掃描指定目錄下的.class文件,並根據文件的註解,實現的接口以及成員變量將其封裝一個個的BeanDefinition。
      • 比較重要的屬性有id,class,構造函數封裝類,屬性封裝類,factoryMethod等
    • 在對象初始化之前Spring會完成BeanDefinition對象的解析並將其裝入List容器beanDefinitionNames中,然後開始遍歷該容器並根據BeanDefinition創建對象

    菜瓜:sodasinei,BeanDefinition我了解了。它是創建bean的模板,類似於java創建對象依賴的class一樣。那還有兩個很長的單詞是啥呢?

    水稻:忽略掉後面老長的後綴,我們看BeanFactory和Bean是不是很親切。PostProcessor被翻譯成後置處理器,暫且我們把它看成是處理器就行

    • BeanFactory是bean工廠,它可以獲取並修改BeanDefinition的屬性,進而影響後面創建的對象。
    • Bean就是Spring的對象,這些個處理器才是真正處理bean對象的各個環節的工序,包括屬性,註解,方法

    菜瓜:有了模糊的概念,不明覺厲

    水稻:來,看demo

    package com.vip.qc.postprocessor;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.MutablePropertyValues;
    import org.springframework.beans.factory.config.BeanDefinition;
    import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
    import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
    import org.springframework.stereotype.Component;
    
    /**
     * 獲取初始化好的BeanFactory,此時還未進行bean的實例化
     *
     * @author QuCheng on 2020/6/14.
     */
    @Component
    public class BeanFactoryPostProcessorT implements BeanFactoryPostProcessor {
    
        public static final String BEAN_NAME = "processorT";
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            BeanDefinition initializingBeanT = beanFactory.getBeanDefinition(BEAN_NAME);
            MutablePropertyValues propertyValues = initializingBeanT.getPropertyValues();
            String pName = "a";
            System.out.println("BeanFactoryPostProcessor a " + propertyValues.getPropertyValue(pName) + " -> 1");
            propertyValues.addPropertyValue(pName, "1");
        }
    }
    
    
    package com.vip.qc.postprocessor;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    /**
     * @author QuCheng on 2020/6/14.
     */
    @Component
    public class BeanPostProcessorT implements BeanPostProcessor {
    
        public static final String beanNameT = "processorT";
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (beanNameT.equals(beanName)) {
                ProcessorT processorT = ((ProcessorT) bean);
                System.out.println("BeanPostProcessor BeforeInitialization  a:" + processorT.getA() + "-> 3");
                processorT.setA("3");
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (beanNameT.equals(beanName)){
                ProcessorT processorT = ((ProcessorT) bean);
                System.out.println("BeanPostProcessor AfterInitialization  a:" + processorT.getA() + "-> 4");
                processorT.setA("4");
            }
            return bean;
        }
    
    }
    
    
    package com.vip.qc.postprocessor;
    
    import org.springframework.stereotype.Component;
    
    /**
     * @author QuCheng on 2020/6/14.
     */
    @Component
    public class ProcessorT {
    
        public ProcessorT() {
            System.out.println("ProcessorT 無參構造 a:" + a + "-> 2" );
            a = "2";
        }
    
        private String a;
    
        public String getA() {
            return a;
        }
    
        public void setA(String a) {
            this.a = a;
        }
    
        @Override
        public String toString() {
            return "ProcessorT{" +
                    "a='" + a + '\'' +
                    '}';
        }
    }
    
    // 測試類
    @Test
    public void test() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.vip.qc.postprocessor");
        ProcessorT processorT = (ProcessorT) context.getBean("processorT");
        System.out.println(processorT);
    }
    
    // 結果
    BeanFactoryPostProcessor a null -> 1
    ProcessorT 無參構造 a:null-> 2
    BeanPostProcessor BeforeInitialization a:1-> 3
    BeanPostProcessor AfterInitialization a:3-> 4
    ProcessorT{a='4'}
    • BeanFactoryPostProcessor在對象還未初始化前可以拿到對象的BeanDefinition對其設置屬性值
    • 過程中我們分別對屬性a設置了1,2,3,4的值。最後我們拿到的值為4

    菜瓜:好像看懂了。BeanFactoryPostProcessor可以拿到BeanFactory對象,獲取裏面所有的BeanDefinition並可對其進行干預。BeanPostProcessor其實是在bean已經被創建完成之後進行加工操作

    水稻:沒錯。這是我們自己進行干預的demo。限於篇幅有限,你可以去看一下Spring自己對於這兩個接口的實現源碼。比較重要的推薦下面幾個

    • ConfigurationClassPostProcessor 實現BeanFactoryPostProcessor子接口
      • 完成對@Configuration、@Component、@ComponentScan、@Bean、@Import、@ImportSource註解的搜集和解析
      • @Bean註解會被封裝成所在Bean的BeanDefinition中的factoryMethod屬性中,單獨進行實例化
    • CommonAnnotationBeanPostProcessor 實現 BeanPostProcessor
      • 完成@PostConstruct@PreDestroy@Resource註解的搜集和解析工作
      • @PostConstruct會在對象初始化且屬性渲染完成後進行
      • @Resource註解(參照下面)
    • AutowiredAnnotationBeanPostProcessor 實現 BeanPostProcessor
      • 完成@Autowired@Value註解的搜集和解析工作
      • 在對象初始化完成之後會先進行註解的搜集,然後進行屬性渲染調用populateBean方法,使用策略模式調用實現接口對註解進行解析,有@Autowired和@Value註解會調用getBean方法發起對依賴屬性的注入
    • AbstractAutoProxyCreator的入口類也是實現的BeanPostProcessor

    菜瓜:你放心,我不會看的。這麼複雜的東西,聽着都費勁

    水稻:不愧是你!有機會聊bean的生命周期的時候咱們還會說到這些東西。到時候再刷一遍

     

    總結:

    • BeanDefinition是spring容器創建對象的模板,定義了bean創建的細節
    • BeanFactoryPostProcessor可以拿到整個容器對象,當然也能修改BeanDefinition,所以能直接操作bean的創建
    • BeanPostProcessor執行的時候bean已經創建完成了,我們可以拿到想要的對象進行干預和設值等操作

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※超省錢租車方案

    ※別再煩惱如何寫文案,掌握八大原則!

    ※回頭車貨運收費標準

    ※教你寫出一流的銷售文案?

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

  • 微服務技術棧:常見註冊中心組件,對比分析

    微服務技術棧:常見註冊中心組件,對比分析

    本文源碼:GitHub·點這裏 || GitEE·點這裏

    一、註冊中心簡介

    1、基礎概念

    在分佈式架構的系統中註冊中心這個概念就已經被提出了,最經典的就是Zookeeper中間件。

    微服務架構中,註冊中心是最核心的基礎服務之一,註冊中心可以看做是微服務架構中的通信中心,當一個服務去請求另一個服務時,通過註冊中心可以獲取該服務的狀態,地址等核心信息。

    服務註冊主要關係到三大角色:服務提供者、服務消費者、註冊中心。

    2、流程和原理

    基礎流程

    • 服務啟動時,將自身的網絡地址等信息註冊到註冊中心,註冊中心記錄服務註冊數據。
    • 服務消費者從註冊中心獲取服務提供者的地址,並通過地址和基於特定的方式調用服務提供者的接口。
    • 各個服務與註冊中心使用一定機制通信。如果註冊中心與服務長時間無法通信,就會註銷該實例,這也稱為服務下線,當服務重新連接之後,會基於一定的策略在線上線。
    • 服務地址相關信息發生變化時,會重新註冊到註冊中心。這樣,服務消費者就無需手工維護提供者的相關配置。

    核心功能

    通過上面的基本流程,不難發現一個註冊中心需要具備哪些核心功能:

    • 服務發現

    服務發現是指服務在啟動后,註冊到註冊中心,服務方提供自身的元數據,比如IP地址、端口、運行狀況指標的Uri 、主頁地址等信息。

    • 服務記錄

    記錄註冊中心的服務的信息,例如服務名稱、IP地址、端口等。服務消費方基於查詢獲取可用的服務實例列表。

    • 動態管理服務

    註冊中心基於特定的機制定時測試已註冊的服務,例如:默認的情況下會每隔30秒發送一次心跳來進行服務續約。通過服務續約來告知Server該Client仍然可用。正常情況下,如果Server在90 秒內沒有收到Client 的心跳,Server會將Client 實例從註冊列表中刪除。

    二、基礎組件對比

    1、Zookeeper組件

    1.1基礎描述

    ZooKeeper是非常經典的服務註冊中心中間件,在國內環境下,由於受到Dubbo框架的影響,大部分情況下認為Zookeeper是RPC服務框架下註冊中心最好選擇,隨着Dubbo框架的不斷開發優化,和各種註冊中心組件的誕生,即使是RPC框架,現在的註冊中心也逐步放棄了ZooKeeper。在常用的開發集群環境中,ZooKeeper依然起到十分重要的作用,Java體系中,大部分的集群環境都是依賴ZooKeeper管理服務的各個節點。

    1.2組件特點

    從Zookeeper的數據結構特點看,並不是基於服務註冊而設計的,ZooKeeper提供的命名空間與文件系統的名稱空間非常相似,在數據結構上高度抽象為K-V格式,十分通用,說到這裏不得不提一下Redis,也可以作為註冊中心使用,只是用的不多。

    ZooKeeper組件支持節點短暫存在,只要創建znode的會話處於活動狀態,這些znode就會存在,會話結束時,將刪除znode。Dubbo框架正是基於這個特點,服務啟動往Zookeeper註冊的就是臨時節點,需要定時發心跳到Zookeeper來續約節點,並允許服務下線時,將Zookeeper上相應的節點刪除,同時Zookeeper使用ZAB協議雖然保證了數據的強一致性。

    2、Eureka組件

    2.1基礎描述

    SpringCloud框架生態中最原生的深度結合組件,Eureka是Netflix開發的服務發現框架,基於REST的服務,主要用於服務註冊,管理,負載均衡和服務故障轉移。但是官方聲明在Eureka2.0版本停止維護,不建議使用。

    2.2組件特點

    Eureka包含兩個組件:EurekaServer和EurekaClient。

    EurekaServer提供服務註冊服務,各個節點啟動后,會在EurekaServer中進行註冊,這樣EurekaServer中的服務註冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在界面中直觀的看到。Eureka允許在註冊服務的時候,自定義實現檢查自身狀態的是否健康的方法,這在服務實例能夠保持心跳上報的場景下,是一種比較好的體驗。

    EurekaClient是一個java客戶端,用於簡化與EurekaServer的交互,客戶端同時也就是一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。

    3、Consul組件

    3.1基礎描述

    Consul是用於服務發現和配置的工具。Consul是分佈式的,高度可用的,並且具有極高的可伸縮性,而且開發使用都很簡便。它提供了一個功能齊全的控制面板,主要特點是:服務發現、健康檢查、鍵值存儲、安全服務通信、多數據中心、ServiceMesh。Consul在設計上把很多分佈式服務治理上要用到的功能都包含在內了。

    3.2組件特點

    Consul提供多個數據中心的支持,基於Fabio做負載均衡,每個數據中心內,都有客戶端和服務端的混合構成。預計有三到五台服務端。可以在失敗和性能的可用性之間取得良好的平衡。數據中心中的所有節點都參与八卦協議。這意味着有一個八卦池,其中包含給定數據中心的所有節點。這有幾個目的:首先,不需要為客戶端配置服務器的地址;發現是自動完成的。其次,檢測節點故障的工作不是放在服務器上,而是分佈式的。這使得故障檢測比天真的心跳方案更具可擴展性。第三,它被用作消息傳遞層,用於在諸如領導者選舉等重要事件發生時進行通知。

    4、Nacos組件

    4.1基礎描述

    Nacos致力於發現、配置和管理微服務。Nacos提供了一組簡單易用的特性集,幫助您實現動態服務發現、服務配置管理、服務及流量管理。Nacos更敏捷和容易地構建、交付和管理微服務平台。 Nacos 是構建以“服務”為中心的現代應用架構(例如微服務範式、雲原生範式)的服務基礎設施。Nacos支持作為RPC註冊中心,例如:支持Dubbo框架;也具備微服務註冊中心的能力,例如:SpringCloud框架。

    4.2組件特點

    Nacos在經過多年生產經驗后提煉出的數據模型,則是一種服務-集群-實例的三層模型。如上文所說,這樣基本可以滿足服務在所有場景下的數據存儲和管理,數據模型雖然相對複雜,但是並不強制使用數據結構的風格,大多數應用場景下,和Eureka數據模型是類似的。

    Nacos提供數據邏輯隔離模型,用戶賬號可以新建多個命名空間,每個命名空間對應一個客戶端實例,這個命名空間對應的註冊中心物理集群是可以根據規則進行路由的,這樣可以讓註冊中心內部的升級和遷移對用戶是無感知的。

    三、組件選擇

    如下註冊中心對比圖。

    綜合上述幾種註冊中心對比,再從現在SpringCloud框架流行趨勢看,個人推薦後續微服務架構體系選擇Nacos組件,大致原因如下,社區活躍,經過大規模業務驗證,不但可以作為微服務註冊中心,也支持作RPC框架Dubbo的註冊中心,且有完善的中文文檔,總結下來就一句話:通用中間件,省時;文檔詳細,省心。

    四、源代碼地址

    GitHub·地址
    https://github.com/cicadasmile/husky-spring-cloud
    GitEE·地址
    https://gitee.com/cicadasmile/husky-spring-cloud
    

    推薦文章:微服務基礎系列

    序號 文章標題
    01 微服務基礎:Eureka組件,管理服務註冊發現
    02 微服務基礎:Ribbon和Feign組件,實現請求負載均衡
    03 微服務基礎:Hystrix組件,實現服務熔斷
    04 微服務基礎:Turbine組件,實現微服務集群監控
    05 微服務基礎:Zuul組件,實現路由網關控制
    06 微服務基礎:Config組件,實現配置統一管理
    07 微服務基礎:Zipkin組件,實現請求鏈路追蹤
    08 微服務基礎:與Dubbo框架、Boot框架對比分析
    09 微服務基礎:Nacos組件,服務和配置管理
    10 微服務基礎:Sentinel組件,服務限流和降級
    11 微服務應用:分庫分表模式下,數據庫擴容方案
    12 微服務應用:Shard-Jdbc分庫分表,擴容方案實現

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

  • 同級最便宜,這款20多萬的超帥氣SUV車主卻說……

    同級最便宜,這款20多萬的超帥氣SUV車主卻說……

    0L混動最大馬力(pS):182/發動機:146 電動機:184最大扭矩(Nm):240/發動機:175 電動機:315變速箱:8DCT/E-CVT百公里加速(s):8。35/8。6百公里油耗(L):6。8/5車主百公里油耗(L):8。71/暫

    謳歌CDX肩負着在國內為謳歌品牌打開市場的重任,它具備極其前衛的設計風格,而且看到實車時你就會感受到其設計的精緻感!

    寬敞的空間,前衛設計讓它具有不錯的競爭力。而且它搭載一款1.5T高功率發動機,匹配一副8擋雙離合變速箱,動力系統匹配是高效的,它換擋平順,降擋的速度也相當快,動力表現可圈可點!下面我們就來看看這款豪華SUV車型的各方面表現怎麼樣吧!

    長寬高:4496*1840*1615mm

    軸距:2660mm

    定位:緊湊型SUV

    設計激進的謳歌CDX可謂是同級車型中的一股清流,前臉造型極其激進,鑽石形中網造型顯得相當有個性。同時車身線條緊湊,但車內卻能營造出足夠的乘坐空間。

    內飾方面它在細節處富有創意,造型類似“如意”的旋鈕擋把設計科技感強,而內飾的用料也是到位的。值得一提的是這套內飾的按鍵布局簡約、合理,方向盤上的按鍵也具備不錯手感,在行車過程中操作便利!

    發動機:1.5T/2.0L混動

    最大馬力(pS):182/發動機:146 電動機:184

    最大扭矩(Nm):240/發動機:175 電動機:315

    變速箱:8DCT/E-CVT

    百公里加速(s):8.35/8.6

    百公里油耗(L):6.8/5

    車主百公里油耗(L):8.71/暫本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計最專業,超強功能平台可客製化

  • 大尺寸+高配置 眾泰T800 13.98萬起售

    大尺寸+高配置 眾泰T800 13.98萬起售

    4英寸中控屏第一時間抓住你的眼球,全車的功能基本都集成在裏面,旋鈕式換擋,全液晶儀錶,大面積軟性材料的包裹,檔次感還是營造的不錯,雖然說中控UI界面布局和反應速度還有提升的空間,但結合其價格來看,也能讓你產生“要啥自行車”的感慨了。

    眾泰T800在5月8日晚正式上市,新車共推出五款車型,售價13.98-18.58萬元。T800作為眾泰首款七座中型SUV,其配置同尺寸都達到了品牌的新高度。動力總成為2.0T+6DCT,從某種角度上T800可視作T700的加長版本。

    眾泰T800在外觀設計上可以說擁有相當高的原創度,前臉進氣格柵的面積非常大,採用星空點陣的設計元素,下部格柵採用了中國風的回紋設計,凸顯了整個正臉的設計感。頭燈部分採用了全LED光源,轉向燈則單獨設計在下部,同樣使用了LED,只有最下面的霧燈為鹵素光源,配置上十分厚道。

    T800的整車尺寸為4910x1933x1735mm,軸距2850mm,在目前自主中型七座SUV中算比較大的,側門上用裝飾模擬了出風口的造型,並且還點綴有眾泰漢語拼音首字母“Z”字形的標誌,同時不忘加入一個裝飾燈,這樣的小心思在其它品牌上不多見。還了解到,T800的頂配車型搭載了電吸門,在這個級別中是獨一份的那個。

    進入車內,10.4英寸中控屏第一時間抓住你的眼球,全車的功能基本都集成在裏面,旋鈕式換擋,全液晶儀錶,大面積軟性材料的包裹,檔次感還是營造的不錯,雖然說中控UI界面布局和反應速度還有提升的空間,但結合其價格來看,也能讓你產生“要啥自行車”的感慨了。

    談到眾泰,怎能不提配置,T800的配置水平用“極限”形容毫不過分,全景天窗,360°影像這些只是基本操作,什麼電動腳踏,電吸門,氛圍燈,車聯網,前窗加熱······配置上堆的滿滿噹噹,重要的是,除了入門車型以外,很多配置都實現了全系覆蓋,可以說,T800隻要不買最低配,都可以達到越級體驗。

    T800的2.0T動力,參數上達到了170kW/350N·m,在自主眾多中型七座中屬於動力靠前的那個,匹配六速雙離合變速箱,或許表現上沒有眾多愛信6AT那麼出色,但想想車內那麼豐富的配置,也能理解。前麥弗遜+后多連桿懸架是這個級別的標配,沒有四驅車型有些遺憾。但考慮其“城市SUV”的身份,也不會是什麼大問題。

    對於T800,我們先拋開眾泰眾多的“歷史遺留問題”去看待它。設計有原創,配置高上天,價格有驚喜——這三點已經是很大的亮點。自主品牌中型七座SUV已經很多,但T800還是能找到獨特的競爭力。能不能賣爆款不好說,但還是能吸引部分消費者的眼球,至少我們能看到的,T800已經是眾泰拿出最大的誠意去做的產品。品牌和質量都是需要長時間積累的事情,眾泰想要像其他自主品牌一樣深入民心,還是有很長的路要走。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

    網頁設計最專業,超強功能平台可客製化

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 7.99萬起,今天上市的大空間6座車真是家用好選擇!

    7.99萬起,今天上市的大空間6座車真是家用好選擇!

    尾部在擾流板、貫穿尾燈的鍍鉻裝飾、黑色塑料擋板的組合下,形成了一種層次感。敦厚的車尾部,更是讓它充滿安全感。仿木材料的中控台,還有一個大尺寸豎直中控屏幕,以及是手感極佳的平底式運動方向盤,它在簡約風格中加入一點運動的元素。

    “一輛車究竟是多少座位最好?”,除了自己,還有配偶,加上父母以及自己的孩子,或許還是雙胞胎,這樣看來起碼是6座車型,另外一般而言緊湊型轎車後排乘坐3成年人是比較難受的事情。

    正是為了滿足用戶這種需求,比亞迪宋MAX前期推出了7座車型,如今更是推出了6座車型,官方指導價為:7.99-12.99萬。那麼它表現如何呢?

    6座,就是它最大的不同

    6座版本的比亞迪宋max依然有着4680*1810*1680mm的車身尺寸,以及是能夠帶來充足空間表現的2785mm軸距。並且在座椅配置上一樣保留了7座車型的優點,諸如第三排寬大保護作用大的頭枕、座椅採用打孔真皮材質。

    它採用了2+2+2的6座布局,獨立第二排座椅可以帶來比7座車型更舒適的體驗,加上獨立的可調節座椅扶手,座椅包裹性更佳。中部通道寬度為190mm,乘客進出第三排更為優雅。

    在實際的乘坐它表現讓人滿意,前排以及第二排座椅包裹性極佳,並且頂配車型上前排座椅還具備主副駕座椅通風加熱、第二排預警限力安全帶等配置。唯獨是第三排由於車身結構問題坐墊與地板距離較近,腿部支撐較弱,中長途旅行中更適合乘坐小孩子或者是身材嬌小的成年人。

    設計以及配置,和7座車型無異

    6座版本的宋MAX在設計上和7座車型保持了一致,犀利大燈帶有的鍍鉻裝飾條以及LED日間行車燈和大尺寸進氣格柵橫向裝飾條連成一體,拉寬了視覺寬度。這個“大嘴”配上這兇狠犀利的大燈,就形成了它’Dragon Face”設計的基本元素。

    4680mm車身長度的它在逐漸下滑的懸浮式車頂襯托下,顯得車身相當修長,低矮的腰線則降低了它的視覺重心,讓它整體有着一種動感、衝勁。

    尾部在擾流板、貫穿尾燈的鍍鉻裝飾、黑色塑料擋板的組合下,形成了一種層次感。敦厚的車尾部,更是讓它充滿安全感。

    仿木材料的中控台,還有一個大尺寸豎直中控屏幕,以及是手感極佳的平底式運動方向盤,它在簡約風格中加入一點運動的元素。

    生產實力強大、自產自銷的比亞迪能夠有效控製成本,所以它在配置配備上相當慷慨,標配了ESp車身穩定系統、17英寸鋁合金輪轂、自動空調、遠程啟動等等。又或者是一些“跨級般”的配置,諸如選配的LED自動大燈。

    操控,或許可以說沉穩自信?

    比亞迪宋MAX全系車型採用前麥弗遜后扭力梁懸架,處於這個級別的主流水平。動力方面搭載了最大輸出功率154馬力的1.5T直噴發動機,匹配的是6MT或者6速雙離合變速箱。

    在日常使用中它整體表現出同價位中較高的水準,應付城市使用這套渦輪增壓+雙離合的動力總成顯得游刃有餘,能夠有效地控制轉速在1500rpm之中,需要提速的時候154馬力的底蘊讓超車動作比較從容,而且它1750rpm就開始進入240牛米的最大輸出扭矩區間,相比競爭對手們最大扭矩輸出更早。只是低速在1、2擋切換時會有絕大多數雙離合變速箱的小不足——輕微頓挫感。

    據比亞迪官方稱,比亞迪宋max有着前奔馳底盤調校工程師漢斯柯克參与調校,讓它更注重舒適性,所以宋max駕駛起來有着厚重的行駛質感。能夠過濾掉路面各種細碎振動的同時,還有讓人安心的高速穩定性。受制於全系搭配的液壓轉向助力,宋max轉向略有虛位,並不可以說是精準,幸好較強的懸架支撐帶來了較小的車身傾側,扳回了一城。

    總的來說,比亞迪宋max相比同價位對手有着不少的優勢,諸如更佳的底盤表現、更豐富的配置以及更出色的外觀,這恰恰迎合如今消費者開始接受這些“體面”MpV的用戶趨勢。6座車型,則是滿足了消費者不同的乘坐需求,多一種選擇未嘗不是一種好事。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※教你寫出一流的銷售文案?

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※回頭車貨運收費標準

    ※別再煩惱如何寫文案,掌握八大原則!

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 6秒破百很厲害?國內10來萬買SUV更應該看這點!

    6秒破百很厲害?國內10來萬買SUV更應該看這點!

    值得說明的是,國內媒體測試的多為旱地剎車成績,而在售車型大多採用四季胎,在暴雨天氣下剎車距離或會明顯變長,所以各位在暴雨天氣下最好加長與前車距離。我們可以看到市面上多款SUV車型的100-0km/h剎停成績差異頗大,這也是因為大部分用戶對於剎車方面的關注度不高,導致廠家有出現“偷懶”情況。

    大家有沒有發現汽車廠家往往會把宣傳重點放在動力性能和發動機技術上,但是對於剎車性能往往置於末位。而只要您多加留意,就會和朗編一樣發現各個級別中不少熱點車型都以動力性能作為賣點!

    連柯迪亞克、途觀L和冠道這類型大尺寸的SUV車型都在極力宣傳動力性能,但這明顯是為迎合國內消費者喜好而做出的選擇,畢竟用戶大多認為動力表現能直接決定行駛的順暢感,或者說是快感!但是這份快感的權重能比得上行車安全性嗎?

    再者,我國的高速公路最高限速為120km/h,過多的發動機功率是否必要還有待商榷。

    而在我們日常行車過程中,能看見最多的車禍是啥?可能許多人會和朗編一樣會想到追尾事故,四車連環追尾、六車連環追尾等事故經常霸佔着新聞的首頁版面,而且在雨霧天氣,追尾事故發生的幾率也將大幅度上升。

    而據之前相關的統計數據显示,汽車追尾在整個道路交通事故中約佔70%以上,造成追尾事故自然有一部分是駕駛員意識、駕駛技術的原因,同時也有一部分是駕駛員意識到位了但車輛的剎車性能不到位而造成的。

    現在銷售火爆的15萬級別合資/自主SUV車型它們是否注重剎車性能?

    值得說明的是,國內媒體測試的多為旱地剎車成績,而在售車型大多採用四季胎,在暴雨天氣下剎車距離或會明顯變長,所以各位在暴雨天氣下最好加長與前車距離!

    我們可以看到市面上多款SUV車型的100-0km/h剎停成績差異頗大,這也是因為大部分用戶對於剎車方面的關注度不高,導致廠家有出現“偷懶”情況。

    其實能影響剎車性能的元素有很多,除了輪胎規格、輪胎抓地力以外,還有剎車片和剎車盤的性能,剎車片和剎車盤的材料優劣,摩擦係數的大小都會直接影響到制動力的大小!

    而且值得注意的還有剎車分泵的活塞數量,一般家用車型每個分泵只有一個活塞,其性能自然沒有性能車身上的多活塞設計那般剎車力度大而且均勻。

    由此可見想要提升剎車性能其實是相當複雜而困難的,比較有效的方法是系統而專業地改裝剎車系統,這裏面包含了輪胎、剎車盤、剎車片、剎車分泵、剎車油等多個配件的升級。

    另外一個方法就是廠家在研發車輛時強化車輛剎車系統的調校,優化配件選材以提升原廠車的剎車表現,當然了這要投入更多成本,但是長遠來看,廠家若以優異的剎車性能來作為賣點招攬顧客的話,或會效果斐然!

    最後提點題外話,那就是歐洲人為什麼會這麼喜歡高爾夫GTI這一類小鋼炮車型?很重要的就是歐洲的某些高速公路限速更高,在高速區域剎車性能的重要性就完全體現出來了,對於安全性也有更明顯的影響!而咱們國內的汽車消費市場也應該對剎車性能有更高要求,從而倒逼廠家重視提升剎車性能!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※超省錢租車方案

    ※別再煩惱如何寫文案,掌握八大原則!

    ※回頭車貨運收費標準

    ※教你寫出一流的銷售文案?

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

  • UniRx精講(二):獨立的 Update &UniRx 的基本語法格式

    UniRx精講(二):獨立的 Update &UniRx 的基本語法格式

    獨立的 Update

    在 UniRx 簡介的時候,筆者講了一種比較麻煩的情況:就是在 MonoBehaviour 的 Update 中摻雜了大量互相無關的邏輯,導致代碼非常不容易閱讀。

    這種情況我們平時在項目開發中非常常見,代碼如下:

    private void Update()
    {
    	if (A)
    	{
    		...
    	}
    
    	if (B)
    	{
    		...
    		if (D)
    		{
    			...
    		}
    		else {}
    	}
    
    	switch (C)
    	{
    		...
    	}
    
    	if (Input.GetMouseButtonUp(0))
    	{
    		...
    	}
    }
    

    Update 方法中代碼冗長,而且干擾視線,非常影響閱讀。

    而使用 UniRx 則可以改善這個問題。

    void Start()
    {
    	// A 邏輯,實現了 xx
    	Observable.EveryUpdate()
    			.Subscribe(_ => 
    			{
    				if (A)
    				{
    					...
    				}
    			}).AddTo(this);
    	
    
    	// B 邏輯,實現了 xx
    	Observable.EveryUpdate()
    			.Subscribe(_ =>
    			{
    				if (B)
    				{
    					...
    					if (D)
    					{
    						...
    					}
    				else {}
    				}
    			}).AddTo(this);
    
    	// C 邏輯,實現了 xx
    	Observable.EveryUpdate()
    			.Subscribe(_ =>
    			{
    				switch (C)
    				{
    					...
    				}
    			}).AddTo(this);
    
    	// 鼠標點擊檢測邏輯
    	Observable.EveryUpdate()
    			.Subscribe(_ => {
    			{
    				if (Input.GetMouseButtonUp(0))
    				{
    					...
    				}
    			}).AddTo(this);
    }
    

    雖然在代碼長度上沒有任何改善,但是最起碼,這些 Update 邏輯互相之間獨立了。
    狀態跳轉、延時等等這些經常在 Update 里實現的邏輯,都可以使用以上這種方式獨立。

    使用 UniRx 可以對我們工程中的代碼進行了改善,而筆者接觸 UniRx 之後,就再也沒有使用過 Update 方法了。

    不過以上的這種 UniRx 使用方式,是比較初級的,而這種使用方式,隨着對 UniRx 的深入學習,也會漸漸淘汰,因為等我們入門之後,會學習更好的實現方式。

    今天的內容就這些。

    知識地圖

    UniRx 的基本語法格式

    在之前的兩篇文章中,我們學習了 UniRx 的 Timer 和 Update 這兩個 API,但是對代碼的工作原理還沒有進行過介紹。在這篇文章中,我們就來試着理解一下 UniRx 的代碼工作原理及 UniRx 的基本語法格式。

    先搬出來第一篇文章中 Delay 的實現代碼:

    /****************************************************************************
     * http://liangxiegame.com liangxie
     ****************************************************************************/
     
    using System;
    using UniRx;
    using UnityEngine;
    
    namespace UniRxLesson
    {
    	public class DelayExample : MonoBehaviour
    	{
    		private void Start()
    		{
    			Observable.Timer(TimeSpan.FromSeconds(2.0f)).Subscribe(_ =>
    			{
    				Debug.Log("延時兩秒"); 
    				
    			}).AddTo(this);
    		}
    	}
    }
    

    代碼中的 Observable.XXX().Subscribe() 是非常經典的 UniRx 格式。只要理解了這種格式就可以看懂大部分的 UniRx 的用法了。

    首先解決代碼中的詞彙問題:

    • Observable:可觀察的,是形容詞,它形容後邊的詞(Timer)是可觀察的,我們可以直接把 Observable 後邊的詞理解成發布者。
    • Timer:定時器,名詞,被 Observable 修飾,所以是發布者,是事件的發送方。
    • Subscribe:訂閱,是動詞,它訂閱誰呢?當然是前邊的 Timer,這裏可以理解成訂閱者,也就是事件的接收方。
    • AddTo:添加到,這個我們暫時不用理解得太深刻,只需要知道它是與 MonoBehaviour 進行生命周期綁定即可。

    以上的代碼,連起來則是:可被觀察(監聽)的.Timer().訂閱()
    理順了之後應該是:訂閱可被觀察的定時器。

    其概念關係很容易理解。

    • Timer 是可觀察的。
    • 可觀察的才能被訂閱。
    Observable.XXX().Subscribe();
    

    這行代碼我們可以理解為:可被觀察(監聽)的 XX,註冊。

    以上筆者從發布者和訂閱者這個角度進行了簡單的介紹,以便大家理解。
    但是 UniRx 的側重點,不是發布者和訂閱者這兩個概念如何使用,而是事件從發布者到訂閱者之間的過程如何處理。
    所以這兩個點不重要,重要的是兩點之間的線,也就是事件的傳遞過程。

    這裏先不說得太深入,在入門之後,會用很大的篇幅去深入介紹這些概念的。

    今天的 UniRx 的基本語法格式的介紹就到這裏,我們下一篇再見,拜拜~

    知識地圖

    更多內容
    QFramework 地址:https://github.com/liangxiegame/QFramework
    QQ 交流群:623597263
    涼鞋的主頁:https://liangxiegame.com/zhuanlan
    關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案