Hello everyone, kanca!
* Artikel iki adhedhasar bengkel terbuka REBRAIN & Yandex.Cloud, yen sampeyan luwih seneng nonton video, sampeyan bisa nemokake ing link iki -
Bubar kita duwe kesempatan kanggo tutul Yandex.Cloud langsung. Amarga kita pengin ndemek dawa lan rapet, kita langsung nilar ide ngluncurake blog wordpress sing prasaja kanthi basis awan - banget mboseni. Sawise sawetara pamikiran, kita mutusake kanggo nyebarake sing padha karo arsitektur produksi layanan kanggo nampa lan nganalisa acara ing mode wektu nyata.
Aku pancen yakin manawa mayoritas bisnis online (lan ora mung) ngumpulake informasi babagan pangguna lan tumindak kanthi cara siji utawa liyane. Paling ora, iki perlu kanggo nggawe keputusan tartamtu - umpamane, yen sampeyan ngatur game online, sampeyan bisa ndeleng statistik babagan level pangguna sing paling kerep macet lan mbusak game sampeyan. Utawa ngapa pangguna ninggalake situs sampeyan tanpa tuku apa-apa (halo, Yandex.Metrica).
Dadi, crita kita: carane kita nulis aplikasi ing golang, dites kafka vs rabbitmq vs yqs, nulis data streaming menyang kluster Clickhouse lan visualized data nggunakake yandex datalens. Alami, kabeh iki dibuwang karo kesenengan infrastruktur ing wangun docker, terraform, gitlab ci lan, mesthi, prometheus. Ayo budal!
Aku arep langsung nuduhake yen kita ora bakal bisa nyetel kabeh ing siji lungguh - kanggo iki kita kudu sawetara artikel ing seri. A sethitik babagan struktur:
Bagian 1 (sampeyan maca). Kita bakal nemtokake spesifikasi teknis lan arsitektur solusi, lan uga nulis aplikasi ing golang.
Part 2. We upload aplikasi kita kanggo produksi, nggawe keukur lan nyoba mbukak.
Part 3. Ayo dadi nyoba kanggo mangerteni apa kita kudu nyimpen pesen ing buffer, ora ing file, lan uga mbandhingaké layanan antrian kafka, rabbitmq lan yandex.
Part 4. Kita bakal masang kluster Clickhouse, nulis streaming kanggo transfer data saka buffer ana, lan nyiyapake visualisasi ing datalens.
Part 5. Ayo kabeh infrastruktur supaya - ngatur ci / cd nggunakake gitlab ci, sambungake pemantauan lan panemuan layanan nggunakake prometheus lan konsul.
TK
Pisanan, ayo ngrumusake spesifikasi teknis - apa sing dikarepake minangka asil.
- Kita pengin duwe titik pungkasan kaya events.kis.im (kis.im minangka domain tes sing bakal digunakake ing kabeh artikel) sing kudu nampa acara nggunakake HTTPS.
- Acara iku prasaja json kaya: {"event": "view", "os": "linux", "browser": "chrome"}. Ing tataran pungkasan kita bakal nambah sethitik liyane lapangan, nanging ora muter peran gedhe. Yen sampeyan pengin, sampeyan bisa ngalih menyang protobuf.
- Layanan kasebut kudu bisa ngolah 10 acara per detik.
- Sampeyan kudu bisa skala horisontal - mung kanthi nambah conto anyar menyang solusi kita. Lan luwih becik yen kita bisa mindhah ngarep menyang geolokasi sing beda kanggo nyuda latensi nalika njaluk klien.
- Toleransi kesalahan. Solusi kasebut kudu cukup stabil lan bisa tahan kegagalan bagean apa wae (nganti jumlah tartamtu, mesthi).
arsitektur
Umumé, kanggo jinis tugas iki, arsitektur klasik wis suwe diciptakake sing ngidini skala efektif. Tokoh kasebut nuduhake conto solusi kita.

Dadi, apa sing kita duwe:
1. Ing sisih kiwa ana piranti sing ngasilake macem-macem acara, yaiku ngliwati level pemain ing game ing smartphone utawa nggawe pesenan ing toko online liwat browser biasa. Acara, kaya sing ditemtokake ing spesifikasi teknis, yaiku json sing prasaja sing dikirim menyang titik pungkasan - events.kis.im.
2. Rong server pisanan minangka penyeimbang sing prasaja, tugas utama yaiku:
- Terus kasedhiya. Kanggo iki, sampeyan bisa nggunakake, contone, keepalived, sing bakal ngalih IP virtual antarane simpul yen ana masalah.
- Mungkasi TLS. Ya, kita bakal mungkasi TLS. Kaping pisanan, supaya solusi kita tundhuk karo syarat teknis, lan nomer loro, supaya bisa ngilangi beban nalika nggawe sambungan sing dienkripsi saka server backend kita.
- Balance panjalukan mlebu menyang server backend kasedhiya. Tembung kunci ing kene kasedhiya. Adhedhasar iki, kita ngerti manawa load balancer kudu bisa ngawasi server kita nganggo aplikasi lan mungkasi ngimbangi lalu lintas menyang simpul sing gagal.
3. Sawise balancers, kita duwe server aplikasi, kang aplikasi cukup prasaja dibukak. Sampeyan kudu bisa nampa panjalukan sing mlebu liwat HTTP, validasi json sing dikirim lan sijine data ing buffer.
4. Kafka ditampilake minangka buffer ing diagram, sanajan, mesthi, layanan liyane padha bisa digunakake ing tingkat iki. Kita bakal mbandhingake Kafka, rabbitmq lan yqs ing artikel katelu.
5. Titik penultimate arsitektur kita Clickhouse - database columnar sing ngidini nyimpen lan Processing jumlah ageng data. Ing tingkat iki, kita kudu nransfer data saka buffer menyang sistem panyimpenan dhewe (liyane ing artikel 4).
Skema iki ngidini kita ngukur saben lapisan kanthi horisontal kanthi mandiri. Yen server backend ora bisa nangani, kita bakal nambah liyane - sawise kabeh, iku aplikasi stateless, lan mulane, iki bisa rampung ing paling otomatis. Yen buffer ing wangun Kafka ora bisa nangani, kita bakal nambah server liyane lan nransfer sawetara partisi topik kanggo wong-wong mau. Yen Clickhouse ora bisa nangani, iku mokal :) Nyatane, kita uga bakal nambah server liyane lan shard data.
Contone, yen sampeyan pengin ngetrapake bagean opsional saka spesifikasi teknis lan nggawe skala ing geolokasi sing beda-beda, mula ora ana sing luwih gampang:

Ing saben geolocation, kita masang load balancer karo aplikasi lan kafka. Umumé, 2 server aplikasi, 3 simpul kafka lan penyeimbang awan, contone, cloudflare, sing bakal mriksa kasedhiyan simpul aplikasi lan panjaluk imbangan kanthi geolokasi adhedhasar alamat IP asli klien, cukup. Mangkono, data sing dikirim dening klien Amerika bakal mlebu ing server Amerika. Lan data saka Afrika - ing Afrika.
Banjur kabeh gampang banget - kita nggunakake alat pangilon saka set Kafka lan nyalin kabeh data saka kabeh lokasi menyang pusat data pusat sing ana ing Rusia. Ing njero, kita nganalisa data lan nulis menyang Clickhouse kanggo visualisasi sabanjure.
Dadi, kita wis ngatur arsitektur - ayo miwiti goyangake Yandex.Cloud!
Nulis aplikasi
Sadurunge Cloud, kita isih kudu sabar sethithik lan nulis layanan sing cukup prasaja kanggo ngolah acara sing bakal teka. Kita bakal nggunakake golang, amarga wis bukti banget minangka basa kanggo nulis aplikasi jaringan.
Sawise mbuwang wektu siji jam (bisa uga sawetara jam), kita entuk kaya iki: .
Apa poin utama sing arep dakcathet ing kene:
1. Nalika miwiti aplikasi, sampeyan bisa nemtokake loro panji. Siji tanggung jawab kanggo port sing bakal kita ngrungokake panjaluk http sing mlebu (-addr). Kapindho kanggo alamat server kafka ing ngendi kita bakal ngrekam acara (-kafka):
addr = flag.String("addr", ":8080", "TCP address to listen to")
kafka = flag.String("kafka", "127.0.0.1:9092", "Kafka endpoints”)2. Aplikasi kasebut nggunakake perpustakaan sarama () kanggo ngirim pesen menyang kluster kafka. Kita langsung nyetel setelan sing ngarahake kacepetan pangolahan maksimal:
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true3. Aplikasi kita uga duwe klien prometheus sing dibangun, sing ngumpulake macem-macem metrik, kayata:
- nomer panjalukan kanggo aplikasi kita;
- nomer kasalahan nalika nglakokaké panjalukan (ora bisa maca panjalukan kirim, rusak json, ora bisa nulis kanggo kafka);
- wektu kanggo proses siji request saka klien, kalebu wektu kanggo nulis pesen kanggo Kafka.
4. Telung titik pungkasan sing ditangani aplikasi kita:
- / status — mung bali ok kanggo nuduhake yen kita urip. Sanajan sampeyan bisa nambah sawetara mriksa, kayata kasedhiyan kluster kafka.
- /metrik - iki minangka klien url prometheus sing bakal digunakake kanggo ngasilake metrik sing wis diklumpukake.
- / post - titik pungkasan utama ing ngendi panjaluk POST karo json ing njero bakal teka. Aplikasi kita mriksa json kanggo validitas lan yen kabeh ok - nulis data menyang kluster kafka.
Aku bakal ngomong yen kode ora becik - bisa (lan kudu!) Apik. Contone, sampeyan bisa mungkasi nggunakake dibangun ing net / http lan ngalih menyang http cepet luwih cepet. Utawa sampeyan bisa entuk wektu pangolahan lan sumber daya CPU kanthi mindhah mriksa validitas json menyang tahap sabanjure - nalika data ditransfer saka buffer menyang kluster clickhouse.
Saliyane ing sisih pangembangan masalah kasebut, kita langsung mikir babagan infrastruktur masa depan lan mutusake kanggo nyebarake aplikasi liwat docker. Dockerfile pungkasan kanggo mbangun aplikasi yaiku . Sakabèhé, iku cukup prasaja, mung bab aku kaya kanggo nggawa metu iku multistage mbangun, kang ngijini kita kanggo ngurangi gambar final saka wadhah kita.
Langkah pisanan ing awan
Kaping pisanan, ndhaftar ing . Sawise ngisi kabeh kolom sing dibutuhake, kita bakal nggawe akun lan diwenehi hibah kanggo jumlah dhuwit tartamtu, sing bisa digunakake kanggo nguji layanan awan. Yen sampeyan pengin mbaleni kabeh langkah saka artikel kita, hibah iki kudu cukup kanggo sampeyan.
Sawise registrasi, awan sing kapisah lan direktori standar bakal digawe kanggo sampeyan, ing ngendi sampeyan bisa miwiti nggawe sumber daya awan. Umumé, ing Yandex.Cloud, hubungan sumber daya katon kaya iki:

Sampeyan bisa nggawe sawetara awan kanggo siji akun. Lan ing njero awan, nggawe direktori sing beda kanggo proyek perusahaan sing beda. Sampeyan bisa maca liyane babagan iki ing dokumentasi - . Miturut cara, aku bakal kerep ngrujuk ing ngisor iki ing teks. Nalika aku nyiyapake kabeh infrastruktur saka ngeruk, dokumentasi mbantu kula metu luwih saka sapisan, supaya aku maringi pitutur sampeyan sinau iku.
Kanggo ngatur méga, sampeyan bisa nggunakake antarmuka web utawa utilitas konsol - yc. Instalasi ditindakake nganggo siji prentah (kanggo Linux lan Mac OS):
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bashYen sistem keamanan internal sampeyan bakal edan babagan mbukak skrip saka Internet, sepisanan, sampeyan bisa mbukak skrip lan maca, lan nomer loro, kita mbukak ing pangguna - tanpa hak root.
Yen sampeyan pengin nginstal klien kanggo windows, sampeyan bisa nggunakake instruksi kasebut banjur kaleksanan yc initkanggo ngatur kanthi lengkap:
vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.
Please enter OAuth token:
Please select cloud to use:
[1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
[2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
[1] default (id = b1g5r6h11knotfr8vjp7)
[2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
[1] ru-central1-a
[2] ru-central1-b
[3] ru-central1-c
[4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $Ing asas, proses kasebut ora rumit - pisanan sampeyan kudu entuk token oauth kanggo ngatur awan, pilih awan lan folder sing bakal digunakake.
Yen sampeyan duwe sawetara akun utawa folder ing siji awan, sampeyan bisa nggawe profil tambahan kanthi setelan sing kapisah liwat yc config profil nggawe lan ngalih ing antarane.
Saliyane cara ing ndhuwur, tim Yandex.Cloud nulis sing apik banget kanggo ngatur sumber daya awan. Kanggo bageanku, aku wis nyiapake repositori git ing ngendi aku wis nerangake kabeh sumber daya sing bakal digawe ing artikel kasebut - . Kita kasengsem ing cabang master, ayo klone sacara lokal:
vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/Kabeh variabel utama sing digunakake ing terraform ditulis ing file main.tf. Kanggo miwiti, gawe file private.auto.tfvars ing folder terraform kanthi isi ing ngisor iki:
# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""Kabeh variabel bisa dijupuk saka dhaptar konfigurasi yc, amarga kita wis ngatur sarana console. Aku nyaranake nambah private.auto.tfvars kanggo .gitignore langsung, supaya ora sengaja nerbitaké data pribadi.
Ing private.auto.tfvars kita uga nemtokake data saka Cloudflare - kanggo nggawe cathetan dns lan proxy domain utama events.kis.im menyang server kita. Yen sampeyan ora pengin nggunakake cloudflare, banjur mbusak initialization saka panyedhiya cloudflare ing main.tf lan file dns.tf, kang tanggung jawab kanggo nggawe cathetan dns perlu.
Ing karya kita, kita bakal nggabungake kabeh telung cara - antarmuka web, sarana konsol, lan terraform.
Jaringan virtual
Jujur, langkah iki bisa dilewati, amarga nalika nggawe awan anyar, jaringan sing kapisah lan 3 subnet bakal digawe kanthi otomatis kanggo sampeyan - siji kanggo saben zona kasedhiyan. Nanging aku isih pengin nggawe jaringan sing kapisah kanthi alamat dhewe kanggo proyek kita. Skema umum operasi jaringan ing Yandex.Cloud ditampilake ing gambar ing ngisor iki (sajujure dijupuk saka )

Dadi, sampeyan nggawe jaringan umum ing ngendi sumber daya bisa saling komunikasi. Kanggo saben zona kasedhiyan, subnet kanthi alamat dhewe digawe lan disambungake menyang jaringan umum. Akibaté, kabeh sumber maya ing njero bisa komunikasi, sanajan ana ing zona kasedhiyan sing beda. Sumber daya sing disambungake menyang jaringan awan sing beda-beda mung bisa ndeleng liwat alamat eksternal. Ngomong-ngomong, kepiye sihir iki bisa digunakake ing njero, .
Nggawe jaringan diterangake ing file network.tf saka repositori. Ing kana kita nggawe siji internal jaringan pribadi umum lan nyambungake telung subnet ing zona kasedhiyan sing beda - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24).
Miwiti terraform lan nggawe jaringan:
vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c
... skipped ...
Plan: 4 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.apik tenan! Kita wis mbangun jaringan lan saiki wis siyap nggawe layanan internal.
Nggawe mesin virtual
Kanggo nguji aplikasi kasebut, kita mung kudu nggawe rong mesin virtual - sing pisanan dibutuhake kanggo mbangun lan mbukak aplikasi kasebut, sing kapindho - kanggo mbukak kafka, sing bakal digunakake kanggo nyimpen pesen sing mlebu. Lan kita bakal nggawe mesin liyane ing ngendi kita bakal ngatur prometheus kanggo ngawasi aplikasi kasebut.
Mesin virtual bakal dikonfigurasi nggunakake ansible, supaya sadurunge mbukak terraform, priksa manawa sampeyan duwe salah siji saka versi paling anyar saka ansible. Lan nginstal peran sing dibutuhake karo galaksi ansible:
vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $Ing njero folder ansible ana conto file konfigurasi .ansible.cfg sing dakgunakake. Bisa uga migunani.
Sadurunge nggawe mesin virtual, priksa manawa sampeyan duwe ssh-agen mlaku lan tombol ssh ditambahake, yen ora, terraform ora bakal bisa nyambung menyang mesin sing digawe. Mesthi, aku nemoni bug ing os x: . Kanggo nyegah kedadeyan kasebut, tambahake variabel cilik menyang env sadurunge mbukak Terraform:
vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YESIng folder terraform kita nggawe sumber daya sing dibutuhake:
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
... skipped ...
Plan: 3 to add, 0 to change, 0 to destroy.
... skipped ...Yen kabeh wis apik (lan mesthine), mula kita bakal duwe telung mesin virtual:
- mbangun - mesin kanggo testing lan mbangun aplikasi. Docker diinstal kanthi otomatis dening ansible.
- ngawasi — mesin kanggo ngawasi — prometheus & grafana dipasang ing. Login / sandi standar: admin / admin
- kafka minangka mesin cilik sing dipasang kafka, bisa diakses ing port 9092.
Ayo priksa manawa kabeh ana ing papan:
vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
| ID | NAME | ZONE ID | STATUS | EXTERNAL IP | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build | ru-central1-a | RUNNING | 84.201.132.3 | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+ Sumber daya wis ana, lan saka kene kita bisa ngekstrak alamat IP. Nang endi wae ing ngisor iki aku bakal nggunakake alamat IP kanggo nyambungake liwat ssh lan nguji aplikasi kasebut. Yen sampeyan duwe akun ing cloudflare sing disambungake menyang terraform, gunakake jeneng DNS sing anyar digawe.
Miturut cara, nalika digawe, mesin virtual diwenehi IP internal lan jeneng DNS internal, supaya sampeyan bisa ngakses server ing jaringan kanthi jeneng:
ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 msKita butuh iki kanggo nemtokake titik pungkasan karo kafk menyang aplikasi kasebut.
Nggawe aplikasi
Apik banget, kita duwe server, kita duwe aplikasi - sing isih ana yaiku mbangun lan nerbitake. Kita bakal nggunakake mbangun Docker biasa kanggo mbangun, lan minangka panyimpenan gambar, kita bakal nggunakake layanan Yandex - pendaptaran wadah. Nanging dhisik dhisik.
Kita nyalin aplikasi menyang mesin mbangun, mlebu liwat ssh lan mbangun gambar:
vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ ubuntu@84.201.132.3:app/
... skipped ...
sent 3849 bytes received 70 bytes 7838.00 bytes/sec
total size is 3644 speedup is 0.93
vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon 6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...
Successfully built 9760afd8ef65
Successfully tagged app:latestSetengah proyek wis rampung - saiki kita bisa nyoba fungsi aplikasi kanthi mbukak lan ngarahake menyang kafka:
ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>
С локальной машинки можно отправить тестовый event и посмотреть на ответ:
<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41
{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $Aplikasi nanggapi kanthi sukses nulis lan indikasi ID partisi lan ngimbangi ngendi pesen kasebut ditampa. Siji-sijine sing kudu ditindakake yaiku nggawe registri ing Yandex.Cloud lan upload gambar kita ing kana (carane nggunakake telung baris diterangake ing file registry.tf). Kita nggawe panyimpenan:
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events
... skipped ...
Plan: 1 to add, 0 to change, 0 to destroy.
... skipped ...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.Ana sawetara cara kanggo otentikasi ing registri wadhah - nggunakake token oauth, token iam utawa kunci akun layanan. Rincian liyane babagan cara kasebut ana ing dokumentasi . Kita bakal nggunakake kunci akun layanan, supaya kita nggawe akun:
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher
... skipped ...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.Saiki sing isih ana yaiku nggawe kunci:
vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048Kita nampa informasi babagan id panyimpenan, transfer kunci lan mlebu:
vozerov@mba:~/events/terraform (master) $ scp key.json ubuntu@84.201.132.3:
key.json 100% 2392 215.1KB/s 00:00
vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
ubuntu@build:~$Kanggo mbukak gambar menyang registri, kita butuh registri wadhah ID, kita njupuk saka utilitas yc:
vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"Sawise iku, kita menehi tag gambar kanthi jeneng anyar lan upload:
ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946Kita bisa verifikasi manawa gambar wis kasil dimuat:
vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
| ID | NAME |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+Miturut cara, yen sampeyan nginstal utilitas yc ing mesin Linux, sampeyan bisa nggunakake printah kasebut
yc container registry configure-dockerkanggo ngatur docker.
kesimpulan
Kita wis nindakake akeh kerja keras lan minangka asil:
- We teka munggah karo arsitektur layanan mangsa.
- Kita nulis aplikasi ing golang sing ngetrapake logika bisnis kita.
- Kita diklumpukake lan diwutahake menyang registri wadhah pribadi.
Ing bagean sabanjure, kita bakal pindhah menyang barang sing menarik - kita bakal nyurung aplikasi menyang produksi lan pungkasane mbukak beban kasebut. Tetep dirungokake!
Materi iki ana ing rekaman video saka bengkel mbukak REBRAIN & Yandex.Cloud: Kita nampa 10 panjalukan per detik ing Yandex Cloud —
Yen sampeyan kasengsem ing nekani acara iki online lan takon pitakonan ing wektu nyata, gabung kita ing.
Kita arep ngucapake matur nuwun khusus kanggo Yandex.Cloud kanggo kesempatan kanggo nganakake acara kasebut. Punika link kanggo wong-wong mau -
Yen sampeyan kudu pindhah menyang awan utawa duwe pitakon babagan infrastruktur sampeyan, .
PS Kita duwe 2 audit gratis saben wulan, mbok menawa proyek sampeyan bakal dadi salah sijine.
Source: www.habr.com
