Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
要:在IT行業中,后端開發者發揮著至關重要的作用。尤其是在技術變革日新月異的時代,更需要后端開發者不斷提升自我的技能,但是,無論技術迭代如何迅速,后端開發人員的“基本功”都不可以落下。本文展開討論成為JavaScript堆棧后端開發人員,必須經歷的那些事……
原文鏈接:
https://billypentester.medium.com/ultimate-10-stages-to-master-backend-development-f6f65f22a327
聲明:本文為CSDN翻譯,轉載請注明來源。
譯者 | 朱珂欣 責編 | 屠敏
出品 | CSDN(ID:CSDNnews)
隨著時代的發展,越來越多編程語言和開發工具的出現,讓開發者能夠方便且快捷地開發和部署應用程序。其中,后端開發多是指服務器端編程,開發人員通過創建應用程序體系結構和業務邏輯,以此處理和存儲數據并輸出有用的信息。
毋庸置疑,成為后端開發人員必然有門檻,掌握Web和操作系統的基礎知識、了解數據庫、計算機網絡協議、數據結構和算法、開發工具等,逐漸成為后端開發人員的入門技能。后端編程語言、框架和堆棧也很多,例如JavaScript、Python、PHP、Java、Ruby等。那么,成為JavaScript堆棧后端開發人員,需要面臨那幾個必須經歷的階段呢?
第1階段:掌握Web基礎知識
在開發人員的初始階段,學習Web的基礎知識是至關重要的。因為擁有Web概念可以幫助開發人員更好地了解互聯網的工作原理,例如使用哪些協議、如何傳遞消息等。
首當其沖的是了解Web中的一些基本概念,例如HTTP的概念、HTTP的基本方面、HTTP 請求的類型及作用、客戶端和服務器模型、OSI 模型、DNS 工作原理等。
第3階段:學習后端框架和語言
第4階段:使用服務器框架和API開發
第5階段:使用模板引擎
第6階段:了解數據庫
后端應用程序可以通過使用MongoDB,MySQL等第三方npm包查詢數據庫來直接與數據庫交互。如果開發人員不了解SQL或數據庫語言,則需要學習任何ORM/ODM作為中間件,將對象方法轉換為復雜的數據庫查詢,這些中間件為開發人員提供了一個名為模型的完整結構,用于在將數據輸入數據庫之前驗證數據。此外,它在對象模型之上提供了一個額外的安全層。
第7階段:關注安全性
安全性是企業級 Web 應用程序的一大關注點。單個漏洞會導致數據泄露或應用程序故障。Web 應用中應有適當的驗證、身份驗證和授權。
限制:使用中間件應用請求限制,防止DDOS攻擊。
第8階段:使用消息代理
消息代理成為幫助克服其中一些困難的解決方案之一。消息代理由 3 個組件組成:
制作人:生產者發送有關主題的消息。一個或多個發布者可以針對同一主題發布內容;
消費者:訂閱者訂閱主題,發布到該主題的所有消息都將由該主題的所有訂閱者接收;
在實時服務器上部署Web應用程序之前,為了減少單個錯誤的輸入或缺少數據導致正在運行的服務器出現故障,需要進行測試。
測試可以根據多個標準在多個級別上進行,開發人員可以檢查Web應用是否返回了正確的狀態代碼、錯誤消息、數據等。
在部署Web應用之前,開發人員需要學習Git、GitHub的操作以及版本控制工具的使用,以使部署靈活且可擴展。
Git可以用于版本控制,通過創建多個分支,跟蹤源代碼中的更改,并使多個開發人員能夠協同工作。GitHub是一個用于版本控制和協作的代碼托管平臺,可以允許開發人員和其他人共同處理項目。GitHub操作可幫助您自動執行軟件開發工作流。單個操作是可重用的代碼段,可用于在 GitHub上生成、測試、打包或部署項目。它還可用于自動執行工作流程的任何步驟。部署完整的Web應用非常復雜。開發者還需要一個專用服務器來響應HTTP請求,并使用在線數據庫。
Harbor是一個用于存儲和分發Docker鏡像的企業級Registry服務器,通過添加一些企業必需的功能特性,例如安全、標識和管理等,擴展了開源Docker Distribution。
作為一個企業級私有Registry服務器,Harbor提供了更好的性能和安全。
提升用戶使用Registry構建和運行環境傳輸鏡像的效率。
Harbor支持安裝在多個Registry節點的鏡像資源復制,鏡像全部保存在私有Registry中, 確保數據和知識產權在公司內部網絡中管控。
另外,Harbor也提供了高級的安全特性,諸如用戶管理,訪問控制和活動審計等。
主從同步
harbor官方默認提供主從復制的方案來解決鏡像同步問題,通過復制的方式,我們可以實時將測試環境harbor倉庫的鏡像同步到生產環境harbor,類似于如下流程:
img
在實際生產運維的中,往往需要把鏡像發布到幾十或上百臺集群節點上。這時,單個Registry已經無法滿足大量節點的下載需求,因此要配置多個Registry實例做負載均衡。手工維護多個Registry實例上的鏡像,將是十分繁瑣的事情。Harbor可以支持一主多從的鏡像發布模式,可以解決大規模鏡像發布的難題:
只要往一臺Harbor上發布,鏡像就會像"仙女散花"般地同步到多個Registry中,高效可靠。
如果是地域分布較廣的集群,還可以采用層次型發布方式,比如從集團總部機房同步到分公司1機房,再從分公司1機房同步到分公司2機房:
然而單靠主從同步,仍然解決不了harbor主節點的單點問題。
雙主復制說明
所謂的雙主復制其實就是復用主從同步實現兩個harbor節點之間的雙向同步,來保證數據的一致性,然后在兩臺harbor前端頂一個負載均衡器將進來的請求分流到不同的實例中去,只要有一個實例中有了新的鏡像,就是自動的同步復制到另外的的實例中去,這樣實現了負載均衡,也避免了單點故障,在一定程度上實現了Harbor的高可用性:
這個方案有一個問題就是有可能兩個Harbor實例中的數據不一致。假設如果一個實例A掛掉了,這個時候有新的鏡像進來,那么新的鏡像就會在另外一個實例B中,后面即使恢復了掛掉的A實例,Harbor實例B也不會自動去同步鏡像,這樣只能手動的先關掉Harbor實例B的復制策略,然后再開啟復制策略,才能讓實例B數據同步,讓兩個實例的數據一致。
另外,這里還需要多吐槽一句:在實際生產使用中,主從復制十分的不靠譜!!所以這里推薦使用下面要說的這種方案。
方案說明
共享后端存儲算是一種比較標準的方案,就是多個Harbor實例共享同一個后端存儲,任何一個實例持久化到存儲的鏡像,都可被其他實例中讀取。通過前置LB進來的請求,可以分流到不同的實例中去處理,這樣就實現了負載均衡,也避免了單點故障。
本次搭建以NFS作為共享存儲存放Harbor相關data,并分離PostgreSQL與Redis為多個Harbor共同連接使用,使用Nginx做負載均衡。
如果最終生產環境集群中服務器較多,依賴做完LB的Harbor也無法完全達到需求時,可以使用如下架構,部署下級Harbor節點從主節點同步鏡像,然后再分發給生產服務器。
這個方案在實際生產環境中部署需要考慮三個問題:
1. 共享存儲的選取,Harbor的后端存儲目前支持AWS S3、Openstack Swift, Ceph等,在下面的實驗環境里,暫且直接使用nfs。
2. Session在不同的實例上共享,這個現在其實已經不是問題了,在最新的harbor中,默認session會存放在redis中,只需要將redis獨立出來即可。可以通過redis sentinel或者redis cluster等方式來保證redis的可用性。在下面的實驗環境里,暫且使用單臺redis。
3. Harbor多實例數據庫問題,這個也只需要將harbor中的數據庫拆出來獨立部署即可。讓多實例共用一個外部數據庫,數據庫的高可用也可以通過數據庫的高可用方案保證。
環境說明
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)添加內核參數
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
然后刷新內核參數
sysctl -p
4)修改Docker倉庫為國內鏡像站
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com
5)啟動Docker
systemctl enable docker && systemctl start docker
Compose
compose是Docker提供的一個命令行工具,用來定義和運行由多個容器組成的應用。使用compose,我們可以通過YAML文件聲明式的定義應用程序的各個服務,并由單個命令完成應用的創建和啟動。
由于國內政策原因,可能在海外網站上下載文件速度較慢,建議下載本地后上傳至服務器
1)下載docker-compose并賦予可執行權限
# 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 .
注意:由于我其他服務器已經存在,所以我直接拷貝了
2)安裝bash補全命令
# 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/
重新連接終端即生效
注意:由于我其他服務器已經存在,所以我直接拷貝了
服務端
1)安裝必需的RPM包
yum -y install nfs-utils rpcbind
2)創建NFS共享目錄
mkdir -p /data/harbor_data
chown nobody:nobody /data/harbor_data/
3)修改NFS服務配置文件
echo "/data/harbor_data 192.168.166.0/24(rw,sync,no_root_squash)" >> /etc/exports
4)啟動NFS服務器
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共享存儲
創建掛載目錄
mkdir /data
修改/etc/fstab配置文件加入以下內容
192.168.166.122:/data/harbor_data /data nfs defaults 0 0
mount掛載
mount -a
1)下載PostgreSQL官方YUM源配置文件包并安裝
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)初始化數據庫
/usr/pgsql-9.6/bin/postgresql96-setup initdb
4)啟動數據庫
systemctl enable postgresql-9.6 && systemctl restart postgresql-9.6
5)PostgreSQL數據庫配置
# su - postgres
-bash-4.2$ psql
psql (9.6.17)
Type "help" for help.
postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
ALTER ROLE
2、開啟遠程訪問
vi /var/lib/pgsql/9.6/data/postgresql.conf
# listen_addresses = 'localhost' 改為 listen_addresses='*'
3、信任遠程連接
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服務
systemctl restart postgresql-9.6
7)驗證服務
psql -h 192.168.166.203 -p 5432 -U postgres
8)遷移數據庫
簡要步驟如下:
# 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、進入harbor-db容器導出相關表及數據
# 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、導出數據庫
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、將數據導入至外部PostgreSQL數據庫
# 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
1)安裝redis
yum -y install redis
2) 修改配置參數
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)啟動并測試redis連接
systemctl enable redis && systemctl restart redis
redis-cli
下載Harbor離線安裝包,離線安裝包文件較大(約為:590M),建議在本地使用多線程工具下載后上傳服務器使用。
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
修改的內容有
修改完的樣例文件,如下
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運行的必要文件(環境)以及docker-compose.yml文件;執行后會通過網絡獲取Docker Image,建議提前修改好國內鏡像站加速。
./prepare
5)安裝Harbor
./install.sh
1)安裝nginx
安裝可以參考https://wiki.clay-wangzhi.com/7-nginx/1.-chu-shi-nginx#4-bian-yi-an-zhuang-nginx
這里我就不再詳細講了
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
篇幅有限,關于生產級harbor可用的搭建就介紹到這了,大家感興趣也可以自己測試一下。
后面會分享更多運維方面內容,感興趣的朋友可以關注下!
言:
隨著JavaScript的不斷發展,開發者們正在尋找更靈活和可擴展的方式來修改或擴展現有的代碼。其中一種廣泛應用的技術是"Hook",它允許開發者攔截和修改現有的函數或方法的行為。本文將詳細介紹JavaScript中的Hook技術,包括其特性、優點、缺點和使用場景,并提供示例代碼進行說明。
在JavaScript中,Hook是一種能夠攔截和修改函數或方法行為的技術。通過使用Hook,開發者可以在現有的函數執行前、執行后或者替換函數的實現邏輯。這種靈活的能力使得開發者能夠定制和擴展現有代碼的行為,而無需修改原始代碼。
示例代碼:
下面是一個使用Hook技術的示例代碼,用于在函數執行前后打印日志:
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函數是一個Hook函數,用于攔截目標函數add的執行,并在執行前后打印日志信息。通過調用hookedAdd函數,可以觸發攔截和日志輸出的過程。
結論:
通過使用Hook技術,JavaScript開發者可以靈活地修改和擴展現有代碼的行為,而無需修改原始代碼。盡管Hook技術具有一些潛在的缺點和復雜性,但在日志、調試、性能監測以及行為定制和擴展等場景中,它仍然是一個強大且有用的工具。開發者可以根據自己的需求,靈活地使用Hook技術來滿足特定的編程需求。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。