2016第七屆廣州國際新能源汽車工業展覽會

時間:2016年6月8-10日

地點:廣州琶洲保利世貿博覽館

主辦單位:廣州中汽國際展覽有限公司

●  專業的組織機構——展會是中汽國際展覽有限公司按照“專業化、國際化、品牌化”原則舉辦的新能源汽車及配套設施行業國際品牌盛會。國內外多家單位協辦,既有政府支持,又有行業權威的參與。展會舉行期間,將有商務部及省市領導、業界權威人士蒞臨展會參觀指導並出席開幕剪綵。

●  龐大採購團隊——盛會將邀請來自中國、美國、德國、法國、英國、義大利、巴西、墨西哥、西班牙、俄羅斯、瑞典、捷克、匈牙利、中東、日本、韓國、印度、土耳其、新加坡、越南、泰國、臺灣、香港、澳門等國家和地區眾多新能源汽車及配套設施進出口貿易商、代理商、經銷商及國際著名相關採購協會組織率團到會參觀採購。

●  高端論壇——展會將邀請新能源汽車及配套設施行業權威專家,討論中外新能源汽車及配套設施行業最新動態、發展趨勢、分工格局、相關對策等多個熱門議題。就中國新能源汽車及配套設施行業發展現狀及所面臨的問題作深入報告,針對中國新能源汽車及配套設施行業市場行情作研究報告,並對產品開發、技術創新等作細緻的演講。屆時,將安排我們認為在國際新能源汽車及配套設施領域,具有影響力的企業介紹產品概況、最新技術動向等進行講座和交流。擬邀請中國政府高級官員,有關專家、學者,國際著名機構代表,著名新能源汽車及配套設施產品供應商、採購商,中國新能源汽車及配套設施市場企業代表和其他專業觀眾出席,其行業的引導性和權威性令人期待,是中國新能源汽車及配套設施產業發展和國際交流合作的風向標,將是獲取新能源汽車及配套設施行業資訊和把握國際市場的最佳平臺。

※ 展會介紹

在能源匱乏的時代,綠色、節能、環保成為經濟發展的核心主題,新能源汽車具有良好的環保性能和燃料經濟性好、運行成本低等優勢,既可以保護環境,又可以緩解能源的短缺並能調整能源的結構,保障能源的安全。

21世紀是一個面臨能源和環境巨大挑戰的世紀,傳統燃油汽車將向高效低排放的電動汽車及混合動力車方向發展。大力發展新能源汽車是能源與環境的必然要求,而且,中國發展新能源汽車的壓力更為緊迫。根據國家《汽車與新能源汽車產業發展規劃》(2011-2020),將在“十二五”期間重點發展清潔能源汽車,未來十年僅中央財政就投入上千億元用來支持以純電動車、混合動力汽車為代表的節能與新能源汽車的研發與推廣。2014年5月24日上午,國家主席習近平在上海汽車集團考察時強調,發展新能源汽車是我國從汽車大國邁向汽車強國的必由之路,要加大研發力度,認真研究市場,用好用活政策,開發適應各種需求的產品,使之成為一個強勁的增長點。2014年多地出臺補貼政策,國務院發文:2014年9月1日起免征新能源汽車車輛購置稅,各種利好消息層出不窮,可以預見,未來我國新能源汽車必將會迅速發展。

廣州是廣東省會,改革開放前沿城市,中國對外貿易的重要視窗,經濟實力雄厚,市場潛力巨大。廣東是泛珠三角經濟區域的中心,毗鄰港、澳、台,輻射東南亞,海、陸、空交通便利,市場輻射面廣,經濟發達。隨著CEPA的實施,粵、港、澳以及泛珠三角(9+2)區域合作與發展的良性互動,必將給新能源汽車及配套設施產業創造無限美好的發展前景。為順應高速發展的新能源汽車及配套設施行業,廣州中汽國際展覽有限公司聯合行業權威機構定于2016年6月8-10日在廣州琶洲保利世貿博覽館舉辦“2016第七屆廣州國際新能源汽車工業展覽會”(NEA CHINA 2016),展會將深化活動內涵,秉承推動行業發展、為企業服務的宗旨,為商家提供一個拓展業務、技術交流、展示實力、獲取資訊、結交客戶、推廣新產品、尋找合作夥伴的國際商貿平臺。

我們將以“突出品牌、開拓創新、注重實效、強化服務”的辦展宗旨,憑藉獨特的創意,科學的組織管理和卓越的服務,以全新的理念為廣大中外參展商提供一個“高水準、高品味、高品質”的展示交流平臺,為全球新能源汽車及配套設施行業提供更多的合作機會,有力推動中國新能源汽車及配套設施產品全面進入全球採購體系,與世界各國新能源汽車及配套設施產業協調合作、互利共贏、共同發展進步。

※ 展品範圍

純電動車:轎車、大巴、公車、各旅行車、各種純電動特種車(環衛車、電力車、郵政車、小型客貨車、高爾夫車、房車、叉車、搬運車、旅遊觀光車、摩托車、三輪車等);

混合動力車:轎車、大巴、公車、各型旅行車等;

其他能源車:超級電容、燃料電池、氫能、生物燃料、太陽能及氫能源、天然氣等各種新能源、清潔燃料及低排放、環保節能型車等;

零部件:低排放節能型發動機、混合動力發動機及清潔燃料發動機;動力電池與管理系統;整車匯流排與控制系統;電機與電控系統;充電裝置;儲能裝置等;能源管理系統;電力電容器、飛輪、逆變器、電熱泵、電動助力轉向、電動空調、功率模組等;相關材料、工藝、技術;相關檢測、監控、試驗、安全防護裝備;維修、製造設備和工具等;

充電設施:充電站智慧型網路專案規劃及成果展示,加油站擴建充(換)電站、加油充電綜合服務站展示,太陽能、風能互補新能源汽車充電站技術產品,充電站充電機、充電樁、配電設備、變壓器、更換設備、電能、監控系統、有源濾波裝置、配電櫃、電纜、直接充電設備、管理輔助設備、充換電池及電池管理系統、停車場充電設施、智慧監控、充電站供電解決方案、充電站等。

其他:新能源汽車的整車及系統控制設計等。

※ 目標觀眾

主辦單位將重點邀請的目標觀眾包括:
1、商務部、發改委、科技部、工信部、國家環保局等各局、司、中心、所領導;
2、全國各省市主管部門領導、大型企事業、機關單位領導;
3、全國各高校、科研單位、設計院、研究院、協(學)會領導;
4、公交、出租、環衛、郵政等單位負責人;車站、機場、碼頭、房地產、大型物業公司、高爾夫球場、旅遊景點、公園、體育場館、大專院校、度假村等單位負責人;
5、國內外著名生產、代理、經銷商、貿易公司等業內人士參觀、參展、技術交流。

※ 展會日程

報到布展:2016年6月6-7日
展出時間:2016年6月8-10日
撤展時間:2016年6月10日下午

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!

H5+app,自動更新后自動刪除安裝包,H5+app — 自動更新

H5+app 自動刪除安裝包

一、前言

  之前做好的app自動更新,遺留下了一個問題,就是自動更新后安裝包沒有自行刪除掉。

  好像現在的手機的系統是有安裝完自動清理安裝包的。想我這個H5+的app安裝完后是沒有自動刪除的,所以就需要用代碼去刪除掉。

二、解決方式

  使用html5+plus,提供的IO模塊來操作自動更新后遺留下來的apk文件。

  參考文檔:

    http://www.html5plus.org/doc/zh_cn/io.html

  IO模塊:管理本地文件系統,用於對文件系統的目錄瀏覽、文件的讀取、文件的寫入等操作。通過plus.io可獲取文件系統管理對象。

  原理:1、通過plus.io.requestFileSystem請求本地文件系統對象

           第一個參數類型是  PUBLIC_DOWNLOADS: 程序公用下載目錄常量

        成功返回后的參數fs,即:該下載目錄下的所有文件,然後進行遍歷

        2、通過plus.io.resolveLocalFileSystemURL操作文件

        第一個參數即文件的路徑名,成功返回后的參數entry,即:文件對象

        得到文件的對象就可以進行操作,查看文件名,文件大小,刪除,複製文件等操作

三、代碼

  1、下面即為代碼的實現

                plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, function(fs) {
                                // fs.root是根目錄操作對象DirectoryEntry
                                var directoryReader = fs.root.createReader();
                                directoryReader.readEntries(function(entries) {
                                    for (var i = 0; i < entries.length; i++) {
                                        var fileName = entries[i].name;  var filePath = "_downloads/" + entries[i].name;
                                        plus.io.resolveLocalFileSystemURL(filePath, function(entry) {
                                            // 可通過entry對象操作test.html文件 
                                            // entry.file(function(file) {
                                            //     console.log(file.name);
                                            // });
                                            entry.remove();
                                        }, function(e) {
                                            // console.log("Resolve file URL failed: " + e.message);
                                        });
                                    }
                                }, function(e) {
                                    // alert("Read entries failed: " + e.message);
                                });
                            });

  2、其他做法

     現在有個問題,就是安裝的后重啟是不可控,所以我最簡單的做法就是保留最新版本的apk,其他版本都刪除

     當然可以有其他做法,就是檢測是否需要更新,如果不需要更新,則啟動刪除程序,將本地安裝清除。

function autoDeleteApk() {
                plus.runtime.getProperty(plus.runtime.appid, function(inf) {
                    //獲取app的版本信息
                    var ver = inf.version;
                    //接口地址,用於獲取服務器上最新的版本號,與本地進行對比。
                    var url = '{你接口的地址}';
                    mui.ajax(url, {
                        data: {
                            apkVersion: ver,
                        },
                        dataType: 'json',
                        type: 'GET',
                        timeout: 60000,
                        success: function(data) {
                            var appVer = data.map.appVersion;
                            if (appVer == null) {
                                return;
                            }
                            plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, function(fs) {
                                // fs.root是根目錄操作對象DirectoryEntry
                                var directoryReader = fs.root.createReader();
                                directoryReader.readEntries(function(entries) {
                                    for (var i = 0; i < entries.length; i++) {
                                        var fileName = entries[i].name;
                                        var appVerName = appVer + ".apk";
                                        if (fileName != appVerName) {
                                            console.log("不刪除----------")
                                            return;
                                        }
                                        var filePath = "_downloads/" + entries[i].name;
                                        plus.io.resolveLocalFileSystemURL(filePath, function(entry) {
                                            // 可通過entry對象操作test.html文件 
                                            // entry.file(function(file) {
                                            //     console.log(file.name);
                                            // });
                                            entry.remove();
                                        }, function(e) {
                                            // console.log("Resolve file URL failed: " + e.message);
                                        });
                                    }
                                }, function(e) {
                                    // alert("Read entries failed: " + e.message);
                                });
                            });
                        },
                        error: function(xhr, type, errerThrown) {
                            //mui.toast('網絡異常,請稍候再試');
                        }
                    });
                });
            }

四、總結

  之前遺留的問題總算是解決了,之前不知道怎麼,把自己繞進去了。

  不清楚的地方可以看另外一篇:

  不足之處,請大家指教。

  轉發請註明出處:https://www.cnblogs.com/lrj1009IRET/

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

Docker學習(三)-簡單的私有DockerHub搭建

Docker Hub

目前Docker官方維護了一個公共倉庫https://hub.docker.com, 其中已經包括100000+個的鏡像。大部分需求都可以通過在 Docker hub中直接下載鏡像來實現,

註冊登錄

可以在 免費註冊一個Docker賬號。在命令行執行docker login輸入用戶名及密碼來完成在命令行界面登記Docker Hub。你可以通過docker logout退出登錄。

docker login

 

拉取鏡像

可以通過docker search命令來查找官方倉庫中的鏡像,並利用docker pull命令來將它下載到本地。

 

推送鏡像

用戶也可以在登錄后通過docker push命令來將自己的鏡像推送到Docker Hub。

docker pull tomcat

 docker images

修改本地鏡像的名字為賬號名/鏡像名

上傳鏡像到公共倉庫

docker push woxpp/tomcat-test:latest

登錄界面查看

docker pull woxpp/tomcat-test

 

私有倉庫

有時候使用Docker Hub這樣的公共倉庫可能不方便,用戶可以創建一個本地倉庫供私人使用。比如,基於公司內部項目構建的鏡像。
docker-registry是官方提供的工具,可以用於構建私有的鏡像倉庫。

安裝運行docker-registry

可以通過獲取官方registry鏡像來運行。默認情況下,倉庫會被創建在容器的/var/lib/registry目錄下。可以通過-v參數來將鏡像文件存放在本地的指定路徑。

docker run --name registry -d  -p 5000:5000 --restart=always  -v /opt/registry:/var/lib/registry registry
docker ps -a

測試是否成功

使用docker tag將session-web:latest這個鏡像標記為192.168.50.24:5000/session-web:latest格式為docker tag IMAGE:TAG/]REPOSITORY[:TAG]

docker tag docker.io/tomcat 192.168.50.24:5000/tomcat-2:latest

使用docker push上傳標記的鏡像

docker push 192.168.50.24:5000/tomcat-2:latest

驗證上傳的鏡像

 

 

 先刪除已有鏡像,再嘗試從私有倉庫中下載這個鏡像。

docker images
 docker rmi 192.168.50.24:5000/tomcat-2
docker pull 192.168.50.24:5000/tomcat-2 

 

注意事項

The push refers to a repository [192.168.50.24:5000/consul]
Get https://192.168.50.24:5000/v1/_ping: http: server gave HTTP response to HTTPS client

可以用下面方式解決

修改客戶端/etc/docker/daemon.json中寫入如下內容

{
    "registry-mirror":[
        "http://hub-mirror.c.163.com"
    ],
    "insecure-registries":[
        "192.168.50.24:5000"
    ]
}

重新啟動docker后再試試
service docker restart

 

 

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!

Windows終端利器Cmder

在IT這一行,大部分情況下都是推薦大家使用Linux或者類Unix操作系統去編程,Linux作為一代優秀的操作系統,已經人盡皆知,在IT行業已經成為核心。有條件的大佬都選擇了使用mac編程,最優秀的莫過於終端體驗了,與Linux完全一致的命令行,帶來了許許多多的方便,但是使用Windows的用戶呢?相信大家都使用過cmd終端,它到底好不好呢。相信大家心中已經有了評判。

一、為什麼要換成cmder

現在我就要推薦一款Windows下的終端—>cmder
先來上兩張圖給大家看看

都不用我說,一眼就能分辨出他倆的區別了,其實他倆最大的區別是cmder完全支持Linux命令行,包括vi,而且可以多開,快捷鍵複製粘貼,分屏等,功能非常強大

二、下載和安裝

1.下載

官網自己下載也可以

  • 在官網下載的時候有兩個版本
    • Mini版本,只有簡單的命令行
    • Full版本,包含git功能(分佈式版本控制系統的git)

我推薦大家安裝Full版本,這樣就可以不用單獨安裝git了

2.安裝

安裝非常簡單,下載完成后,直接解壓到你存放軟件的目錄就好了

然後雙擊一下cmder.exe就可以先簡單體驗一下了

三、個性化設置

這款軟件可以完全替代Windows系統自帶的cmd終端,當然需要一點人性化的設置

1.配置環境變量

我就只上圖了,環境變量配置太過簡單了,百度上太多了,都是通用套路,配置完環境變量,就可以直接在Windows+r鍵里運行cmder打開終端了

上圖中我把git也配置進去了,這樣就不會說git不是內部或者外部命令了

2.配置右鍵菜單啟動

右鍵管理員身份運行cmder.exe,然後把下面的命令複製到cmder中執行一次

// 設置任意地方鼠標右鍵啟動Cmder
Cmder.exe /REGISTER ALL

3.進入設置的方法

右下角的三,然後選擇Settings或者直接使用快捷鍵Windows+Alt+p打開設置

如果不習慣英文,可以將設置改成中文

下次再次打開設置,又會中文,只有這個設置生效一次,其他的都可以永久生效

4.設置字體風格等

設置字體的風格,大小等,圖中紅色位置不要勾選,否則會出現cmder終端字體重疊錯位的問題

終端界面的字體大小在設置里可以修改,也可以在終端界面滑動鼠標滾輪,或者觸控板雙擊縮放調整字體大小

5.窗口位置大小記憶

勾選這兩個設置,只需要設置一次,下次會自動記住上次終端在桌面出現的位置和窗口大小

6.設置vi模式下ESC鍵最小化窗口的問題

  • 將圖中紅色改成除了總是的其他選項,否則使用vi時會出現無法切換模式的問題
  • 勾選綠色的選項可以解決打開多個終端,任務欄显示多個窗口的問題

7.解決中文亂碼的問題

在使用ls命令時,中文亂碼的解決方案,將下面的代碼複製到圖中位置

set LANG=zh_CN.UTF-8
set LC_ALL=zh_CN.utf8

8.強製作為默認終端

  • 圖中綠色設置可以強制將cmder註冊成Windows的默認終端

    設置此選項后,系統啟動后就會生效,且,即使你打開的是cmd,也會被放到cmder的窗口中執行

  • 紅色選項可以解決每次關閉控制台時,彈出確認關閉的彈窗

9.解決粘貼多行文本時的彈窗

例如在終端中執行多行SQL語句,總會彈出提示,勾選選項可以解決

10.將命令提示改成$

默認的命令提示符是λ,大家都知道Linux是$,這裏提供一下修改的方法,並不是必須的

1)首先在cmder的安裝目錄下,找到vendor/目錄,然後找到clink.lua文件

2)右鍵使用sublime打開

  • 沒有sublime或者notepad++打開也可以,還沒有的話,記事本也可以的

3)打開后可以Ctrl+F查找下面的字段
local lambda =
4)將local lambda =""的值替換成$

5)保存關閉,重啟終端

11.將Idea的Terminal終端換成cmder

1)在idea中打開其他設置界面,如圖所示

在idea中settings是對當前項目生效,Other Settings是對所有項目生效

2)如圖中修改shell Path的路徑,替換成下面的內容

注意將cmder安裝目錄換成你的安裝目錄

//這種方式比較可靠,避免了環境變量失效的問題
"cmd.exe" /k ""你的cmder安裝目錄\vendor\init.bat""

//或者,這個需要有環境變量
"cmd.exe" /k ""%環境變量配置的cmder home目錄名稱%\vendor\init.bat""

3)再次打開Terminal終端就可以使用Linux命令了

12.將vscode的Terminal終端設置成cmder

1)打開設置

2)搜索code save,點擊打開設置json文件

3)將下面的代碼粘貼到文件中,修改為自己需要的內容

注意修改cmder的安裝目錄為自己的安裝目錄

// 設置終端為cmder
"terminal.integrated.shell.windows": "cmd.exe",
"terminal.integrated.env.windows": {
    //設置cmder的根目錄
    "CMDER_ROOT": "cmder的根目錄"
},
"terminal.integrated.shellArgs.windows": [
    "/k",
    //設置啟動初始化目錄
    "cmder的根目錄\\vendor\\init.bat"
],

//下面的設置可以不需要
//終端顏色配置
"workbench.colorCustomizations": {
    //可以將鼠標放到下面的色號上根據自己的偏好進行選擇
    "terminal.foreground": "#37FF13",
    "terminal.background": "#2b2424"
},
"terminal.integrated.cursorBlinking": true,
//設置terminal中的行高
"terminal.integrated.lineHeight": 1.1,
"terminal.integrated.letterSpacing": 0.1,
"terminal.integrated.fontSize": 12, //字體大小設置
"terminal.integrated.fontFamily": "monaco", //字體設置
"terminal.integrated.shell.linux": "/bin/zsh"

4)Ctrl+J打開終端,就可以使用了

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

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

GitHub 發布了官方 App,還打算冰封你的代碼一千年

11 月 13 日,GitHub Universe 2019 開發者大會上,公布了大量新功能,包括髮布 GitHub 移動版、GitHub Actions 和 Packages 正式版上市、重新設計了通知體驗,以及宣布建設一個數據倉庫存儲所有公共倉庫一千年…

GitHub App

官方 App 終於來了,在手機上就可以 Review 代碼、處理 Issues、合併 PR 等常用操作。讓你無論身處何處,都可以靈活地推進工作並與團隊保持聯繫(加班)。

目前已經發布 iOS beta 版並上線 TestFlight,連黑暗模式都安排上了。

Android 版還要等段時間推出。

Actions 和 Packages 正式版

去年 Universe 大會上發布的 GitHub Actions,以及今年上半年發布的 GitHub Packages 結束了測試期。

GitHub Actions 是倉庫自帶的自動化構建與部署功能,擁有完整的 CI/CD 解決方案和本機軟件包管理,並且 GitHub Marketplace 上也提供有上千款社區開發的工作流可以使用。

GitHub Packages 是官方推出的包管理功能,實現將源代碼和包在一個地方集成權限管理和統計,託管在 GitHub 上的軟件包,不僅包括詳細信息和下載統計信息,而且還有它們的全部歷史記錄。

現在這兩款功能免費向所有公共倉庫開放,並且可以使用 Actions 將新的軟件包版本自動發布到 GitHub Packages,使用 Actions 觸發軟件包安裝,以及以最小的配置安裝託管在 GitHub Packages 或首選記錄註冊表上的軟件包和映像。通過 Actions 使用相同的 GITHUB_TOKEN 進行所有自動化程序包的上載和下載。

通知功能

以往在一些熱門開源項目中、或者大型團隊中,各種 Issues 和 PR 的通知郵件會無差別充斥在郵箱中,很難將信號和噪音區分開。

官方終於推出了通知功能來解決這個問題,設立了通知收件箱,可以對不同信息進行篩選和分類,讓你聚焦到有價值的信息中。

並且會着重結合官方 App 進行通知推送。

目前該功能是內測階段,如果想體驗可以下載 GitHub App 獲取測試資格。

代碼導航

代碼導航已於今年早些時候在特定存儲庫的有限公測中發布。今天,官方將其提供給 GitHub 上的所有 Ruby,Python 和 Go 存儲庫,並且很快就會有更多的語言。查看任何公共或私有存儲庫上的 “code” 選項卡,以獲取受支持的語言以進行嘗試。

代碼搜索

在接下來的幾個月中,官方將引入一種新的代碼搜索體驗,包括區分大小寫,特殊字符,標記化和其他特定於代碼的搜索條件。

保存你的代碼一千年

官方發布了一項偉大的計劃:將建設一個名為 GitHub Arctic Code Vault 的數據存儲庫,存儲在北極世界檔案館(AWA)中,這是一個長期的檔案設施,位於北極山永久凍土層深 250 米。

GitHub 將在 2020 年 2 月 2 日掃描所有活動公共存儲庫的快照,並將這些數據保存在 Arctic Code Vault 中。

官方博客這樣寫道:

我們與斯坦福圖書館,Long Now 基金會,Internet 檔案館,軟件遺產基金會,Piql,Microsoft Research 和 Bodleian 圖書館建立了合作夥伴關係,以保護全球的開源代碼。我們將通過跨各種數據格式和位置存儲多個副本來保護這種知識,包括一個旨在保存至少一千年的非常長期的檔案庫,稱為 GitHub Arctic Code Vault。

本文屬於原創,首發於微信公眾號「面向人生編程」,如需轉載請後台留言。

關注后回復以下信息獲取更多資源
回復【資料】獲取 Python / Java 等學習資源
回復【插件】獲取爬蟲常用的 Chrome 插件
回復【知乎】獲取最新知乎模擬登錄

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

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

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

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

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

SqlServer設置特定用戶操作特定表(插入、刪除、更新、查詢 的權限設置)

目錄

一、需求場景:

在和其他廠商對接的時候,經常會將某數據庫的某些表放開增刪改查(CRUD)的權限給對方,此時,就要新建個用戶,授予某數據庫的某些表CRUD的權限;還有的時候只需授權SELECT權限,其他權限不能授予;

二、操作步驟:

演示所用數據庫版本:SQL Server Management Studio V17.8.1

1、登錄SSMS后選擇【安全性】,右鍵點擊【登錄名】,在彈出的右鍵菜單中選擇【新建登錄名】選項;

2、在【常規】選項卡中,創建登錄名,並設置默認數據庫;

3、在【用戶映射】選顯卡中,勾選數據庫,並設置【架構】;

4、對需要設置操作權限的表進行權限設置,【表】–【屬性】;

數據庫TestDB中已經有兩個表,分別為User和Salary,現在對錶User進行權限設置,將Insert、update、delete、select的權限賦給用戶【zyl】;
1)、表上右鍵選擇【屬性】,選擇【權限】選項卡:

2)、點擊【搜索】,在彈出的框中點擊【瀏覽】,選擇需要設置的用戶;

3)、在上面點擊【確定】后,就可以在【權限】選項卡中看到權限列表,選擇需要的權限點擊確定即可;

4)、當選中【選擇】和【引用】權限時,還可以設置【列權限】;

5、使用【zyl】登錄數據庫,就只能看到User表了;

並且用戶【zyl】只能對錶User進行增刪改查,不能修改表結構;

三、注意事項

1、在權限列表中如果選擇了【設置】這項,那麼再設置【列權限】就沒有意義了,因為查詢已經不受限制了;

如果設置了【列權限】,沒有選擇【設置】權限,那麼select * 就會報錯;

2、除了對錶設置權限外,還可以對視圖、函數等進行權限設置;

在數據庫的【安全性】-【用戶】-【zyl】-【屬性】-【安全對象】;

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

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置,台北網頁設計,各種案例分享

如何提高web應用的吞吐量

這篇博文所列舉的優化手段是針對比較傳統項目,但是想提高系統的吞吐量現在時髦的技術還是那些前後端未分離, 使用nginx當成靜態資源服務器去代理我們的靜態資源

是誰限制了Throughput?

當我們對一個傳統的項目進行壓力測試時,很容器就發現,系統的Throughput被數據庫(mysql)限制的死死的,儘管代碼看起來確實沒毛病,邏輯也沒有錯誤,但是過多的請求都被打向了數據庫,數據庫自個開啟大量的IO操作,這樣大的負載甚至會使Linux系統的整體負載驟然飆升,但是反觀我們的系統的吞吐量,呵呵…

將目光投向緩存

既然mysql的抗壓能力限制了我們的系統,那就將數據緩存起來,盡一切可能減少用戶和數據庫之間的直接接觸的次數,這樣我們的系統的吞吐量,同一時間能處理器的請求數量自然會升上去

市面上的緩存技術很多, 比較火爆的是兩款緩存數據庫 Memcache 和 Redis ,

Redis 和 Memcahe的區別

  • Redis不僅僅支持key-value鍵值對類型的數據,同時還支持list,set,hash等數據結構
  • redis支持數據的備份,即master-slaver模式的集群備份
  • Redis是支持數據持久化的,它可以將內存中的數據保存在磁盤中,支持RDB和AOF兩種持久化形式

對Redis進行壓測

# 挨個測試redis中的命令
# 每個數據包大小是3字節
# 100個併發, 發起10萬次請求
redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000

[root@139 ~]# redis-benchmark -h 127.0.0.1 -p 9997 -c 100 -n 100000
====== PING_INLINE ======
  100000 requests completed in 1.04 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

98.68% <= 1 milliseconds // 百分之98.68的請求在1毫秒內完成了
99.98% <= 2 milliseconds 
100.00% <= 2 milliseconds
96525.09 requests per second  // 每秒完成的請求數在9萬六左右


-d  指定數據包的大小,看下面redis的性能還是很強大的
-q  簡化輸出的參數
[root@139 ~]# redis-benchmark -h 127.0.0.1 -p 9997 -q -d 100 -c 100 -n 100000
PING_INLINE: 98619.32 requests per second
PING_BULK: 95877.28 requests per second
SET: 96153.85 requests per second
GET: 95147.48 requests per second
INCR: 95238.10 requests per second
LPUSH: 95328.88 requests per second
RPUSH: 95877.28 requests per second
LPOP: 95328.88 requests per second
RPOP: 97276.27 requests per second
SADD: 96339.12 requests per second
HSET: 98231.83 requests per second
SPOP: 94607.38 requests per second
LPUSH (needed to benchmark LRANGE): 92165.90 requests per second
LRANGE_100 (first 100 elements): 97181.73 requests per second
LRANGE_300 (first 300 elements): 96153.85 requests per second
LRANGE_500 (first 450 elements): 94428.70 requests per second
LRANGE_600 (first 600 elements): 95969.28 requests per second
MSET (10 keys): 98231.83 requests per second

只測試 指定的命令
-t 跟多個命令參數
[root@139 ~]# redis-benchmark -p 9997 -t set,get -q -n 100000 -c 100 
SET: 97276.27 requests per second
GET: 98135.42 requests per second

從上面的壓力測試中,可以看到,Redis的性能是絕對實力, 相當強悍,和mysql相比不是一個量級的, 所以結論很明顯,如果我們在用戶和mysql中鍵加一層redis做緩存,系統的吞吐量自然會上去

於是為了提高系統的抗壓能力,我們將壓力從mysql逐步轉移到redis中

頁面緩存技術

在說頁面緩存之前,我們先說一下在一個傳統的項目中,一個請求的生命周期大概是這樣的: 從瀏覽器發出到服務端, 服務端查詢數據庫獲取結果, 再將結果數據傳遞給模板引擎將數據渲染進html頁面

想提高這個過程的速度,我們可以這樣搞, 頁面緩存, 顧名思義就是將 html 頁面緩存到緩存數據庫中

示例如下:

一開始我們會先嘗試從緩存中獲取出已經渲染好的html源碼響應給客戶端, 響應的格式通過@ResponseBody和produces中的屬性進行控制,告訴瀏覽器自己會返回給它html文本

優點: 將用戶的請求的壓力從mysql轉移到redis, 這點強度對redis單機來說根本不是事

缺點: 很明顯,將請求擴大到頁面級別,數據一致性難免會受到影響, 這也是使用頁面緩存不得不考慮的一點

特點1 : 嚴格控制緩存的時間, 一定別忘了添加過期時間…

特點2 : 原來都是讓thymeleaf自動完成數據的渲染,現在的話,很明顯是我們手動在渲染數據

    @RequestMapping(value = "/to_list",produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String toLogin(Model model, User user, HttpServletResponse response, HttpServletRequest request) {

        // 先從redis緩存中獲取數據
        String html = redisService.get(GoodsKey.goodsList, "", String.class);
        if (html != null)
            return html;

        // 查詢商品列表
        List<GoodsVo> goodsList = goodsService.getGoodsList();
        model.addAttribute("goodsList", goodsList);

        // 使用Thymeleaf模板引擎手動渲染數據
        WebContext springWebContext = new WebContext(request,response,request.getServletContext(),request.getLocale(),model.asMap());
        String goods_list = thymeleafViewResolver.getTemplateEngine().process("goods_list", springWebContext);

        // 存入redis
        if (goods_list!=null){
            redisService.set(GoodsKey.goodsList,"",goods_list);
        }
        return goods_list;
    }

既然都說到這裏了, 就接着說還能怎麼玩吧…

你看, 上面通過手動控制模板引擎的api竟然得到的已經渲染好的html源代碼了, 什麼叫做已經渲染好的? 說白了就是原來我在前端寫:th ${user},這樣的佔位符,現在已經被thymeleaf替換成了 張三 … (說的夠直接吧)

拿到了已經渲染好的源代碼,我們就能通過IO操作,將這個文件寫到系統的某個目錄上去,不知道大家有沒有發現,去逛京東淘寶瀏覽某個商品頁面時,就會發現url是類似這樣的 www.jjdd.com/aguydg/ahdioa/1235345.html

這個後綴123145.html 大概率說明京東使用靜態頁的技術, 這太明智了,面對如此巨大數量的商品信息後綴用数字來表示也不錯,而且速度還快不是?

怎麼實現這種效果呢?

就是上面說的,通過IO將這些源碼的數據寫到Linux中的某一個目錄下面, 文件名就是上面URL中的最後的数字, 通過Nginx做靜態資源服務器將這些xxx.html代理起來, 用戶再訪問的話就走這個靜態頁, 同樣不會接觸數據庫, 而且nginx還支持零拷貝,併發數5萬不是事…
還有,後綴數組最好也別亂寫,直接使用商品id會更好,畢竟是先點擊商品獲取到id,再進入到靜態頁

對象緩存技術

緩存java中的對象, 比如將用戶的信息持久化進redis, 每次用戶查詢自己的信息先從redis中查詢,有的話直接返回,沒有的話再去查詢數據庫, 這樣同樣實現了在用戶和數據庫之間多添加出一層緩存,也可以大大的提高系統的吞吐量

一般會怎麼玩呢?

用戶的請求在查詢數據庫之前先嘗試從redis中獲取對象信息, redis中不存在的話就去數據庫中查詢, 查詢完結果后將這個結果換存進redis

// todo 使用redis做緩存,減少和數據庫的接觸次數
public Label findById(Long labelId) {

    // 先嘗試從緩存中查詢當前對象
    Label label = (Label) redisTemplate.opsForValue().get("label_id" + labelId);

    if (label==null){
        Optional<Label> byId = labelRepository.findById(labelId);
        if (!byId.isPresent()) {
            // todo 異常
        }
        label = byId.get();

        // 將查出的結果存進緩存中
        redisTemplate.opsForValue().set("label_id"+label.getId(),label);
    }
    return label;
}

當用戶update數據 ,先更新數據庫,再刪除/更新redis中響應的緩存

public void update(Long labelId, Label label) {
    label.setId(labelId);
    Label save = labelRepository.save(label);

    // todo 數據庫修改成功后, 將緩存刪除
    redisTemplate.delete("label_id"+save.getId());
    }

當用戶刪除數據,先刪除數據庫中的數據,再刪除redis中的緩存

public void delete(Long labelId) {
    labelRepository.deleteById(labelId);

    // todo 數據庫修改成功后, 將緩存刪除
    redisTemplate.delete("label_id"+labelId);
}

模仿Vue實現頁面靜態化

大家都在說頁面靜態化, 它真的有那麼神奇嗎? 其實也沒有那麼神奇, 說白了吧,傳統的網頁上的數據是通過模板引擎渲染上去的,(比如JSP或者是說thymeleaf這類模板引擎), 做了靜態化的網頁中數據的渲染通過js完成, 而且這個網頁和項目中的 靜態資源比如js,css 這類的文件放在一個目錄下面, 地位和普通的靜態資源相同, 還有個好處就是, 瀏覽器給的福利, 因為瀏覽器對靜態資源是有緩存的, 如果你善於觀察,就會發現有時候重複請求某個網頁,網頁正常显示,但是狀態碼是304… 請求依然會到達服務端,但是服務端會告訴瀏覽器它想訪問的頁面其實沒有變化, 於是瀏覽器就找到本地的緩存使用

時下國內 最火爆的玩靜態頁面時下最火爆的技術就是 Angular.js 以及 Vue.js , 也確實好用, 前幾個月我寫過有關vue的筆記, 感興趣的同學可以去看看

在本篇博客中恰恰好沒用到VUE, 但是實現靜態頁的思路和vue是大差不差的, 同樣是通過js代碼實現頁面的靜態化

  • 首先說後端的代碼怎麼寫?

前後端分離嘛, 自然是json交互,後端通過@ResponseBody控制返回給前端json對象, 而且, 推薦大家也整一個VO對象,用這個VO對象將各式各樣的數據封裝在一起,一次性返回給前端, 這樣看上去,後端確實是簡單,也就是返回一個json對象

  • 前端怎麼寫呢?

第一件事就是將html文件從template文件夾下move到static文件夾下面, 讓這個html文件和js/css文件稱兄道弟

然後是給這個xxx.html該名字, 為啥要改名換目錄呢? 因為SpringBoot是約定大於編碼的, 在什麼目錄下面就是什麼文件, 此外Thymeleaf部分默認的配置信息如下

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {

    private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;

    public static final String DEFAULT_PREFIX = "classpath:/templates/";

    public static final String DEFAULT_SUFFIX = ".html";

沒辦法,這些配置信息默認就認為類路徑下的templates中都是xxx.html的文件

第二件事是將html標籤中引入的類似thymeleaf這中命名空間都去掉,靜態頁不需要

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>商品列表</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <!-- jquery -->
    <!--<script type="text/javascript" th:src="@{/js/jquery.min.js}"></script>-->
    <script type="text/javascript" th:src="js/jquery.min.js"></script>

第三件事寫一個ajax,當頁面一加載就觸發向後台發請求,獲取數據, 通過jQuery操作各個節點完成數據的渲染

三步打完收工, 看上也不是很複雜, 但是我們的頁面就是已然成為了靜態頁面, 從此她會被瀏覽器緩存起來,只要這個頁面不發生變動,瀏覽器就會一直使用自己的緩存,在網絡上的數據傳輸量有多帶勁自己腦補,系統RT絕對飆升幾個數量級

靜態資源的優化手段

說一下市面上常見的靜態資源優化技術吧:

  • js/css 的壓縮與優化,減少流量
  • 多個js/css組合在一起,減少連接數量
  • Tengine 技術
  • webPack , 使用vue開發時,它就會將一整套vue的依賴打包一個js一個html文件,豈不是爽歪歪?
  • CDN加速技術, 很多雲服務廠商都有提供,而且價格也不貴,將體型大的靜態資源放在CDN上進行加速也是不錯的選擇
  • 使用Nginx做靜態資源代理,而且Nginx就支持零拷貝,還支持將數據文件壓縮后在網絡上傳輸 ,自身的併發量也很強大,當靜態資源服務器它絕對是不二首選, 相信我,你會愛上它的

另外當多個用戶併發修改庫存時,竟然將庫存修改成了負數, 本身使用的數據庫引擎是 innodb是存在行級鎖的, 我們只要修改一下我們的sql就行 加條件 and stock_number > 0

為了防止同一個用戶發送兩次請求,偶爾秒殺到多個商品的情況,我們去miaosha_user表中去建立一個唯一的索引,將userId建立唯一索引,不允許相同的userId出現兩次,從而避免上述的情況

驗證碼技術

  • 好處

讓用戶去輸入驗證碼的好處有很多, 除了驗證用戶的身份信息之外, 最明顯的好處就是分散用戶對系統的壓力, 前端如果不添加圖片驗證碼的可能在1s內系統需要承載1萬併發, 但是添加了圖片驗證碼, 就能將這1萬併發分散到10秒以內,甚至更多

  • 整體的思路:

    圖片驗證碼不過是個image, 所以說前端想展示它,肯定需要一個img標籤, 一個比較不好想的地方是啥呢? 就是這個圖片的路徑,src=啥的問題, 我們可以怎麼做呢? 可以直接通過這個往src中寫入後端的生成imge的Controller的路徑, 每次刷新頁面,它就會往這個路徑中發起請求, Controller中去生成一個image, 通過HttpServletResponse的獲取到輸出流, 將生成的圖片用流的發送會瀏覽器,再加上他是img標籤,這不就ok了?

百度一下如何生成圖片驗證碼一類的技術,確實真的很多,我就不貼代碼了, 感興趣的同學自行百度,代碼一片片的

  • 如何實現點擊圖片完成刷新操作呢?

因為這種圖片是靜態資源,如果你不禁用緩存,這個圖片就會被緩存下來, 要想每次點擊圖片都實現更換驗證碼的話,參考下面的js實現, 添加時間戳

   function refreshImageCode() {
        $("#verifyCodeImg").attr("src","/path/verifyCode?goodsId="+$("#goodsId").val()+"&timestamp="+new Date());
    }

接口限流技術

  • 什麼是接口限流?

舉個例子: 如說我們想限制在一分鐘內單個用戶訪問 A Controller中的a方法的次數不能超過30次, 這其實就是一種接口限流的需求, 可以有效的防止用戶的惡意訪問

  • 如何實現接口限流呢?

其實這件事結合緩存來實現並非是一件難事,比如我就用上面的例子: 不是想對a方法進行限流嗎? 我們就在a方法中添加下面的邏輯

偽代碼如下:

public void a(User user){
    // 校驗user合法性
    // 限流
   Integer count = redis.get(user.getId());
    if(count!=null&&count>15)
      return ; // 到達了指定的闋值,直接返回不允許繼續訪問
    if(count==null){
        redis.set(user.getId(),30,1); // 表示當前用戶訪問了1次, 當前key的有效時間為30s
    }else{
        redis.incr(user.getId());
    }
}
  • 如何不讓限流的邏輯侵染業務代碼呢

我們可以使用攔截器技術, 如果我們的重寫了攔截器的preHandler()方法,它就會在執行Controller中的方法前進行回調, 再配合自定義註解技術, 後面簡直就是為所以為…

示例:

@Component
public class AccessIntercepter extends HandlerInterceptorAdapter {
    // 在方法執行之前進行攔截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod){
            HandlerMethod hd = (HandlerMethod) handler;
            LimitAccess methodAnnotation = hd.getMethodAnnotation(LimitAccess.class);
            if (methodAnnotation==null)
                return true;

            // 解析註解
            int maxCount = methodAnnotation.maxCount();
            boolean needLogin = methodAnnotation.needLogin();
            int second = methodAnnotation.second();
            // todo
        }
        return true;
    }
}

結語: 最近又到考試周了,今個周六,下周三考試運籌學… 希望自己能平安度過…

我是bloger 賜我白日夢, 歡迎點贊支持

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

【其他文章推薦】

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

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

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※南投搬家前需注意的眉眉角角,別等搬了再說!

SpringBoot之微服務日誌鏈路追蹤

SpringBoot之微服務日誌鏈路追蹤

簡介

在微服務里,業務出現問題或者程序出的任何問題,都少不了查看日誌,一般我們使用 ELK 相關的日誌收集工具,服務多的情況下,業務問題也是有些難以排查,只能確定大致時間定位相關日誌。log-trace-spring-boot-starter 解決多個服務調用日誌的問題,它可以將一個完整的調用鏈給整合為一個完整有序的日誌。

支持組件:

  • zuul 調用
  • feign 調用
  • restTemplate 調用

日誌輸出格式:

2019-11-14 14:22:07.796  INFO [log-trace-service-a-demo,ac8ffaaed5f343da,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-7] c.p.l.t.service.a.demo.TestController    : controller test2 執行 ac8ffaaed5f343da
2019-11-14 14:23:15.569  INFO [log-trace-service-a-demo,04cf5392dc5c4881,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-9] c.p.l.t.service.a.demo.TestController    : controller test2 執行 04cf5392dc5c4881
2019-11-14 14:24:44.183  INFO [log-trace-service-a-demo,86b5c555ce4f4451,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-1] c.p.l.t.service.a.demo.TestController    : controller test2 執行 86b5c555ce4f4451

我們可以通過 86b5c555ce4f4451 id 進行查詢鏈路上的所有日誌信息。

log-trace-service-a-demo 為當前應用。
log-trace-zuul-demo 為上游應用。

當然這些參數可以基於業務定製的。

功能使用

添加依賴

ps: 實際version版本請使用最新版
最新版本:

<dependency>
  <groupId>com.purgeteam</groupId>
  <artifactId>log-trace-spring-boot-starter</artifactId>
  <version>0.1.0.RELEASE</version>
</dependency>

ps: 請基於 SpirngBoot2.1.x 版本使用

配置應用

這裏以3個微服務來舉例子。

  1. log-trace-zuul-demo 充當網關功能
  2. log-trace-service-a-demo 充當服務A
  3. log-trace-service-b-demo 充當服務B

調用鏈路為:

log-trace-zuul-demo -> log-trace-service-a-demo TestController#test -> log-trace-service-b-demo TestController#test

訪問網關地址: http://127.0.0.1:8000/a/test

網關日誌如下:

2019-11-14 14:27:37.434 DEBUG [33b07a9c5f324375,this] 89996 --- [nio-8000-exec-1] c.p.l.t.s.i.zuul.TracePreZuulFilter      : zuul traceid 33b07a9c5f324375

網關轉發至服務A

服務A 日誌如下:

2019-11-14 14:27:37.476  INFO [log-trace-service-a-demo,33b07a9c5f324375,log-trace-zuul-demo,,] 88948 --- [nio-8081-exec-5] c.p.l.t.service.a.demo.TestController    : controller test2 執行 33b07a9c5f324375

服務A 調用 服務B

服務B 日誌如下:

2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.t.servcie.b.demo.TestController    : header traceId 33b07a9c5f324375
2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.t.servcie.b.demo.TestController    : controller test 執行 33b07a9c5f324375
2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.trace.servcie.b.demo.TestService   : test 方法執行 33b07a9c5f324375
2019-11-14 14:27:37.478  INFO [log-trace-service-b-demo,33b07a9c5f324375,log-trace-service-a-demo,,] 88952 --- [nio-8082-exec-3] c.p.l.trace.servcie.b.demo.TestService   : test1 方法執行 33b07a9c5f324375

這樣可以在第三方日誌平台按照一個id進行查詢了。

如 ELK 通過 33b07a9c5f324375 id 查詢出相關的所有鏈路調用。

配置輸出格式

目前支持以上參數:

X-B3-ParentName 上游服務名稱
X-B3-TraceId 為一個請求分配的ID號,用來標識一條請求鏈路。

通過 application.properties 進行配置。

spring.trace.log.format=X-B3-TraceId,X-B3-ParentName


`spring.trace.log.format` 配置參數順序將影響日誌輸出格式。

不配置將按照默認格式輸出。

日誌輸出如下:

2019-11-14 14:27:37.434 DEBUG [33b07a9c5f324375,this] 89996 --- [nio-8000-exec-1] c.p.l.t.s.i.zuul.TracePreZuulFilter      : zuul traceid 33b07a9c5f324375

總結

目前實現了日誌連貫的功能,後續將支持定製輸出 比如按照登陸人員id進行輸出,方便追蹤用戶行為。
框架方便後續支持 Dubbo 等。

示例代碼地址:

作者GitHub:
歡迎關注

qq交流群: 812321371 微信交流群: MercyYao

微信公眾號:

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

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!

農地轉用的特殊案例──北海道知內町太陽能發電廠(上)

文:宋瑞文(加州能源特約撰述)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

西班牙東北部化學工廠爆炸 釀1死6傷

摘錄自2020年1月15日中央社報導

西班牙東北部發生化學工廠爆炸事故,造成一人喪命,傷及六人。當地媒體引述消防人員的說法表示,爆炸很有可能是化學意外所引起。

「先鋒報」(La Vanguardia)和「國家報」(ElPais)等媒體在網站上表示,這起在塔拉戈納省(Tarragona)發生的爆炸引發衝擊波,造成一棟建築物坍塌,一人身亡。

加泰隆尼亞救災服務處發言人證實,附近有建築物倒塌並有一人喪生,但還無法確定大樓倒塌與爆炸或大火有關。

民防局建議附近民眾待在室內,並預防性緊鎖門窗,但說:「沒有證據顯示(爆炸)產生有毒的煙霾。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!