整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JavaScript 后端開發(fā)者必須跨的 10 道門檻

          要:在IT行業(yè)中,后端開發(fā)者發(fā)揮著至關(guān)重要的作用。尤其是在技術(shù)變革日新月異的時(shí)代,更需要后端開發(fā)者不斷提升自我的技能,但是,無論技術(shù)迭代如何迅速,后端開發(fā)人員的“基本功”都不可以落下。本文展開討論成為JavaScript堆棧后端開發(fā)人員,必須經(jīng)歷的那些事……

          原文鏈接:

          https://billypentester.medium.com/ultimate-10-stages-to-master-backend-development-f6f65f22a327

          聲明:本文為CSDN翻譯,轉(zhuǎn)載請(qǐng)注明來源。

          作者 | Bilal Ahmad

          譯者 | 朱珂欣 責(zé)編 | 屠敏

          出品 | CSDN(ID:CSDNnews)

          隨著時(shí)代的發(fā)展,越來越多編程語言和開發(fā)工具的出現(xiàn),讓開發(fā)者能夠方便且快捷地開發(fā)和部署應(yīng)用程序。其中,后端開發(fā)多是指服務(wù)器端編程,開發(fā)人員通過創(chuàng)建應(yīng)用程序體系結(jié)構(gòu)和業(yè)務(wù)邏輯,以此處理和存儲(chǔ)數(shù)據(jù)并輸出有用的信息。

          毋庸置疑,成為后端開發(fā)人員必然有門檻,掌握Web和操作系統(tǒng)的基礎(chǔ)知識(shí)、了解數(shù)據(jù)庫、計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)結(jié)構(gòu)和算法、開發(fā)工具等,逐漸成為后端開發(fā)人員的入門技能。后端編程語言、框架和堆棧也很多,例如JavaScript、Python、PHP、Java、Ruby等。那么,成為JavaScript堆棧后端開發(fā)人員,需要面臨那幾個(gè)必須經(jīng)歷的階段呢?


          第1階段:掌握Web基礎(chǔ)知識(shí)

          在開發(fā)人員的初始階段,學(xué)習(xí)Web的基礎(chǔ)知識(shí)是至關(guān)重要的。因?yàn)閾碛蠾eb概念可以幫助開發(fā)人員更好地了解互聯(lián)網(wǎng)的工作原理,例如使用哪些協(xié)議、如何傳遞消息等。

          首當(dāng)其沖的是了解Web中的一些基本概念,例如HTTP的概念、HTTP的基本方面、HTTP 請(qǐng)求的類型及作用、客戶端和服務(wù)器模型、OSI 模型、DNS 工作原理等。


          第2階段:了解操作系統(tǒng)知識(shí)
          操作系統(tǒng),管理著計(jì)算機(jī)上的所有軟件和硬件。它執(zhí)行內(nèi)存和進(jìn)程管理,處理輸入和輸出等。通過運(yùn)行操作系統(tǒng),進(jìn)一步運(yùn)行完整 Web 應(yīng)用的服務(wù)器。因此,開發(fā)人員有必要了解操作系統(tǒng)整體實(shí)現(xiàn),以最大限度地提高性能并優(yōu)化內(nèi)存。
          在此階段,開發(fā)需要了解操作系統(tǒng)體系結(jié)構(gòu)、文件系統(tǒng)、基本CLI命令、內(nèi)存和進(jìn)程管理、操作系統(tǒng)線程等。

          第3階段:學(xué)習(xí)后端框架和語言

          在開發(fā)者學(xué)習(xí)要使用的后端框架和語言的過程中,第一步是學(xué)習(xí)JavaScript。學(xué)習(xí)JavaScript的基礎(chǔ)知識(shí),例如數(shù)據(jù)類型、循環(huán)、選擇、函數(shù)、對(duì)象、類、數(shù)組、字符串、正則表達(dá)式等。
          JavaScript 由ECMAScript、文檔對(duì)象模型(DOM)和瀏覽器對(duì)象模型(BOM)三個(gè)部分組成。ECMAScript是JavaScript所基于的腳本語言規(guī)范。它引入了新的JavaScript功能,如箭頭函數(shù),異步等待,模板文本等,這些功能可以對(duì)有效的編碼很有幫助。
          Node.js是一個(gè)開源的、跨平臺(tái)的、后端的JavaScript運(yùn)行時(shí)環(huán)境,它在JavaScript引擎上運(yùn)行并執(zhí)行JavaScript代碼。開發(fā)人員可以學(xué)習(xí)基本的節(jié)點(diǎn)JavaScript模塊,例如fs、path、os等。

          第4階段:使用服務(wù)器框架和API開發(fā)

          首先,服務(wù)器端框架作為后端開發(fā)中的主要角色,它是前端和后端(節(jié)點(diǎn)應(yīng)用)之間的通信網(wǎng)關(guān),使編寫、維護(hù)和擴(kuò)展Web應(yīng)用更加容易。
          服務(wù)器端框架提供工具和庫來實(shí)現(xiàn)簡(jiǎn)單、常見的開發(fā)任務(wù),包括路由處理,數(shù)據(jù)庫交互,會(huì)話支持和用戶驗(yàn)證,格式化輸出,提高安全性應(yīng)對(duì)網(wǎng)絡(luò)攻擊,也能使開發(fā)人員完全控制傳入和傳出的請(qǐng)求/響應(yīng),提供端點(diǎn),執(zhí)行中間件功能等。
          其次,API開發(fā)作為一種實(shí)踐階段,開發(fā)人員將學(xué)習(xí)如何使用Express JS和節(jié)點(diǎn)JS創(chuàng)建簡(jiǎn)單的REST API并執(zhí)行CRUD操作。使用快速中間件驗(yàn)證傳入請(qǐng)求,使用路由器處理端點(diǎn)等。
          Postman 在測(cè)試 API 端點(diǎn)方面很有幫助。添加更多內(nèi)容并了解 swagger 和 Open API。

          第5階段:使用模板引擎

          通常,前端(React應(yīng)用程序)和后端(快速應(yīng)用程序)之間的通信是使用MERN堆棧中的API調(diào)用完成的。客戶端從服務(wù)器請(qǐng)求數(shù)據(jù),服務(wù)器將請(qǐng)求的數(shù)據(jù)發(fā)送回客戶端。
          但是,如果開發(fā)人員的項(xiàng)目很小,并且對(duì) React 或其他前端框架不了解,可以使用模板引擎。
          模板引擎可幫助開發(fā)人員創(chuàng)建靜態(tài)HTML模板文件,并在運(yùn)行時(shí)將模板文件中的變量替換為實(shí)際值,這使其成為動(dòng)態(tài)網(wǎng)站。模板引擎與Express JS的集成一起工作。它從數(shù)據(jù)庫獲取數(shù)據(jù)值,并可以通過HTML 模板文件呈現(xiàn)這些值。


          第6階段:了解數(shù)據(jù)庫

          數(shù)據(jù)庫在后端開發(fā)中發(fā)揮著巨大的作用。數(shù)據(jù)庫用于以結(jié)構(gòu)化方式存儲(chǔ)數(shù)據(jù)以及訪問和維護(hù)數(shù)據(jù)。

          后端應(yīng)用程序可以通過使用MongoDB,MySQL等第三方npm包查詢數(shù)據(jù)庫來直接與數(shù)據(jù)庫交互。如果開發(fā)人員不了解SQL或數(shù)據(jù)庫語言,則需要學(xué)習(xí)任何ORM/ODM作為中間件,將對(duì)象方法轉(zhuǎn)換為復(fù)雜的數(shù)據(jù)庫查詢,這些中間件為開發(fā)人員提供了一個(gè)名為模型的完整結(jié)構(gòu),用于在將數(shù)據(jù)輸入數(shù)據(jù)庫之前驗(yàn)證數(shù)據(jù)。此外,它在對(duì)象模型之上提供了一個(gè)額外的安全層。


          第7階段:關(guān)注安全性

          安全性是企業(yè)級(jí) Web 應(yīng)用程序的一大關(guān)注點(diǎn)。單個(gè)漏洞會(huì)導(dǎo)致數(shù)據(jù)泄露或應(yīng)用程序故障。Web 應(yīng)用中應(yīng)有適當(dāng)?shù)尿?yàn)證、身份驗(yàn)證和授權(quán)。

          因此,開發(fā)人員在該階段可能會(huì)涉及促進(jìn)應(yīng)用更安全的一些技術(shù),例如:
          • JWT:使用令牌防止對(duì)受保護(hù)資源的意外訪問;
          • Cookie:用于存儲(chǔ)有關(guān)訪問網(wǎng)頁的信息;
          • 會(huì)話:用于維護(hù)與服務(wù)器的安全連接;
          • CORS:使用CORS從一個(gè)網(wǎng)站向另一個(gè)網(wǎng)站發(fā)出請(qǐng)求;
          • 哈希:使用中間件通過salt對(duì)密碼進(jìn)行哈希處理;
          • 加密/解密:使用中間件加密和解密重要數(shù)據(jù);
          • SSL:使用SSL認(rèn)證來保護(hù)事務(wù);
          • 限制:使用中間件應(yīng)用請(qǐng)求限制,防止DDOS攻擊。


          第8階段:使用消息代理

          現(xiàn)代應(yīng)用程序非常復(fù)雜,由于時(shí)間復(fù)雜度大,CPU密集型操作、大量數(shù)據(jù)處理以及多個(gè)服務(wù)之間的API通信存在耗時(shí)的問題,會(huì)帶來糟糕的用戶體驗(yàn)。

          消息代理成為幫助克服其中一些困難的解決方案之一消息代理由 3 個(gè)組件組成:

          • 制作人:生產(chǎn)者發(fā)送有關(guān)主題的消息。一個(gè)或多個(gè)發(fā)布者可以針對(duì)同一主題發(fā)布內(nèi)容;

          • 消費(fèi)者:訂閱者訂閱主題,發(fā)布到該主題的所有消息都將由該主題的所有訂閱者接收;

          • 隊(duì)列/主題:隊(duì)列保存由生產(chǎn)者發(fā)布并由消費(fèi)者訪問的消息。


          第9階段:測(cè)試完整的API

          在實(shí)時(shí)服務(wù)器上部署Web應(yīng)用程序之前,為了減少單個(gè)錯(cuò)誤的輸入或缺少數(shù)據(jù)導(dǎo)致正在運(yùn)行的服務(wù)器出現(xiàn)故障,需要進(jìn)行測(cè)試。

          測(cè)試可以根據(jù)多個(gè)標(biāo)準(zhǔn)在多個(gè)級(jí)別上進(jìn)行,開發(fā)人員可以檢查Web應(yīng)用是否返回了正確的狀態(tài)代碼、錯(cuò)誤消息、數(shù)據(jù)等。

          在這個(gè)階段,開發(fā)人員的主要任務(wù)是使用Jest測(cè)試完整的API。Jest是一個(gè)著名的單元測(cè)試框架,用于測(cè)試Web應(yīng)用程序和API。它提供了多種方法來自動(dòng)化測(cè)試過程,檢查對(duì)錯(cuò)誤或缺失數(shù)據(jù)的響應(yīng)等。

          第10階段:實(shí)時(shí)服務(wù)器/云上部署Web應(yīng)用程序

          在部署Web應(yīng)用之前,開發(fā)人員需要學(xué)習(xí)Git、GitHub的操作以及版本控制工具的使用,以使部署靈活且可擴(kuò)展。

          Git可以用于版本控制,通過創(chuàng)建多個(gè)分支,跟蹤源代碼中的更改,并使多個(gè)開發(fā)人員能夠協(xié)同工作。GitHub是一個(gè)用于版本控制和協(xié)作的代碼托管平臺(tái),可以允許開發(fā)人員和其他人共同處理項(xiàng)目。GitHub操作可幫助您自動(dòng)執(zhí)行軟件開發(fā)工作流。單個(gè)操作是可重用的代碼段,可用于在 GitHub上生成、測(cè)試、打包或部署項(xiàng)目。它還可用于自動(dòng)執(zhí)行工作流程的任何步驟。部署完整的Web應(yīng)用非常復(fù)雜。開發(fā)者還需要一個(gè)專用服務(wù)器來響應(yīng)HTTP請(qǐng)求,并使用在線數(shù)據(jù)庫。

          總的來說,從應(yīng)用程序開發(fā)最初階段的掌握Web基礎(chǔ)知識(shí),到最后階段在實(shí)時(shí)服務(wù)器/云上部署Web應(yīng)用程序。JavaScript堆棧后端開發(fā)者在點(diǎn)滴的積累中,學(xué)習(xí)和掌握了與應(yīng)用開發(fā)相關(guān)的實(shí)踐經(jīng)驗(yàn)。然而,無論是對(duì)于后端開發(fā)的初學(xué)者還是對(duì)有經(jīng)驗(yàn)工程師,無論邁過多少個(gè)階段,學(xué)習(xí)之路都不會(huì)中斷。

          arbor簡(jiǎn)介

          Harbor是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器,通過添加一些企業(yè)必需的功能特性,例如安全、標(biāo)識(shí)和管理等,擴(kuò)展了開源Docker Distribution。

          作為一個(gè)企業(yè)級(jí)私有Registry服務(wù)器,Harbor提供了更好的性能和安全。

          提升用戶使用Registry構(gòu)建和運(yùn)行環(huán)境傳輸鏡像的效率。

          Harbor支持安裝在多個(gè)Registry節(jié)點(diǎn)的鏡像資源復(fù)制,鏡像全部保存在私有Registry中, 確保數(shù)據(jù)和知識(shí)產(chǎn)權(quán)在公司內(nèi)部網(wǎng)絡(luò)中管控。

          另外,Harbor也提供了高級(jí)的安全特性,諸如用戶管理,訪問控制和活動(dòng)審計(jì)等。

          高可用架構(gòu):雙主復(fù)制

          主從同步

          harbor官方默認(rèn)提供主從復(fù)制的方案來解決鏡像同步問題,通過復(fù)制的方式,我們可以實(shí)時(shí)將測(cè)試環(huán)境harbor倉庫的鏡像同步到生產(chǎn)環(huán)境harbor,類似于如下流程:

          img

          在實(shí)際生產(chǎn)運(yùn)維的中,往往需要把鏡像發(fā)布到幾十或上百臺(tái)集群節(jié)點(diǎn)上。這時(shí),單個(gè)Registry已經(jīng)無法滿足大量節(jié)點(diǎn)的下載需求,因此要配置多個(gè)Registry實(shí)例做負(fù)載均衡。手工維護(hù)多個(gè)Registry實(shí)例上的鏡像,將是十分繁瑣的事情。Harbor可以支持一主多從的鏡像發(fā)布模式,可以解決大規(guī)模鏡像發(fā)布的難題:

          只要往一臺(tái)Harbor上發(fā)布,鏡像就會(huì)像"仙女散花"般地同步到多個(gè)Registry中,高效可靠。

          如果是地域分布較廣的集群,還可以采用層次型發(fā)布方式,比如從集團(tuán)總部機(jī)房同步到分公司1機(jī)房,再從分公司1機(jī)房同步到分公司2機(jī)房:

          然而單靠主從同步,仍然解決不了harbor主節(jié)點(diǎn)的單點(diǎn)問題。

          雙主復(fù)制說明

          所謂的雙主復(fù)制其實(shí)就是復(fù)用主從同步實(shí)現(xiàn)兩個(gè)harbor節(jié)點(diǎn)之間的雙向同步,來保證數(shù)據(jù)的一致性,然后在兩臺(tái)harbor前端頂一個(gè)負(fù)載均衡器將進(jìn)來的請(qǐng)求分流到不同的實(shí)例中去,只要有一個(gè)實(shí)例中有了新的鏡像,就是自動(dòng)的同步復(fù)制到另外的的實(shí)例中去,這樣實(shí)現(xiàn)了負(fù)載均衡,也避免了單點(diǎn)故障,在一定程度上實(shí)現(xiàn)了Harbor的高可用性:

          這個(gè)方案有一個(gè)問題就是有可能兩個(gè)Harbor實(shí)例中的數(shù)據(jù)不一致。假設(shè)如果一個(gè)實(shí)例A掛掉了,這個(gè)時(shí)候有新的鏡像進(jìn)來,那么新的鏡像就會(huì)在另外一個(gè)實(shí)例B中,后面即使恢復(fù)了掛掉的A實(shí)例,Harbor實(shí)例B也不會(huì)自動(dòng)去同步鏡像,這樣只能手動(dòng)的先關(guān)掉Harbor實(shí)例B的復(fù)制策略,然后再開啟復(fù)制策略,才能讓實(shí)例B數(shù)據(jù)同步,讓兩個(gè)實(shí)例的數(shù)據(jù)一致。

          另外,這里還需要多吐槽一句:在實(shí)際生產(chǎn)使用中,主從復(fù)制十分的不靠譜!!所以這里推薦使用下面要說的這種方案

          高可用架構(gòu):多實(shí)例共享后端存儲(chǔ)

          方案說明

          共享后端存儲(chǔ)算是一種比較標(biāo)準(zhǔn)的方案,就是多個(gè)Harbor實(shí)例共享同一個(gè)后端存儲(chǔ),任何一個(gè)實(shí)例持久化到存儲(chǔ)的鏡像,都可被其他實(shí)例中讀取。通過前置LB進(jìn)來的請(qǐng)求,可以分流到不同的實(shí)例中去處理,這樣就實(shí)現(xiàn)了負(fù)載均衡,也避免了單點(diǎn)故障。

          本次搭建以NFS作為共享存儲(chǔ)存放Harbor相關(guān)data,并分離PostgreSQL與Redis為多個(gè)Harbor共同連接使用,使用Nginx做負(fù)載均衡。

          如果最終生產(chǎn)環(huán)境集群中服務(wù)器較多,依賴做完LB的Harbor也無法完全達(dá)到需求時(shí),可以使用如下架構(gòu),部署下級(jí)Harbor節(jié)點(diǎn)從主節(jié)點(diǎn)同步鏡像,然后再分發(fā)給生產(chǎn)服務(wù)器。

          這個(gè)方案在實(shí)際生產(chǎn)環(huán)境中部署需要考慮三個(gè)問題:

          1. 共享存儲(chǔ)的選取,Harbor的后端存儲(chǔ)目前支持AWS S3、Openstack Swift, Ceph等,在下面的實(shí)驗(yàn)環(huán)境里,暫且直接使用nfs。

          2. Session在不同的實(shí)例上共享,這個(gè)現(xiàn)在其實(shí)已經(jīng)不是問題了,在最新的harbor中,默認(rèn)session會(huì)存放在redis中,只需要將redis獨(dú)立出來即可。可以通過redis sentinel或者redis cluster等方式來保證redis的可用性。在下面的實(shí)驗(yàn)環(huán)境里,暫且使用單臺(tái)redis。

          3. Harbor多實(shí)例數(shù)據(jù)庫問題,這個(gè)也只需要將harbor中的數(shù)據(jù)庫拆出來獨(dú)立部署即可。讓多實(shí)例共用一個(gè)外部數(shù)據(jù)庫,數(shù)據(jù)庫的高可用也可以通過數(shù)據(jù)庫的高可用方案保證。

          環(huán)境說明

          • 操作系統(tǒng):CentOS 7.6
          • 演示環(huán)境軟件版本

          多實(shí)例共享后端存儲(chǔ)部署

          Docker

          1)安裝依賴包:

          yum install -y yum-utils \
            device-mapper-persistent-data \
            lvm2

          2)官方一鍵腳本安裝

          curl -fsSL get.docker.com -o get-docker.sh
          sh get-docker.sh --mirror Aliyun

          3)添加內(nèi)核參數(shù)

          tee -a /etc/sysctl.conf <<-EOF
          net.bridge.bridge-nf-call-ip6tables = 1
          net.bridge.bridge-nf-call-iptables = 1
          EOF

          net.ipv4.ip_forward賦值為1

          然后刷新內(nèi)核參數(shù)

          sysctl -p

          4)修改Docker倉庫為國內(nèi)鏡像站

          curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com

          5)啟動(dòng)Docker

          systemctl enable docker && systemctl start docker

          Compose

          compose是Docker提供的一個(gè)命令行工具,用來定義和運(yùn)行由多個(gè)容器組成的應(yīng)用。使用compose,我們可以通過YAML文件聲明式的定義應(yīng)用程序的各個(gè)服務(wù),并由單個(gè)命令完成應(yīng)用的創(chuàng)建和啟動(dòng)。

          由于國內(nèi)政策原因,可能在海外網(wǎng)站上下載文件速度較慢,建議下載本地后上傳至服務(wù)器

          1)下載docker-compose并賦予可執(zhí)行權(quán)限

          # curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
          # chmod +x /usr/local/bin/docker-compose
          cd /usr/local/bin
          scp 192.168.166.96:/usr/local/bin/docker-compose .

          注意:由于我其他服務(wù)器已經(jīng)存在,所以我直接拷貝了

          2)安裝bash補(bǔ)全命令

          # curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
          scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/

          重新連接終端即生效

          注意:由于我其他服務(wù)器已經(jīng)存在,所以我直接拷貝了

          NFS

          服務(wù)端

          1)安裝必需的RPM包

          yum -y install nfs-utils rpcbind   

          2)創(chuàng)建NFS共享目錄

          mkdir -p /data/harbor_data
          chown nobody:nobody /data/harbor_data/ 

          3)修改NFS服務(wù)配置文件

          echo "/data/harbor_data 192.168.166.0/24(rw,sync,no_root_squash)"  >> /etc/exports

          4)啟動(dòng)NFS服務(wù)器

          systemctl enable rpcbind && systemctl restart rpcbind
          systemctl enable nfs && systemctl restart nfs

          客戶端

          1)安裝nfs-utils

          yum -y install nfs-utils

          2)在NFS客戶端上查看NFS的連通性

          # showmount -e 192.168.166.122
          Export list for 192.168.166.122:
          /data/harbor_data 192.168.166.0/24

          3)掛載NFS共享存儲(chǔ)

          創(chuàng)建掛載目錄

          mkdir /data

          修改/etc/fstab配置文件加入以下內(nèi)容

          192.168.166.122:/data/harbor_data  /data  nfs defaults 0 0

          mount掛載

          mount -a

          PostgreSQL

          1)下載PostgreSQL官方Y(jié)UM源配置文件包并安裝

          wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
          rpm -ivh pgdg-redhat-repo-latest.noarch.rpm 

          2)安裝PostgreSQL

          yum  -y install postgresql96-server postgresql96-contrib 

          3)初始化數(shù)據(jù)庫

          /usr/pgsql-9.6/bin/postgresql96-setup initdb  

          4)啟動(dòng)數(shù)據(jù)庫

          systemctl enable postgresql-9.6 && systemctl restart postgresql-9.6

          5)PostgreSQL數(shù)據(jù)庫配置

          1. 修改密碼
          # su - postgres
          -bash-4.2$ psql
          psql (9.6.17)
          Type "help" for help.
          postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
          ALTER ROLE

          2、開啟遠(yuǎn)程訪問

          vi /var/lib/pgsql/9.6/data/postgresql.conf
          
          # listen_addresses = 'localhost' 改為 listen_addresses='*'

          3、信任遠(yuǎn)程連接

          vim /var/lib/pgsql/9.6/data/pg_hba.conf

          加入:

          host    all  all  192.168.166.203/32 trust
          host    all  all  192.168.166.81/32 trust
          host    all  all  192.168.166.212/32 trust

          6)重啟PostgreSQL服務(wù)

          systemctl restart postgresql-9.6

          7)驗(yàn)證服務(wù)

          psql -h 192.168.166.203 -p 5432 -U postgres

          8)遷移數(shù)據(jù)庫

          1. 在postgresql所在服務(wù)器,先啟動(dòng)一套harbor環(huán)境

          簡(jiǎn)要步驟如下:

          # yum install -y yum-utils   device-mapper-persistent-data   lvm2
          # curl -fsSL get.docker.com -o get-docker.sh
          # sh get-docker.sh --mirror Aliyun
          #curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com
          # systemctl enable docker && systemctl start docker
          # cd /usr/local/bin
          # scp 192.168.166.96:/usr/local/bin/docker-compose .
          # scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/
          # cd ~
          # scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .
          # tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/
          # cd /usr/local/harbor/
          # vim harbor.yml ###修改hostname: 192.168.166.203  ####注釋掉https段即可
          # ./prepare 
          # ./install.sh 
          # docker-compose up -d

          2、進(jìn)入harbor-db容器導(dǎo)出相關(guān)表及數(shù)據(jù)

          # docker container exec -it harbor-db /bin/bash
          pg_dump -U postgres registry > /tmp/registry.sql 
          pg_dump -U postgres notarysigner > /tmp/notarysigner.sql  
          pg_dump -U postgres notaryserver > /tmp/notaryserver.sql

          3、導(dǎo)出數(shù)據(jù)庫

          docker container cp harbor-db:/tmp/registry.sql /tmp
          docker container cp harbor-db:/tmp/notarysigner.sql /tmp
          docker container cp harbor-db:/tmp/notaryserver.sql /tmp

          4、將數(shù)據(jù)導(dǎo)入至外部PostgreSQL數(shù)據(jù)庫

          # psql -h 192.168.166.203 -U postgres
          postgres=# create database registry;
          CREATE DATABASE
          postgres=# create database notarysigner;
          CREATE DATABASE
          postgres=# create database notaryserver;
          CREATE DATABASE
          psql -h 192.168.166.203 -U postgres registry < /tmp/registry.sql
          psql -h 192.168.166.203 -U postgres notarysigner  < /tmp/notarysigner.sql
          psql -h 192.168.166.203 -U postgres notaryserver < /tmp/notaryserver.sql

          Redis

          1)安裝redis

          yum -y install redis

          2) 修改配置參數(shù)

          sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis.conf   
          sed -i 's/daemonize no/daemonize yes/g' /etc/redis.conf   

          3)啟動(dòng)并測(cè)試redis連接

          systemctl enable redis && systemctl restart redis
          redis-cli 

          Harbor

          下載Harbor離線安裝包,離線安裝包文件較大(約為:590M),建議在本地使用多線程工具下載后上傳服務(wù)器使用。

          1)下載

          cd ~
          scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .

          2)解壓

          tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/

          3)修改配置文件

          # cd /usr/local/harbor/
          # vim harbor.yml 

          修改的內(nèi)容有

          • hostname修改為本機(jī)ip
          • 注釋掉https
          • 修改harbor默認(rèn)的admin賬號(hào)密碼
          • 數(shù)據(jù)存儲(chǔ)位置,改為nfs掛載目錄,因?yàn)槲覀儽緛砭蛼燧d到了/data目錄下,所以不用動(dòng)
          • 注釋掉database
          • 注釋掉clair
          • 打開external_databaseexternal_redis塊的注釋,并改為剛剛部署的地址

          修改完的樣例文件,如下

          hostname: 192.168.166.81
          http:
            port: 80
          harbor_admin_password: Harbor12345
          data_volume: /data
          jobservice:
            max_job_workers: 10
          notification:
            webhook_job_max_retry: 10
          chart:
            absolute_url: disabled
          log:
            level: info
            local:
              rotate_count: 50
              rotate_size: 200M
              location: /var/log/harbor
          _version: 1.10.0
          external_database:
            harbor:
              host: 192.168.166.203
              port: 5432
              db_name: registry
              username: postgres
              password: postgres
              ssl_mode: disable
              max_idle_conns: 2
              max_open_conns: 0
            clair:
              host: 192.168.166.203
              port: 5432
              db_name: clair
              username: postgres
              password: postgres
              ssl_mode: disable
            notary_signer:
              host: 192.168.166.203
              port: 5432
              db_name: notarysigner
              username: postgres
              password: postgres
              ssl_mode: disable
            notary_server:
              host: 192.168.166.203
              port: 5432
              db_name: notaryserver
              username: postgres
              password: postgres
              ssl_mode: disable
          external_redis:
            host: 192.168.166.245
            port: 6379
            password:
            registry_db_index: 1
            jobservice_db_index: 2
            chartmuseum_db_index: 3
            clair_db_index: 4
          proxy:
            http_proxy:
            https_proxy:
            no_proxy:
            components:
              - core
              - jobservice
              - clair

          4)生成harbor運(yùn)行的必要文件(環(huán)境)以及docker-compose.yml文件;執(zhí)行后會(huì)通過網(wǎng)絡(luò)獲取Docker Image,建議提前修改好國內(nèi)鏡像站加速。

          ./prepare 

          5)安裝Harbor

          ./install.sh 

          Nginx

          1)安裝nginx

          安裝可以參考https://wiki.clay-wangzhi.com/7-nginx/1.-chu-shi-nginx#4-bian-yi-an-zhuang-nginx

          這里我就不再詳細(xì)講了

          2)編寫配置文件

          # cat harbor.schengle.com.conf 
          upstream harbor {
              ip_hash;
              server 192.168.166.81:80;
              server 192.168.166.212:80;
          }
          server {
              listen       80;
              server_name  harbor.***.com;
              rewrite ^(.*) https://$server_name$1 permanent;
          }
          server {
              listen  443 ssl;
              server_name harbor.schengle.com;
              
              ssl_certificate ***.crt;
              ssl_certificate_key ***.key;
              client_max_body_size 0;
              chunked_transfer_encoding on;
          
              location / {
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  #proxy_set_header Host $host;
                  proxy_set_header X-Forwarded-Proto https;
                  proxy_redirect off;
                  proxy_ssl_verify off;
                  proxy_ssl_session_reuse on;
                  proxy_pass http://harbor;
          		proxy_redirect default;
                  proxy_http_version 1.1;
          }
              location /v2/ {
                  proxy_pass http://harbor/v2/;
          		proxy_redirect default;
                  #proxy_set_header Host $host;
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_set_header X-Forwarded-Proto $scheme;
                  proxy_ssl_verify off;
                  proxy_ssl_session_reuse on;
                  proxy_buffering off;
                  proxy_request_buffering off;
              }
          }

          3)平滑重啟nginx

          nginx -s reload

          參考文章

          https://www.cnblogs.com/kevingrace/p/11422710.html

          https://juejin.im/post/5d973e246fb9a04dfa0963fb#heading-18

          http://dwz-9.cn/_L4me

          篇幅有限,關(guān)于生產(chǎn)級(jí)harbor可用的搭建就介紹到這了,大家感興趣也可以自己測(cè)試一下。

          后面會(huì)分享更多運(yùn)維方面內(nèi)容,感興趣的朋友可以關(guān)注下!

          言:

          隨著JavaScript的不斷發(fā)展,開發(fā)者們正在尋找更靈活和可擴(kuò)展的方式來修改或擴(kuò)展現(xiàn)有的代碼。其中一種廣泛應(yīng)用的技術(shù)是"Hook",它允許開發(fā)者攔截和修改現(xiàn)有的函數(shù)或方法的行為。本文將詳細(xì)介紹JavaScript中的Hook技術(shù),包括其特性、優(yōu)點(diǎn)、缺點(diǎn)和使用場(chǎng)景,并提供示例代碼進(jìn)行說明。

          什么是Hook?

          在JavaScript中,Hook是一種能夠攔截和修改函數(shù)或方法行為的技術(shù)。通過使用Hook,開發(fā)者可以在現(xiàn)有的函數(shù)執(zhí)行前、執(zhí)行后或者替換函數(shù)的實(shí)現(xiàn)邏輯。這種靈活的能力使得開發(fā)者能夠定制和擴(kuò)展現(xiàn)有代碼的行為,而無需修改原始代碼。

          Hook的特性

          1. 攔截和修改函數(shù)行為:Hook技術(shù)允許開發(fā)者在函數(shù)執(zhí)行前、執(zhí)行后或者替換函數(shù)的實(shí)現(xiàn)邏輯,從而可以攔截并修改函數(shù)的行為。
          2. 無需修改原始代碼:使用Hook技術(shù),開發(fā)者可以在不修改原始代碼的情況下,對(duì)其行為進(jìn)行定制和擴(kuò)展。這種無侵入性的特性使得Hook成為修改現(xiàn)有代碼的強(qiáng)大工具。
          3. 靈活性和可擴(kuò)展性:Hook技術(shù)提供了靈活性和可擴(kuò)展性,使得開發(fā)者能夠根據(jù)自己的需求,對(duì)現(xiàn)有代碼進(jìn)行精確的修改或擴(kuò)展。

          Hook的優(yōu)點(diǎn)

          1. 解耦合和可維護(hù)性:使用Hook技術(shù),開發(fā)者可以將定制和擴(kuò)展的邏輯與原始代碼解耦合。這種解耦合使得代碼更易于維護(hù),因?yàn)樾薷幕驍U(kuò)展的邏輯可以在獨(dú)立的Hook函數(shù)中進(jìn)行管理。
          2. 代碼復(fù)用:通過將定制和擴(kuò)展的邏輯封裝在Hook函數(shù)中,開發(fā)者可以在多個(gè)地方重復(fù)使用相同的Hook函數(shù),從而實(shí)現(xiàn)代碼復(fù)用,減少重復(fù)編寫相似邏輯的工作量。
          3. 快速原型開發(fā):使用Hook技術(shù),開發(fā)者可以迅速修改現(xiàn)有代碼的行為,以便進(jìn)行快速原型開發(fā)和實(shí)驗(yàn)。這種能力可以幫助開發(fā)者更快地迭代和驗(yàn)證想法。

          Hook的缺點(diǎn)

          1. 潛在的性能影響:由于Hook技術(shù)會(huì)對(duì)函數(shù)的執(zhí)行過程進(jìn)行攔截和修改,可能會(huì)導(dǎo)致性能方面的損失。特別是在大規(guī)模應(yīng)用中使用復(fù)雜的Hook邏輯時(shí),需要仔細(xì)考慮性能問題。
          2. 隱含的復(fù)雜性:Hook技術(shù)引入了代碼中的額外邏輯和復(fù)雜性。開發(fā)者需要仔細(xì)設(shè)計(jì)和組織Hook邏輯,以確保其正確性和可維護(hù)性。
          3. 潛在的兼容性問題:在使用Hook技術(shù)時(shí),需要注意兼容性問題。某些函數(shù)可能無法被成功Hook,或者在不同的JavaScript環(huán)境中表現(xiàn)不一致。

          使用場(chǎng)景

          1. 日志和調(diào)試:Hook技術(shù)可用于攔截函數(shù)的執(zhí)行,并記錄函數(shù)的輸入、輸出和執(zhí)行時(shí)間等信息,以便進(jìn)行日志和調(diào)試。
          2. 性能監(jiān)測(cè):通過使用Hook技術(shù),開發(fā)者可以收集函數(shù)的執(zhí)行時(shí)間和資源消耗等指標(biāo),從而進(jìn)行性能監(jiān)測(cè)和優(yōu)化。
          3. 行為定制和擴(kuò)展:Hook技術(shù)可以用于在函數(shù)執(zhí)行前、執(zhí)行后或替換函數(shù)實(shí)現(xiàn)邏輯,實(shí)現(xiàn)定制和擴(kuò)展函數(shù)的行為。

          示例代碼:

          下面是一個(gè)使用Hook技術(shù)的示例代碼,用于在函數(shù)執(zhí)行前后打印日志:

          function withLogging(fn) {
            return function (...args) {
              console.log(`Calling function ${fn.name} with arguments: ${args.join(', ')}`);
              const result = fn.apply(this, args);
              console.log(`Function ${fn.name} returned: ${result}`);
              return result;
            }
          }
          
          function add(a, b) {
            return a + b;
          }
          
          const hookedAdd = withLogging(add);
          const result = hookedAdd(2, 3); // Output: Calling function add with arguments: 2, 3
                                         //         Function add returned: 5
          console.log(result); // Output: 5

          在上面的示例中,withLogging函數(shù)是一個(gè)Hook函數(shù),用于攔截目標(biāo)函數(shù)add的執(zhí)行,并在執(zhí)行前后打印日志信息。通過調(diào)用hookedAdd函數(shù),可以觸發(fā)攔截和日志輸出的過程。

          結(jié)論:

          通過使用Hook技術(shù),JavaScript開發(fā)者可以靈活地修改和擴(kuò)展現(xiàn)有代碼的行為,而無需修改原始代碼。盡管Hook技術(shù)具有一些潛在的缺點(diǎn)和復(fù)雜性,但在日志、調(diào)試、性能監(jiān)測(cè)以及行為定制和擴(kuò)展等場(chǎng)景中,它仍然是一個(gè)強(qiáng)大且有用的工具。開發(fā)者可以根據(jù)自己的需求,靈活地使用Hook技術(shù)來滿足特定的編程需求。

          如果您對(duì)文章內(nèi)容有不同看法,或者疑問,歡迎到評(píng)論區(qū)留言,或者私信我、到我們的官網(wǎng)找客服號(hào)都可以。

          如遇自己js加密源碼加密后沒備份,可以找我們解決解出恢復(fù)源碼,任何加密都可以


          主站蜘蛛池模板: 奇米精品一区二区三区在| 怡红院美国分院一区二区 | 亚洲一区二区久久| 国产在线视频一区| 精品国产日韩亚洲一区91| 精品日产一区二区三区手机| 亚洲性无码一区二区三区| V一区无码内射国产| 99精品一区二区三区无码吞精| 久久精品国产一区二区电影| 国产乱码精品一区二区三区 | 久久精品国内一区二区三区 | 国产一区二区三区在线免费 | 国产一区中文字幕在线观看| 亚洲Av永久无码精品一区二区| 色狠狠色噜噜Av天堂一区| 色视频综合无码一区二区三区 | 国产色综合一区二区三区| 日本精品一区二区三区四区| 国产一区二区在线观看视频| 成人精品一区二区电影| 蜜桃传媒一区二区亚洲AV| 伊人久久大香线蕉AV一区二区| 国产福利91精品一区二区 | 精品女同一区二区三区免费播放 | 精品aⅴ一区二区三区| 一夲道无码人妻精品一区二区| 国产一区二区三区夜色| 日本免费电影一区二区| 无码一区二区三区| AV怡红院一区二区三区 | 精品人无码一区二区三区| 波多野结衣中文字幕一区二区三区 | 亚洲一区二区三区高清视频| 日韩经典精品无码一区| 亚洲中文字幕乱码一区| 免费一区二区无码东京热| 日本一区二区三区在线观看视频| 色久综合网精品一区二区| 国产另类ts人妖一区二区三区| 久热国产精品视频一区二区三区 |