Silav Habr! Ez wergereke nivîsê radigihînim we:
Envoy serverek proxy-ya belavkirî ya bi performansa bilind e (bi C++ hatî nivîsandin) ku ji bo karûbar û serîlêdanên kesane hatîye sêwirandin, ew di heman demê de otobusek ragihandinê û "balafira daneya gerdûnî" ye ku ji bo mîmarên mîkro-xizmeta mezin "mesh-karûbar" hatî çêkirin. Dema afirandina wê, çareseriyên pirsgirêkên ku di dema pêşkeftina serverên wekî NGINX, HAProxy, hevsengên barkirina hardware û hevsengên barkirina ewr de derketine holê hatin girtin. Envoy li kêleka her serîlêdanê dixebite û torê vedigire da ku bêyî platformê fonksiyona hevpar peyda bike. Gava ku hemî seyrûsefera karûbarê di binesaziyek de di nav tevna Envoy re diherike, dîtina deverên pirsgirêkê bi çavdêriya domdar re hêsan dibe, performansa giştî xweş bike, û fonksiyona bingehîn li cîhek taybetî lê zêde bike.
Taybetmendiyên
- Mîmariya derveyî pêvajoyê: envoy serverek xweser, bi performansa bilind e ku mîqdarek piçûk RAM digire. Ew bi her zimanek an çarçoveyek serîlêdanê re dixebite.
- Piştgiriya http/2 û grpc: şandî ji bo girêdanên ketin û derketinê piştgiriya pola yekem http/2 û grpc heye. Ev ji http/1.1 heta http/2 proxyek zelal e.
- Balansa Barkirinê ya Pêşketî: nûner piştgirî dide taybetmendiyên pêşkeftî yên hevsengiya barkirinê, di nav de dubarekirina otomatîkî, şikandina zincîrê, sînorkirina rêjeya gerdûnî, siya daxwazê, hevsengkirina barkirina devera herêmî, hwd.
- API-ya Rêvebiriya Vesazkirinê: envoy ji bo birêvebirina dînamîkî ya veavakirina we API-yek bihêz peyda dike.
- Çavdêrî: Çavdêriya kûr a seyrûsefera L7, piştgiriya xwecî ji bo şopandina belavbûyî û çavdêriya mongodb, dynamodb û gelek serîlêdanên din.
Gav 1 - Mînak NGINX Config
Ev skrîpt pelek bi taybetî hatî çêkirin bikar tîne nginx.conf, li ser bingeha nimûneya tevahî ji
konfigurasyona çavkaniya nginx
user www www;
pid /var/run/nginx.pid;
worker_processes 2;
events {
worker_connections 2000;
}
http {
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
server {
listen 8080;
server_name one.example.com www.one.example.com;
access_log /var/log/nginx.access_log main;
error_log /var/log/nginx.error_log info;
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Veavakirinên NGINX bi gelemperî sê hêmanên sereke hene:
- Veavakirina servera NGINX, avahiya têketinê û fonksiyona Gzip. Ev di hemî rewşan de li seranserê cîhanê tête diyar kirin.
- Veavakirina NGINX ji bo pejirandina daxwazên mêvandar one.example.com li ser porta 8080.
- Sazkirina cîhê armancê, meriv çawa seyrûseferê ji bo beşên cûda yên URL-ê birêve dibe.
Hemî veavakirin dê ji bo Envoy Proxy derbas nebe, û hûn ne hewce ne ku hûn hin mîhengan mîheng bikin. Envoy Proxy heye çar cureyên sereke, ku binesaziya bingehîn a ku ji hêla NGINX ve hatî pêşkêş kirin piştgirî dike. Ya bingehîn ev e:
- Guhdar: Ew diyar dikin ka Envoy Proxy çawa daxwazên gihîştî qebûl dike. Envoy Proxy niha tenê guhdarên TCP-based piştgirî dike. Dema ku têkiliyek hate saz kirin, ew ji bo pêvajoyek berbi komek parzûnan tê derbas kirin.
- Parzûn: Ew beşek ji mîmariya boriyê ne ku dikarin daneyên hatin û derketinê pêvajoyê bikin. Vê fonksiyonê fîlterên wekî Gzip-ê vedihewîne, ku berî şandina wê ji xerîdar re daneyan berhev dike.
- Routers: Ew seyrûseferê berbi cîhê pêdivî, ku wekî komek hatî destnîşan kirin, dişînin.
- Komel: Ew ji bo parametreyên trafîkê û vesazkirinê xala dawiyê diyar dikin.
Em ê van çar hêmanan bikar bînin da ku mîhengek Envoy Proxy biafirînin da ku bi vehengek taybetî ya NGINX-ê re hevber bikin. Armanca Envoy ew e ku bi API û veavakirina dînamîkî re bixebite. Di vê rewşê de, veavakirina bingehîn dê mîhengên statîk, hişk-kodkirî yên ji NGINX bikar bîne.
Gav 2 - Veavakirina NGINX
Beşek yekem nginx.conf hin hundurên NGINX-ê yên ku divê bêne mîheng kirin diyar dike.
Têkiliyên Karker
Veavakirina jêrîn hejmara pêvajoyên karker û girêdan diyar dike. Ev destnîşan dike ka NGINX dê çawa pîvanê bide da ku daxwazê bicîh bîne.
worker_processes 2;
events {
worker_connections 2000;
}
Envoy Proxy karûbar û girêdan bi awayên cihêreng îdare dike.
Envoy ji bo her teşeya hardware ya li ser pergalê xêzek karker diafirîne. Her Mijara xebatkar pêlek bûyerek ne-astengker ku berpirsiyar e dimeşîne
- Guhdarîkirina her guhdarekî
- Qebûlkirina girêdanên nû
- Afirandina komek fîlteran ji bo girêdanê
- Hemî operasyonên I/O di heyama pêwendiyê de pêvajoyê bikin.
Hemî pêvajoyek pêwendiya pêvek bi tevahî di xêza xebatkar de, tevî her tevgerek şandinê, tê rêve kirin.
Ji bo her xêza karkerê li Envoy, hewzek pêwendiyê heye. Ji ber vê yekê hewzên pêwendiya HTTP/2 tenê yek pêwendiyek ji her mêvandarê biyanî re yek carî saz dikin, heke çar mijarên xebatkar hebin dê di rewşek aram de çar girêdanên HTTP/2 ji her mêvandarê derveyî re hebin. Bi girtina her tiştî di yek mijara xebatkar de, hema hema hemî kod dikare bêyî astengkirinê were nivîsandin, mîna ku ew yek xêz be. Ger ji hewcedariyê bêtir mijarên xebatkar werin veqetandin, ev dikare bibe sedema windabûna bîranînê, afirandina hejmareke mezin ji girêdanên bêkar, û kêmkirina hejmara carên ku girêdan vedigerin hewzê.
Ji bo bêtir agahdarî biçin
Veavakirina HTTP
Bloka veavakirina NGINX ya jêrîn mîhengên HTTP-ê wekî:
- Çi cureyên mimê têne piştgirî kirin
- Demjimêriyên Bingehîn
- Veavakirina Gzip
Hûn dikarin van hêmanan bi karanîna fîlterên di Envoy Proxy de, ya ku em ê paşê nîqaş bikin, xweş bikin.
Gav 3 - Veavakirina Server
Di bloka veavakirina HTTP de, veavakirina NGINX diyar dike ku li porta 8080 guhdarî bike û bersivê bide daxwazên hatina domanan. one.example.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Di hundurê Envoy de, ew ji hêla Guhdaran ve tê kontrol kirin.
Guhdarên şandî
Aliyê herî girîng ê destpêkirina bi Envoy Proxy re destnîşankirina guhdarên we ye. Pêdivî ye ku hûn pelek vesazkirinê biafirînin ku diyar dike ka hûn çawa dixwazin mînaka Envoy bimeşînin.
Parçeya jêrîn dê guhdarek nû biafirîne û wê bi porta 8080-ê ve girêbide. Veavakirin ji Envoy Proxy re vedibêje ku divê ew ji bo daxwazên hatinê bi kîjan portan ve girêde.
Envoy Proxy ji bo veavakirina xwe nîşana YAML bikar tîne. Ji bo danasîna vê nîşankirinê, li vir binêre
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Ne hewce ye ku diyar bike server_name, ji ber ku fîlterên Envoy Proxy dê vê yekê birêve bibin.
Gav 4 - Veavakirina Cihê
Dema ku daxwazek tê nav NGINX, bloka cîhê diyar dike ka meriv çawa pêvajoy dike û li ku derê rêwîtiyê rêve dike. Di beşê jêrîn de, hemî seyrûsefera malperê ji komeke jorîn (têbînîya wergêr: jor bi gelemperî serverek serîlêdanê ye) tê veguheztin. targetCluster. Grûba jorîn girêkên ku divê daxwazê bişopînin diyar dike. Em ê di gava pêş de vê yekê nîqaş bikin.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Li Envoy, Parzûnan vê yekê dike.
Parzûnên Envoy
Ji bo veavakirinek statîk, fîlter diyar dikin ka meriv çawa daxwazên hatîn pêvajoyê dike. Di vê rewşê de, me fîlterên ku li hev dikin destnîşan dikin server_names di gava berê de. Dema ku daxwazên hatinê digihîjin ku hin doman û rêgezan li hev dikin, seyrûsefer ber bi komê ve tê rêve kirin. Ev hevwateya veavakirina NGINX-a jêr-jor e.
Copy to Editor filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains:
- "one.example.com"
- "www.one.example.com"
routes:
- match:
prefix: "/"
route:
cluster: targetCluster
http_filters:
- name: envoy.router
nav şandî.http_connection_manager Parzûnek çêkirî ya di Envoy Proxy de ye. Parzûnên din jî hene Redis, mongo, TCP. Hûn dikarin navnîşa tevahî li vir bibînin
Ji bo bêtir agahdarî li ser polîtîkayên din ên hevsengiya barkirinê, biçin
Gav 5 - Veavakirina Proxy û Upstream
Di NGINX de, veavakirina jorîn komek pêşkêşkerên armancê ku dê seyrûseferê pêvajoyê bike diyar dike. Di vê rewşê de, du kom hatin destnîşankirin.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Di Envoy de, ev ji hêla koman ve tê rêvebirin.
Komên şandî
Wekheviya jorîn wekî koman tê pênase kirin. Di vê rewşê de, mazûvanên ku dê xizmeta trafîkê bikin hatine destnîşankirin. Awayê gihîştina mazûvanan, mîna dema derbasbûnê, wekî veavakirina komê tê pênase kirin. Ev rê dide kontrolkirina hûrgelê ya li ser aliyên wekî derengbûn û hevsengkirina barkirinê.
Copy to Editor clusters:
- name: targetCluster
connect_timeout: 0.25s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [
{ socket_address: { address: 172.18.0.3, port_value: 80 }},
{ socket_address: { address: 172.18.0.4, port_value: 80 }}
]
Dema ku vedîtina karûbarê bikar tîne STRICT_DNS Envoy dê bi domdarî û asynkronî armancên DNS yên diyarkirî çareser bike. Her navnîşana IP-ya ku ji encama DNS hatî vegerandin dê di koma jorîn de wekî mêvandarek eşkere were hesibandin. Ev tê vê wateyê ku ger daxwazek du navnîşanên IP-ê vegerîne, Envoy dê bihesibîne ku di komê de du mêvandar hene, û divê her du jî hevseng bin. Ger mêvandarek ji encamê were derxistin, Envoy dê bihesibîne ku ew êdî tune ye û dê seyrûseferê ji hewzên pêwendiya heyî bikişîne.
Ji bo bêtir agahdarî binêrin
Gav 6 - Têketin û Xeletî
Veavakirina dawîn qeydkirinê ye. Li şûna ku têketinên xeletiyê li dîskê bikişîne, Envoy Proxy nêzîkatiyek li ser ewr digire. Hemî têketinên serîlêdanê têne derxistin stdout и stderr.
Dema ku bikarhêner daxwazek dikin, têketinên gihîştinê vebijarkî ne û ji hêla xwerû ve neçalak in. Ji bo çalakkirina têketinên gihîştinê ji bo daxwazên HTTP, veavakirinê çalak bikin access_log ji bo rêveberê girêdana HTTP. Rê dikare bibe amûrek wekî stdout, an pelek li ser dîskê, li gorî hewcedariyên we ve girêdayî ye.
Veavakirina jêrîn dê hemî têketinên gihîştinê beralî bike stdout (Têbînîya wergêr - stdout ji bo bikaranîna envoy di hundurê dokerê de pêdivî ye. Ger bêyî docker were bikar anîn, wê hingê /dev/stdout bi riya pelê têketinek birêkûpêk veguherîne). Ji bo gerînendeyê pêwendiyê perçeyê li beşa veavakirinê kopî bikin:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Divê encam bi vî rengî xuya bikin:
- name: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
route_config:
Bi xwerû, Envoy xwedan rêzek formatek e ku hûrguliyên daxwaza HTTP-ê vedihewîne:
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n
Encama vê rêzika formatê ev e:
[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"
Naveroka encam dikare bi danîna qada formatê ve were xweş kirin. Bo nimûne:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n"
Rêza têketinê jî bi danîna zeviyê dikare di formata JSON de were derxistin json_format. Bo nimûne:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Ji bo bêtir agahdarî li ser Rêbaza Qeydkirina Envoyî, biçin
Têketin ne awayê yekane ye ku meriv têgihîştina bi Envoy Proxy re bixebite. Ew kapasîteyên şopandin û metrîkên pêşkeftî di nav xwe de çêkiriye. Hûn dikarin li ser bêtir fêr bibin
Gav 7 - Destpêkirin
We niha veavakirina xwe ji NGINX koçî Envoy Proxy kiriye. Gava paşîn ev e ku meriv mînakek Envoy Proxy bide destpêkirin da ku wê ceribandine.
Wekî bikarhêner bixebite
Li serê xeta veavakirina NGINX bikarhêner www www; diyar dike ku NGINX wekî bikarhênerek kêm-îmtiyaz bimeşîne da ku ewlehiyê baştir bike.
Envoy Proxy ji bo birêvebirina ku xwediyê pêvajoyek e, rêgezek ewr-based digire. Dema ku em Envoy Proxy-ê di nav konteynerê de dimeşînin, em dikarin bikarhênerek kêm-îmtiyaz destnîşan bikin.
Destpêkirina Envoy Proxy
Fermana jêrîn dê Envoy Proxy bi navgîniyek Docker-ê ya li ser mêvandar bimeşîne. Ev ferman îmkanê dide Envoy ku li ser porta 80-ê li daxwazên hatinê guhdarî bike. Lêbelê, wekî ku di veavakirina guhdaran de hatî destnîşan kirin, Envoy Proxy li seyrûsefera hatina porta 8080-ê guhdarî dike. Ev dihêle ku pêvajo wekî bikarhênerek kêm-îmtiyaz bimeşîne.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Îmtîhanê
Bi xebitandina proxy re, niha ceribandin dikarin bêne çêkirin û pêvajo kirin. Fermana cURL ya jêrîn bi sernavê mêvandar a ku di veavakirina proxy de hatî destnîşan kirin daxwazek derdixe.
curl -H "Host: one.example.com" localhost -i
Daxwaza HTTP dê bibe sedema xeletiyek 503. Ev ji ber ku girêdanên jorîn naxebitin û ne berdest in. Ji ber vê yekê, Envoy Proxy ji bo daxwazê cîhên berdest tune. Fermana jêrîn dê rêzek karûbarên HTTP-ê dest pê bike ku bi veavakirina ku ji bo Envoy hatî destnîşankirin li hev dikin.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Bi karûbarên berdest, Envoy dikare bi serfirazî seyrûsefera berbi cîhê xwe veguhezîne.
curl -H "Host: one.example.com" localhost -i
Pêdivî ye ku hûn bersivek bibînin ku destnîşan dike ka kîjan konteynera Docker daxwazê pêvajo kiriye. Di têketinên Envoy Proxy de divê hûn di heman demê de encamek rêzika gihîştinê jî bibînin.
Sernavên Bersiva HTTP-ê yên Zêde
Hûn ê di sernavên bersivê yên daxwaza rastîn de sernavên HTTP-ê yên din bibînin. Sernav dema ku mêvandarê jorîn ji bo pêkanîna daxwazê derbas kiriye nîşan dide. Di millisecon de tê îfade kirin. Heke xerîdar bixwaze dema karûbarê li gorî derengiya torê diyar bike ev bikêr e.
x-envoy-upstream-service-time: 0
server: envoy
Veavakirina dawî
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains:
- "one.example.com"
- "www.one.example.com"
routes:
- match:
prefix: "/"
route:
cluster: targetCluster
http_filters:
- name: envoy.router
clusters:
- name: targetCluster
connect_timeout: 0.25s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [
{ socket_address: { address: 172.18.0.3, port_value: 80 }},
{ socket_address: { address: 172.18.0.4, port_value: 80 }}
]
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 0.0.0.0, port_value: 9090 }
Agahiyên zêde ji wergêr
Talîmatên ji bo sazkirina Envoy Proxy li ser malperê têne dîtin
Ji hêla xwerû ve, rpm xwedan mîhengek karûbarê pergalê nîne.
Veavakirina karûbarê systemd /etc/systemd/system/envoy.service zêde bike:
[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
After=network-online.target
Requires=envoy-auth-server.service
Wants=nginx.service
[Service]
User=root
Restart=on-failure
ExecStart=/usr/bin/envoy --config-path /etc/envoy/config.yaml
[Install]
WantedBy=multi-user.target
Pêdivî ye ku hûn pelrêçek /etc/envoy/ biafirînin û konfigurasyona config.yaml têxin wir.
Danûstandinek telegramê bi karanîna nûnerê nûner heye:
Envoy Proxy pêşkêşkirina naveroka statîk piştgirî nake. Ji ber vê yekê, kî dikare ji bo taybetmendiyê deng bide:
Tenê bikarhênerên qeydkirî dikarin beşdarî anketê bibin.
Ma vê postê we teşwîq kir ku hûn nûnerê nûnerê saz bikin û ceribandin?
-
erê
-
na
75 bikarhêneran deng dan. 18 bikarhêner jî betal bûn.
Source: www.habr.com