Dalam beberapa tahun kebelakangan ini, dengan perkembangan pesat Internet, sistem yang diedarkan telah menarik lebih banyak perhatian. Teknologi RPC (Remote Procedure Call) ialah teknologi utama dalam sistem teragih, yang membolehkan sistem berbeza berkomunikasi dan bekerjasama antara satu sama lain. Di antara bahasa yang berbeza, kebanyakan bahasa mempunyai rangka kerja RPC mereka sendiri. Dalam artikel ini, kami akan memperkenalkan cara menggunakan Golang untuk melaksanakan RPC supaya sistem boleh bekerjasama dengan gembira.
1. Konsep asas RPC
1.1 Apakah itu
RPC ialah Panggilan Prosedur Jauh, yang bermaksud bahawa pelanggan memanggil perkhidmatan jauh secara setempat , sama seperti membuat panggilan kod asli, dan boleh lulus parameter dan mendapatkan nilai pulangan sama seperti memanggil kod asli. Ia sebenarnya mengabstrak proses komunikasi rangkaian ke dalam corak yang serupa dengan panggilan tempatan.
1.2. Mengapa
Dalam sistem teragih, setiap nod tersebar dan masing-masing menjalankan tugas atau perkhidmatan perniagaan yang berbeza. Untuk nod ini berfungsi bersama, mereka perlu berkomunikasi melalui rangkaian. RPC membenarkan nod ini bertukar data melalui rangkaian untuk melaksanakan pelaksanaan logik perniagaan.
1.3. Ciri-ciri
Prinsip teras RPC adalah untuk mengabstrak proses komunikasi rangkaian ke dalam proses panggilan tempatan dan kemudian Kembalikan hasil pemprosesan kepada pelanggan. Ini membolehkan pelbagai nod dalam sistem teragih bekerjasama antara satu sama lain untuk menyelesaikan pelbagai tugas sistem teragih. Ciri-ciri RPC adalah seperti berikut:
2. Langkah asas untuk Golang melaksanakan RPC
2.1 Tentukan antara muka
Di Golang, anda perlu menentukan antara muka yang akan didedahkan antara muka adalah bersamaan dengan prototaip Fungsi untuk panggilan jauh.
type Server struct {} type Args struct { A, B int } func (s *Server) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil }
Dalam kod, struktur Pelayan dan struktur Args ditakrifkan Struktur Pelayan mentakrifkan fungsi Darab digunakan untuk mengira hasil darab dua integer. Perlu diingatkan bahawa parameter dan nilai pulangan fungsi Multiply mesti memenuhi spesifikasi RPC.
2.2. Daftar perkhidmatan RPC
Selepas menentukan antara muka, anda perlu mendaftarkan antara muka ke dalam perkhidmatan RPC supaya pelanggan boleh menghubungi perkhidmatan RPC. Untuk mendaftarkan perkhidmatan kepada pelayan RPC, kita perlu menggunakan fungsi rpc.Serve() di Golang.
func main() { server := new(Server) rpc.Register(server) rpc.HandleHTTP() listener, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal("listen error:", err) } http.Serve(listener, nil) }
Dalam kod di atas, kami mula-mula mencipta struktur Pelayan, dan kemudian mendaftarkan antara muka yang ditakrifkan dalam struktur Pelayan kepada pelayan RPC melalui fungsi rpc.Daftar, dan kemudian gunakan rpc.HandleHTTP( ) Ikat pelayan RPC ke mux lalai dalam pakej http, dan akhirnya ikat pelayan RPC ke alamat pendengaran TCP melalui http.Serve.
2.3. Tulis kod pelanggan
Apabila pendaftaran perkhidmatan RPC selesai, kami perlu menulis kod pelanggan untuk menghubungi perkhidmatan RPC. Pakej rpc Golang menyediakan fungsi rpc.DialHTTP, yang boleh digunakan untuk mewujudkan sambungan klien RPC. Berikut ialah pelaksanaan klien RPC yang mudah:
func main() { client, err := rpc.DialHTTP("tcp", "localhost:8080") if err != nil { log.Fatal("dialing:", err) } args := &Args{7, 8} var reply int err = client.Call("Server.Multiply", args, &reply) if err != nil { log.Fatal("Server error:", err) } fmt.Printf("Multiply: %d*%d=%d", args.A, args.B, reply) }
Pelanggan mewujudkan sambungan dengan pelayan RPC melalui fungsi rpc.DialHTTP, dan kemudian memanggil kaedah klien.Panggilan untuk melaksanakan fungsi pelayan RPC. Parameter pertama Panggilan ialah nama fungsi yang akan dipanggil, parameter kedua ialah parameter fungsi, dan parameter ketiga ialah nilai pulangan fungsi.
3. Kod contoh RPC Golang
Berikut ialah contoh lengkap pelaksanaan RPC berdasarkan Golang:
package main import ( "fmt" "log" "net" "net/http" "net/rpc" ) type Server struct{} type Args struct { A, B int } func (s *Server) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil } func main() { server := new(Server) rpc.Register(server) rpc.HandleHTTP() listener, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal("listen error:", err) } go http.Serve(listener, nil) client, err := rpc.DialHTTP("tcp", "localhost:8080") if err != nil { log.Fatal("dialing:", err) } args := &Args{7, 8} var reply int err = client.Call("Server.Multiply", args, &reply) if err != nil { log.Fatal("Server error:", err) } fmt.Printf("Multiply: %d*%d=%d", args.A, args.B, reply) }
Melalui kod di atas, kita boleh lihat , dalam Golang, melaksanakan RPC adalah mudah. Anda hanya perlu menentukan antara muka, mendaftar perkhidmatan RPC dan menulis kod klien. Sudah tentu, kedua-dua pelanggan dan pelayan RPC boleh menjadi heterogen, yang sangat berguna apabila menskalakan sistem teragih.
4. Ringkasan
Artikel ini memperkenalkan apa itu RPC, sebab RPC diperlukan dan cara menggunakan Golang untuk melaksanakan RPC. Dengan membaca artikel ini, kita dapat memahami bahawa RPC digunakan secara meluas dan merupakan teknologi asas dalam sistem teragih. Sebagai bahasa pengaturcaraan yang cekap, Golang mempunyai rangka kerja RPC yang sangat baik yang boleh membantu pembangun melaksanakan sistem teragih dengan lebih baik. Jika anda perlu membangunkan sistem teragih, anda juga boleh cuba menggunakan Golang untuk melaksanakan RPC.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan rpc di golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!