یک RPC (remote procedure call) هست
حالا به ساده ترین حالت ممکن RPC چیه ؟ یه پروتوکوله که ارتباط بین سرویسهای مختلف رو مدیریت میکنه بطوری که لازم نیست از جزییات کار باخبر باشیم . یه درخواست میگیره درخواست رو به سرویسی که میخوایم میفرسته پاسخ دریافتی از اون سرویس رو به کلاینت پس میفرسته (یه واسط)
حالا grpc همون پروتوکوله که استانداردش رو google نوشته ! شرکت ارایه کننده ی go! پس مشخصه که باهم خیلی خوب کنار میان
شما اینجا با یک سرویس client server مواجهید که بینش grpc ارتباط رو برقرار میکنه یعنی رکوست هارو از کلاینت به سرور و بالعکس ردوبدل میکنه !
من میخوام الان اینجا یه سرویس note ساده بنویسم که یه پیغام رو save و رترایو میکنه :
در اولین اقدام خب ماژول رو میسازیم و اسمش رو من گذاشتم notesService . بعد یه فایل .proto که اسمش رو من میذاریمnotes.proto توی یه فولدر به همین نام .. تصویر پایین گویاست :
از خط اول تا آخر یه تعریف کوتاه و ساده :
اول اینکه با پروتوکول proto3 نوشته میشه که یعنی طبق آخرین تغییراتیه که روی این syntax اعمال شده
option go_package = "./"
: اینجا آدرسی که قراره نتیجه ی جنریت شدن کدهای پروتو ذخیره بشن رو میذاریم...
package notes ;
اسم پکیج رو مشخص میکنیم
service Notes {
//saving a note
rpc Save(Note) returns (NoteSaveReply);
//retrieving a note
rpc Load(NoteSearch) returns(Note);
}
اینجا اینترفیسمون رو با سینتکس grpc داریم که یه متد save و یه متد Load داره که ورودی اولی یک نوت خواهد بود و خروجیش یه مقدار بولین و ورودی دومی یک کلید خواهد بود و خروجیش یک نوت
//The request message
message Note {
string title =1;
bytes body =2;
} //The response message
message NoteSaveReply{
bool saved = 1;
}
//The Retrieving note request
message NoteSearch {
string keyword =1;
}
حالا با وارد کردن این دستور در terminal :
protoc --go_out=plugins=grpc:./notes notes/notes.proto
فایل پروتو رو جنریت کنیم و نتیجه رو توی همون فولدر notes ذخیره کنیم
من همچنین پس از اینکه دستور جنریتور رو زدم یک بار go mod tidy رو هم میزنم تا پکیج هایی که باید ایمپورت بشن (قابل توجهتون این که این پکیج ها رو باید با اتصال به نت بگیرید)
این دستور که بالاتر گفته شد و جنریت میکنه پروتو رو / نتیجه ی جنریت رو در قالب یک فایل بر میگردونه که بالا با نام notes_pb.go میبینیمش .. اما از اگه از این کد دستوری استفاده کنیم :
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative notes/notes.proto
در این حالت دو شیت خواهیم داشت که یکی notes.pb.go و notes_grpc.pb.go هست و در این حالت دومی ارتباطات grpc رو مدیریت میکنه
بهتره از این کد دستوری دوم استفاده کنیم !
این چند خط میتونه تو رو در تولید proto file به شیت .go کمک کنه
تا ساخت یه پروژه کوچیک با این تکنولوژی فعلا ! :>)