Service Mesh على Rust: كيف تصبح الخدمات المصغرة أسرع وأكثر أمانًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Service Mesh وRust: عندما تكتسب الخدمات المصغرة قوة خارقة



تخيل: لديك عشرات الخدمات المصغرة على Rust. كل منها سريع وآمن ويستهلك حدًا أدنى من الذاكرة. ولكن بمجرد أن تبدأ في التواصل مع بعضها البعض، تبدأ الفوضى. المهلات الزمنية تسقط، التشفير يختلط، المقاييس تضيع. هل هذا مألوف؟ هنا بالضبط يظهر Service Mesh - طبقة البنية التحتية التي تتولى كل السحر الشبكي.



في هذه المقالة، لن نعيد سرد الوثائق. سننظر إلى Service Mesh بعيون مطور Rust: كيف نكتب خدمات مصغرة تتناسب تمامًا مع mesh، ولماذا Rust هي أفضل لغة لـ sidecar-proxy، وكيف يعمل كل هذا عمليًا. هل أنت مستعد؟ لنبدأ.



ما هو Service Mesh ولماذا Rust هو الملك هنا



Service Mesh هي طبقة بنية تحتية مخصصة لإدارة الاتصال بين الخدمات المصغرة. تتولى ما يلي:

  • موازنة التحميل
  • اكتشاف الخدمات
  • تشفير حركة المرور (mTLS)
  • منطق إعادة المحاولة وقطع الدائرة
  • جمع المقاييس والتتبع


التطبيقات الكلاسيكية (Istio, Linkerd) تستخدم sidecar-proxy. وهنا يدخل Rust إلى اللعبة. لماذا؟ لأن خدمات Rust المصغرة تتطلب نفس الأداء من الطبقة الشبكية. Envoy مكتوب بلغة C++، وLinkerd-proxy مكتوب بلغة Rust. وهذا ليس من قبيل الصدفة.



Rust يقدم:

  • تكلفة صفرية للتجريدات
  • عمل آمن مع الذاكرة بدون GC
  • عدم التزامن "خارج الصندوق" عبر tokio
  • حجم صغير للملفات الثنائية وبدء تشغيل سريع


في عالم تكون فيه كل ميكروثانية مهمة، يصبح Rust اللغة المثالية للبروكسيات الشبكية وخدمات الحافة.



الهندسة المعمارية: كيف تتعامل الخدمات المصغرة على Rust مع Service Mesh



Sidecar-proxy: المساعد غير المرئي



تخيل أن كل خدمة Rust لديك تحصل على "جار" - sidecar-proxy. جميع الطلبات الواردة والصادرة تمر عبره. الكود الخاص بك لا يعرف شيئًا عن السحر الشبكي - إنه فقط يستمع على localhost.



إليك كيف تبدو الهندسة المعمارية النموذجية مع Service Mesh على Rust:



// مثال على خدمة gRPC بسيطة بلغة Rustuse tonic::{transport::Server, Request, Response, Status};use hello_world::greeter_server::{Greeter, GreeterServer};use hello_world::{HelloReply, HelloRequest};

pub mod hello_world { tonic::include_proto!("helloworld");}

#[derive(Default)]pub struct MyGreeter;

#[tonic::async_trait]impl Greeter for MyGreeter { async fn say_hello( &self, request: Request<HelloRequest>, ) -> Result<Response<HelloReply>, Status> { println!("Got a request from {:?}", request.remote_addr()); let reply = HelloReply { message: format!("Hello {}!", request.into_inner().name), }; Ok(Response::new(reply)) }}

#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let addr = "[::1]:50051".parse()?; let greeter = MyGreeter::default();

Server::builder() .add_service(GreeterServer::new(greeter)) .serve(addr) .await?;

Ok(())}


هذه الخدمة لا تعرف شيئًا عن mesh. يقوم Sidecar باعتراض حركة المرور، وإضافة mTLS، والمقاييس، وإعادة المحاولات. يبقى الكود الخاص بك نظيفًا وقابلًا للاختبار.



mTLS بدون ألم: إعداد التشفير



إحدى الميزات الرئيسية لـ Service Mesh هي التشفير التلقائي لحركة المرور. في خدمات Rust المصغرة، هذا ممتع بشكل خاص: أنت لا تحمل الشهادات في الكود.



مثال على إعداد عميل بحد أدنى مع mTLS عبر rustls:



use rustls::ClientConfig;use std::sync::Arc;use tonic::transport::{Endpoint, Channel};use tokio_rustls::TlsConnector;

async fn create_secure_channel() -> Result<Channel, Box<dyn std::error::Error>> { let mut config = ClientConfig::builder()

المدونات

توصيات الكتب