Halo, Habr! Kuring mawa ka perhatian anjeun tarjamahan tina pos:
Utusan nyaéta server proxy disebarkeun-kinerja tinggi (ditulis dina C ++) dirancang pikeun layanan individu jeung aplikasi, eta oge beus komunikasi jeung "pesawat data universal" dirancang pikeun microservice badag "jasa bolong" arsitéktur. Nalika nyiptakeunana, solusi pikeun masalah anu timbul nalika pamekaran server sapertos NGINX, HAProxy, pangimbang beban hardware sareng pangimbang beban awan dipertimbangkeun. Utusan gawé bareng unggal aplikasi tur abstracts jaringan pikeun nyadiakeun fungsionalitas umum paduli platform. Nalika sadaya lalu lintas jasa dina infrastruktur ngalir ngaliwatan bolong Utusan, janten gampang pikeun ngabayangkeun daérah masalah kalayan observasi konsisten, nyaluyukeun kinerja sakabéh, sareng nambihan fungsionalitas inti dina lokasi anu spesifik.
kasempetan
- Out-of-prosés arsitéktur: utusan mangrupakeun timer ngandung, server-kinerja tinggi nu nyokot jumlah leutik RAM. Gawéna babarengan sareng basa atanapi kerangka aplikasi naon waé.
- http/2 jeung rojongan grpc: utusan boga kelas munggaran http/2 jeung rojongan grpc pikeun sambungan asup jeung kaluar. Ieu proxy transparan ti http/1.1 ka http/2.
- Balancing Beban Canggih: utusan ngadukung fitur pangimbangan beban canggih kalebet retries otomatis, pegatna ranté, ngawatesan laju global, nyuhunkeun bayangan, balancing beban zona lokal, jsb.
- API Manajemén Konfigurasi: utusan nyayogikeun API anu kuat pikeun ngatur konfigurasi anjeun sacara dinamis.
- Observability: observability jero lalulintas L7, rojongan pituin pikeun tracing disebarkeun sarta observability of mongodb, dynamodb tur loba aplikasi sejenna.
Lengkah 1 - Conto NGINX Config
Skrip ieu nganggo file anu didamel khusus nginx.conf, dumasar kana conto lengkep ti
nginx sumber config
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;
}
}
}
Konfigurasi NGINX biasana ngagaduhan tilu elemen konci:
- Ngonpigurasikeun server NGINX, struktur log sareng fungsionalitas Gzip. Ieu ditetepkeun sacara global dina sagala hal.
- Ngonpigurasikeun NGINX pikeun nampi pamundut ka host one.example.com dina port 8080.
- Nyetel lokasi target, kumaha carana ngadamel lalulintas keur bagian béda tina URL.
Henteu sadayana konfigurasi bakal dilarapkeun ka Envoy Proxy, sareng anjeun henteu kedah ngonpigurasikeun sababaraha setélan. Utusan Proxy boga opat jenis konci, nu ngarojong infrastruktur inti ditawarkeun ku NGINX. Inti nyaéta:
- Pamirsa: Aranjeunna nangtukeun kumaha Envoy Proxy narima requests asup. Envoy Proxy ayeuna ngan ukur ngadukung pamiarsa dumasar TCP. Sakali sambungan diadegkeun, éta diteruskeun kana saringan pikeun diolah.
- saringan: Éta mangrupikeun bagian tina arsitéktur pipa anu tiasa ngolah data anu asup sareng kaluar. Fungsionalitas ieu kalebet saringan sapertos Gzip, anu ngompres data sateuacan dikirim ka klien.
- Router: Aranjeunna neraskeun lalulintas ka tujuan diperlukeun, diartikeun klaster a.
- Kluster: Aranjeunna nangtukeun titik tungtung pikeun lalulintas sarta parameter konfigurasi.
Kami bakal ngagunakeun opat komponén ieu pikeun nyiptakeun konfigurasi Envoy Proxy pikeun cocog sareng konfigurasi NGINX khusus. Tujuan utusan nyaéta pikeun damel sareng API sareng konfigurasi dinamis. Dina hal ieu, konfigurasi dasar bakal ngagunakeun statik, setélan hard-disandi ti NGINX.
Lengkah 2 - Konfigurasi NGINX
Bagian munggaran nginx.conf ngahartikeun sababaraha internal NGINX anu kedah dikonpigurasikeun.
Sambungan Pagawe
Konfigurasi di handap nangtukeun jumlah prosés worker sarta sambungan. Ieu nunjukkeun kumaha NGINX bakal skala pikeun nyumponan paménta.
worker_processes 2;
events {
worker_connections 2000;
}
Envoy Proxy ngatur alur kerja sareng sambungan ku sababaraha cara.
Utusan nyiptakeun benang pagawé pikeun unggal benang hardware dina sistem. Unggal thread worker executes a loop acara non-blocking nu tanggung jawab
- Ngadangukeun unggal pangdéngé
- Narima sambungan anyar
- Nyiptakeun saringan pikeun sambungan
- Ngolah sagala operasi I / O salila hirupna sambungan.
Kabéh processing sambungan salajengna diatur sagemblengna dina thread worker, kaasup sagala kabiasaan diteruskeun.
Pikeun unggal thread pagawe di Utusan, aya kolam renang sambungan. Jadi HTTP / 2 kolam renang sambungan ngan ngadegkeun hiji sambungan per host éksternal dina hiji waktu, lamun aya opat threads worker bakal aya opat HTTP / 2 sambungan per host éksternal dina kaayaan stabil. Ku ngajaga sagalana dina hiji thread worker, ampir kabéh kode bisa ditulis tanpa blocking, saolah-olah éta single threaded. Lamun leuwih threads worker dialokasikeun ti diperlukeun, ieu bisa ngakibatkeun memori wasted, nyieun angka nu gede ngarupakeun sambungan dianggurkeun, sarta ngurangan jumlah kali sambungan balik deui ka kolam renang.
Kanggo inpo nu leuwih lengkep mangga buka
Konfigurasi HTTP
Blok konfigurasi NGINX di handap ieu netepkeun setélan HTTP sapertos:
- Jenis mime naon anu dirojong
- Waktos Default
- Konfigurasi Gzip
Anjeun tiasa nyaluyukeun aspék ieu nganggo saringan dina Envoy Proxy, anu bakal urang bahas engké.
Lengkah 3 - Konfigurasi Server
Dina blok konfigurasi HTTP, konfigurasi NGINX netepkeun ngadangukeun dina port 8080 sareng ngabales pamenta anu asup pikeun domain. one.example.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Di jero Utusan, éta dikawasa ku Listeners.
Utusan pangdéngé
Aspék anu paling penting pikeun ngamimitian nganggo Envoy Proxy nyaéta nangtukeun pamirsa anjeun. Anjeun kedah nyiptakeun file konfigurasi anu ngajelaskeun kumaha anjeun badé ngajalankeun conto Utusan.
The snippet handap bakal nyieun hiji pangdéngé anyar jeung meungkeut ka port 8080. Konfigurasi ngabejaan Utusan Proxy mana palabuhan eta kudu meungkeut pikeun requests asup.
Envoy Proxy nganggo notasi YAML pikeun konfigurasina. Pikeun bubuka notasi ieu, tingali di dieu
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Teu kudu ngartikeun server_name, Kusabab saringan Envoy Proxy bakal nanganan ieu.
Lengkah 4 - Konfigurasi Lokasi
Nalika pamundut asup kana NGINX, blok lokasi nangtukeun kumaha ngolah sareng dimana rute lalu lintas. Dina fragmen di handap ieu, sadaya patalimarga ka loka dialihkeun ka hulu (catetan penerjemah: hulu biasana mangrupa server aplikasi) klaster ngaranna targetCluster. Kluster hulu ngahartikeun titik-titik anu kedah ngolah pamundut. Urang bakal ngabahas ieu dina lengkah saterusna.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Di Envoy, Filters ngalakukeun ieu.
Saringan Utusan
Pikeun konfigurasi statik, saringan nangtukeun cara ngolah requests asup. Dina hal ieu kami nyetél saringan anu cocog server_ngaran dina léngkah saméméhna. Nalika requests asup anjog nu cocog domain tangtu jeung ruteu, lalulintas routed ka klaster. Ieu sarua jeung NGINX konfigurasi handap-up.
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
nami utusan.http_connection_manager nyaéta saringan anu diwangun dina Envoy Proxy. saringan séjén kaasup Redis, mongo, TCP. Anjeun tiasa mendakan daptar lengkep dina
Kanggo inpo nu langkung lengkep ihwal kawijakan load balancing séjén, mangga buka
Lengkah 5 - Konfigurasi Proksi sareng Hulu
Dina NGINX, konfigurasi hulu ngahartikeun sakumpulan target server anu bakal ngolah lalu lintas. Dina hal ieu, dua klaster ditugaskeun.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Dina Utusan, ieu dikelola ku klaster.
Kluster Utusan
Sarua hulu diartikeun klaster. Dina hal ieu, host anu bakal ngalayanan lalu lintas parantos diidentifikasi. Cara diaksés host, sapertos waktos béak, dihartikeun salaku konfigurasi klaster. Hal ieu ngamungkinkeun pikeun kontrol leuwih granular leuwih aspék kayaning latency na load balancing.
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 }}
]
Nalika nganggo penemuan jasa STRICT_DNS Utusan bakal terus-terusan sareng asynchronously ngabéréskeun target DNS anu ditangtukeun. Unggal alamat IP anu dipulangkeun tina hasil DNS bakal dianggap host eksplisit dina klaster hulu. Ieu ngandung harti yén lamun pamundut balik dua alamat IP, utusan bakal nganggap yen aya dua host dina klaster, sarta duanana kudu saimbang beban. Mun host a dihapus tina hasilna, bakal utusan nganggap eta euweuh aya na bakal narik lalulintas ti sagala pools sambungan aya.
Kanggo inpormasi lengkep tingali
Lengkah 6 - Log Aksés sareng Kasalahan
Konfigurasi ahir nyaéta pendaptaran. Gantina ngadorong log kasalahan kana disk, Envoy Proxy nyandak pendekatan dumasar-awan. Sadaya log aplikasi kaluaran ka stdout и stderr.
Nalika pangguna ngadamel pamundut, log aksés janten pilihan sareng ditumpurkeun sacara standar. Pikeun ngaktipkeun log aksés pikeun pamundut HTTP, aktipkeun konfigurasi log_aksés pikeun manajer sambungan HTTP. Jalurna tiasa janten alat sapertos stdout, atanapi file dina disk, gumantung kana kabutuhan anjeun.
Konfigurasi di handap ieu bakal alihan sadaya log aksés ka stdout (catetan panarjamah urang - stdout diperlukeun ngagunakeun utusan jero docker. Lamun dipaké tanpa docker, lajeng ngaganti / dev / stdout kalawan jalur ka file log biasa). Salin snippet ka bagian konfigurasi pikeun manajer sambungan:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Hasilna kedah sapertos kieu:
- 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:
Sacara standar, Envoy ngagaduhan format string anu kalebet detil pamundut HTTP:
[%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
Hasil tina string format ieu nyaéta:
[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"
Eusi kaluaran tiasa disaluyukeun ku netepkeun widang format. Salaku conto:
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"
Garis log ogé tiasa kaluaran dina format JSON ku netepkeun lapangan json_format. Contona:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Kanggo inpo nu langkung lengkep ihwal Métodologi Pendaftaran Utusan, mangga buka
Logging sanes hiji-hijina cara pikeun meunangkeun wawasan ngeunaan gawé bareng Envoy Proxy. Éta ngagaduhan kamampuan ngalacak sareng métrik anu diwangun kana éta. Anjeun tiasa mendakan langkung seueur di
Lengkah 7 - peluncuran
Anjeun ayeuna tos migrasi konfigurasi anjeun ti NGINX ka Envoy Proxy. Léngkah terakhir nyaéta ngaluncurkeun conto Envoy Proxy pikeun nguji éta.
Jalankeun salaku pamaké
Di luhureun garis konfigurasi NGINX pamaké www www; nangtukeun ngajalankeun NGINX salaku pamaké low-hak husus pikeun ngaronjatkeun kaamanan.
Envoy Proxy nyandak pendekatan dumasar-awan pikeun ngatur anu gaduh prosés. Nalika urang ngajalankeun Envoy Proxy ngaliwatan wadahna, urang tiasa netepkeun pangguna anu ngagaduhan hak istimewa.
Ngaluncurkeun Envoy Proxy
Paréntah di handap bakal ngajalankeun Envoy Proxy ngaliwatan wadah Docker dina host. Paréntah ieu méré Utusan kamampuhan pikeun ngadéngékeun requests asup dina port 80. Sanajan kitu, sakumaha dieusian dina konfigurasi pangdéngé, utusan Proxy listens pikeun lalulintas asup dina port 8080. Hal ieu ngamungkinkeun prosés pikeun ngajalankeun salaku pamaké low-hak husus.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Tés
Kalayan proxy jalan, tés ayeuna tiasa dilakukeun sareng diolah. Paréntah cURL di handap ieu ngaluarkeun pamundut sareng header host anu didefinisikeun dina konfigurasi proxy.
curl -H "Host: one.example.com" localhost -i
Paménta HTTP bakal nyababkeun kasalahan 503. Ieu kusabab sambungan hulu teu tiasa dianggo sareng henteu sayogi. Ku alatan éta, Envoy Proxy teu boga tujuan sadia pikeun pamundut. Paréntah di handap ieu bakal ngamimitian runtuyan jasa HTTP anu cocog sareng konfigurasi anu ditetepkeun pikeun Utusan.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Kalayan jasa anu sayogi, Utusan tiasa suksés proxy lalu lintas ka tujuanana.
curl -H "Host: one.example.com" localhost -i
Anjeun kedah ningali réspon anu nunjukkeun wadah Docker anu ngolah pamundut éta. Dina log Envoy Proxy anjeun ogé kedah ningali kaluaran string aksés.
Lulugu Tanggapan HTTP tambahan
Anjeun bakal ningali headers HTTP tambahan dina headers respon tina pamundut sabenerna. Lulugu mintonkeun waktos host hulu spent ngolah pamundut teh. Ditémbongkeun dina milliseconds. Ieu mangpaat lamun klien hayang nangtukeun waktu layanan dibandingkeun latency jaringan.
x-envoy-upstream-service-time: 0
server: envoy
Konfigurasi ahir
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 }
Émbaran tambahan ti penerjemah
Parentah pikeun masang Envoy Proxy tiasa dipendakan dina situs wéb
Sacara standar, rpm teu gaduh config service systemd.
Tambahkeun config service systemd /etc/systemd/system/envoy.service:
[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
Anjeun kudu nyieun diréktori a /etc/utusan/ sarta nempatkeun config.yaml config dinya.
Aya obrolan telegram nganggo proxy utusan:
Envoy Proxy henteu ngadukung ngalayanan eusi statik. Ku kituna, saha nu bisa milih pikeun fitur:
Ngan pamaké nu kadaptar bisa ilubiung dina survey.
Naha tulisan ieu nyorong anjeun masang sareng nguji proxy utusan?
-
nuhun
-
teu
75 pamaké milih. 18 pamaké abstained.
sumber: www.habr.com