Pengantar Arsitektur Layanan Mikro
Bagian 1 dari 10
Adaptasi artikel Ewan Valentine.
Ini adalah serangkaian sepuluh bagian, saya akan mencoba menulis tentang membangun layanan microser di Golang sebulan sekali. Saya akan menggunakan protobuf dan gRPC sebagai protokol transportasi utama.
Tumpukan yang saya gunakan: golang, mongodb, grpc, buruh pelabuhan, Google Cloud, Kubernetes, NATS, CircleCI, Terraform dan go-micro.
Mengapa saya membutuhkan ini? Karena saya butuh waktu lama untuk mencari tahu dan menyelesaikan masalah yang terakumulasi. Saya juga ingin berbagi dengan Anda apa yang saya pelajari tentang pembuatan, pengujian, dan penyebaran layanan mikro di Go dan teknologi baru lainnya.
Pada bagian ini, saya ingin menunjukkan konsep dasar dan teknologi untuk membangun layanan-mikro. Mari kita tulis implementasi sederhana. Proyek ini akan memiliki entitas berikut:
- muatan
- inventaris
- percobaan
- para pengguna
- peran
- otentikasi

Untuk melangkah lebih jauh, Anda perlu menginstal Golang dan perpustakaan yang diperlukan, serta membuat repositori git.
Teori
Apa itu arsitektur microservice?
Layanan microser mengisolasi fungsionalitas terpisah menjadi sebuah layanan, mandiri dalam hal fungsi yang dilakukan oleh layanan ini. Untuk kompatibilitas dengan layanan lain, ia memiliki antarmuka yang terkenal dan standar.
Layanan microsoft saling berkomunikasi menggunakan pesan yang dikirim melalui perantara, perantara pesan.

Berkat arsitektur microservice, aplikasi tidak dapat ditingkatkan secara keseluruhan, tetapi sebagian. Misalnya, jika layanan otorisasi "berkedut" lebih sering daripada yang lain, kami dapat meningkatkan jumlah instance. Konsep ini sejalan dengan konsep cloud computing dan containerization pada umumnya.
Kenapa golang
Layanan microser didukung di hampir semua bahasa, lagipula, layanan microser adalah sebuah konsep, bukan struktur atau alat khusus. Namun, beberapa bahasa lebih cocok dan, di samping itu, memiliki dukungan yang lebih baik untuk layanan mikro daripada yang lain. Satu bahasa dengan dukungan besar adalah Golang.
Temui protobuf / gRPC
Seperti disebutkan sebelumnya, layanan microser dibagi menjadi basis kode yang terpisah, salah satu masalah penting yang terkait dengan layanan microser adalah komunikasi. Jika Anda memiliki monolith, maka Anda cukup memanggil kode langsung dari tempat lain di program Anda.
Untuk mengatasi masalah komunikasi, kita dapat menggunakan pendekatan REST tradisional dan mentransfer data dalam format JSON atau XML melalui HTTP. Tetapi pendekatan ini memiliki kelemahan, misalnya, bahwa sebelum mengirim pesan Anda harus menyandikan data Anda, dan mendekodekannya kembali di sisi penerima. Dan ini adalah overhead dan meningkatkan kompleksitas kode.
Ada solusinya! Ini adalah protokol gRPC - protokol berbasis biner ringan yang menghilangkan transmisi header HTTP, dan ini akan menghemat beberapa byte. HTTP2 di masa mendatang juga menyiratkan penggunaan data biner, yang lagi-lagi mendukung gRPC. HTTP2 memungkinkan komunikasi dua arah, dan itu luar biasa!
GRPC juga memungkinkan Anda untuk menentukan antarmuka ke layanan Anda dalam format yang ramah - ini> protobuf .
Berlatih
Buat file /project/consigment.proto.
Dokumentasi protobuf resmi
consigment.proto//consigment.proto syntax = "proto3"; package go.micro.srv.consignment; service ShippingService { rpc CreateConsignment(Consignment) returns (Response) {} } message Consignment { string id = 1; string description = 2; int32 weight = 3; repeated Container containers = 4; string vessel_id = 5; } message Container { string id = 1; string customer_id = 2; string origin = 3; string user_id = 4; } message Response { bool created = 1; Consignment consignment = 2; }
Ini adalah contoh sederhana yang berisi layanan yang ingin Anda berikan ke layanan lain: layanan ShippingService, maka kami akan menentukan pesan kami. Protobuf adalah protokol yang diketik secara statis, dan kita dapat membuat tipe khusus (mirip dengan struktur di golang). Di sini wadah bersarang dalam bets.
Instal pustaka, kompiler, dan kompilasi protokol kami:
$ go get -u google.golang.org/grpc $ go get -u github.com/golang/protobuf/protoc-gen-go $ sudo apt install protobuf-compiler $ mkdir consignment && cd consignment $ protoc -I=. --go_out=plugins=grpc:. consignment.proto
Outputnya harus berupa file:
consignment.pb.go
Jika, maka ada yang tidak beres. Perhatikan argumen -I adalah jalur di mana kompiler mencari file, --go_out di mana file baru akan dibuat. Selalu ada bantuan
$ protoc -h
Ini adalah kode yang secara otomatis dihasilkan oleh pustaka gRPC / protobuf sehingga Anda dapat mengaitkan definisi protobuf Anda dengan kode Anda sendiri.
Kami akan menulis main.go
main.go package seaport import ( "log" "net"
Harap baca dengan cermat komentar yang tersisa di kode. Rupanya, di sini kita membuat logika implementasi di mana metode gRPC kami berinteraksi menggunakan format yang dihasilkan, membuat server gRPC baru pada port 50051. Sekarang layanan gRPC kami akan tinggal di sana.
Anda dapat menjalankan ini dengan $ go run main.go , tetapi Anda tidak akan melihat apa pun dan Anda tidak akan dapat menggunakannya ... Jadi, mari kita buat klien untuk melihatnya dalam tindakan.
Mari kita buat antarmuka baris perintah yang mengambil file JSON dan berinteraksi dengan layanan gRPC kami.
Di direktori root, buat subdirektori baru dari $ mkdir konsinyasi-cli . Dalam direktori ini, buat file cli.go dengan konten berikut:
cli.go package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" )
Sekarang buat batch (konsinyasi-cli / consignment.json):
{ "description": " ", "weight": 100, "containers": [ { "customer_id": "_001", "user_id": "_001", "origin": " " } ], "vessel_id": "_001" }
Sekarang, jika Anda menjalankan $ go run main.go dari paket pelabuhan , dan kemudian jalankan $ go run cli.go di panel terminal terpisah. Anda akan melihat pesan "Created: true".
Tetapi bagaimana kita bisa memverifikasi apa yang sebenarnya diciptakan? Mari perbarui layanan kami menggunakan metode GetConsignments sehingga kami dapat melihat semua kumpulan yang kami buat.
Jadi, di sini kami membuat metode baru pada layanan kami yang disebut GetConsignments , kami juga membuat GetRequest baru, yang belum mengandung apa pun. Kami juga menambahkan bidang batch yang dikirim ke pesan balasan kami. Anda akan melihat bahwa jenis di sini memiliki kata kunci berulang hingga jenis. Ini, seperti yang mungkin Anda tebak, berarti memperlakukan bidang ini sebagai array jenis ini.
Jangan terburu-buru menjalankan program, implementasi metode gRPC kami didasarkan pada pencocokan antarmuka yang dibuat oleh perpustakaan protobuf, kami perlu memastikan bahwa implementasi kami sesuai dengan definisi proto kami.
Di sini kami telah memasukkan metode GetConsignments baru kami, memperbarui repositori dan antarmuka kami, masing-masing dibuat dalam definisi consignments.proto. Jika Anda menjalankan $ go jalankan main.go lagi , program harus bekerja lagi.
Mari perbarui alat cli kami untuk memasukkan kemampuan untuk memanggil metode ini dan memungkinkan untuk mendaftarkan pihak kami:
cli.go package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" )
Tambahkan kode di atas ke cli.go dan jalankan $ go run cli.go lagi . Klien akan menjalankan CreateConsignment dan kemudian memanggil GetConsignments. Dan Anda harus melihat bahwa dalam daftar jawaban berisi komposisi partai.
Dengan demikian, kami memiliki microservice dan klien pertama yang berinteraksi dengannya menggunakan protobuf dan gRPC.
Bagian selanjutnya dari seri ini akan mencakup integrasi go-micro, yang merupakan fondasi yang kuat untuk membuat layanan microser berbasis gRPC. Kami juga akan membuat layanan kedua kami. Pertimbangkan pekerjaan layanan kami dalam wadah Docker, di bagian selanjutnya dari seri artikel ini.