این rpc این قابلیت را می دهد که توی computer خودمون یک سورسی رو داشته باشیم و حتی اون تو اجرا کنیم و حتی بتونیم این توابع رو از طریق یک کامپیوتر دیگه هم اجرا کنیم
rpc is form of client-server communication that uses function call rather than usual http call.
توی rpc, یک مفهومی داریم بنام IDL یا interface definition language که توش یکسری قائده و قانون برای توابعی که قراره توی این بستر تعریف و اجرا بشن درنظر میگیره مثل نام توابع یا پارامتر های ورودی و خروجی
این grpc توی میکروسرویس برای ارتباط سرویس ها باهم میتوانند استفاده شوند
بحث پرفورمنس توی grpc به شدت خوب و قوی میباشد
چرا پرفورمنس خوبی دارد ؟؟؟؟؟
به دلیل استفاده از http/2 برای انجام درخواست ها
توی http/1 قابلیت ارسال چندین request یا دریافت چندین response توی یک http connection وجود ندارد یعنی از طریق یک connection نمیتونی چند تا response دریافت کنی یا حتی چند تا request ارسال کنی و باید به ازای هرکدوم یک connection ایجاد کنی
و به این قابلیت میگن request/response multiplexing که توی http/2 از طریق لایه جدیدی بنام binary framing انجام میشود
ساختار http/1
post : /upload
host: www.google.com
content-type: application/json
content-length: 15
{ "msg": "hello http 1" }
ساختار http/2
headers frames
data frames
این لایه binary frame این قابلیت رو میده که داده ها encapsulate و encode بشن درواقع request و response ها درقالب فریم ها دیده میشوند
header frame: all about http header data
data frame: body of the requests
Binary Framing
یکی از چیزهای خیلی مهم توی http/2 اینکه اگر یک درخواست ارسال شود, بعد از مدتی یک درخواست دیگر ارسال شود , اطلاعات هدر دوم بررسی میشود و فقط چیزهای که جدید هستند رو نگه میدارن و اونایی که تکراری هستن و توی هدر درخواست های قبل بودن رو حذف میکنن , اینجوری هدر درخواست های ما به طرز عجیبی کم میشوند سایزشون
request #2
method get
scheme https
host myhosty.com
path /resouces
request #1
method get
scheme https
host myhosty.com
path /image
header frames request #1
method get
scheme https
host myhost.com
path image
header frames request #2
path /resouces
IDL for Grpc ====== protobuf
توی proto buffer داده ها و توابعی که قراره توی communication ازشون استفاده بشه تعریف و کانفیگ میکنند و درواقع proto buffer مثل یک لایه میانی می ماند که شامل یک قراردادی میباشد که کلاینت به چه شکل بتواند با سرور ارتباط بگیرد و توابع توی سرور را اجرا کند
توی restful api زمانی که میخاد یک داده ای رو ارسال کنه درقالب string ای از json میبینه
توی grpc درقالب binary ارسال میکنه که به شدت ساده و سبک میشه
توی http به اطلاعات توی یک درخواست که شامل آدرس یا http verb و اینا میشه میگن http header
توی grpc همین اطلاعات درقالب key-value هستند که بهشون meta data میگن
این streaming چیه ؟؟ وقتی توی یک connection چندین درخواست اتفاق بیوفته
server streaming rpc
کلاینت یک درخواست ارسال میکند و سرور درخواست را دریافت کرده و چندین پاسخ را ارسال میکند به عنوان مثال کلاینت یک درخواست میده برای گرفتن صفحات home page, سرور هر کدوم از اعضای صفحه رو به صورت جداگانه در یک response ارسال میکنه که به کلاینت قابلیت lazy loading میده
client streaming rpc
وقتی کلاینت چند درخواست ارسال کند ولی سرور یک پاسخ دهد به طور مثال کلاینت درقالب چندین ریکوئست داده هایی که میخاد آپلود کنه رو به صورت چانک میفرسته و بعد از اتمام آپلودشون یک پاسخ از سرور دریافت میکنند
bidirectional streaming rpc
همه به هم پیام میدن بدون اینکه منتظر بمونن
Grpc Cancellation
هر rpc یک observer داره که از طریقش میتونی عملیات cancellation رو انجام بدی
trpc
یک ورژن از grpc که به صورت type safety هست و با typescript نوشته شده است
یک type safe network communication
ساختار فایل proto
package auth;
این package قابلیت این رو بما میده که یجورایی ماژول بندی کنیم که conflict بین message هامون پیش نیاد چون ممکنه یک message بین دوتا فایل proto وجود داشته باشه اونوقت بین message ها یک conflict به وجود میاد
message User {}
ساختار پیام هامون رو از این طریق مشخص میکنیم که چه فیلد هایی با چه تایپ هایی دارن
message User {
int32 id = 1;
string name = 2;
bool isMarried = 3;
}
نحوه مشخص کردن ساختار دیتاها
اون اعدادی که مشخص شده واسه serilization استفاده میشه چون مثلا اگر بخاد توسط code generator این فیلد رو تبدیل کنه , اینکه بیاد با اسم فیلد اینکارو انجام بده بیشتر وقت میگیره تا اینکه بیاد با براساس id هاشون اینکار رو انجام بده سرهمون این آیدی هارو مشخص میکنیم که بتونه از طریق id فیلد هارو پیدا کنه و تبدیل کنه