برنامه نویسی

Microservices with pebl — یک پلتفرم ابری کامل و رایگان

بررسی اجمالی

در این راهنما می خواهم pebl، a پلتفرم ابری کامل و رایگان.

برخلاف رویکرد عادی به Infrastructure as Code، pebl برای کنترل ابر شما به اعلام مجموعه ای از فایل های yaml متکی نیست. در عوض pebl قابلیت های ابری را از طریق SDK های خاص زبان در برنامه شما تعبیه می کند.

شروع شدن

ثبت نام

بنابراین ابتدا باید برای یک حساب کاربری رایگان در pebl.io ثبت نام کنیم.

تصویری که گزینه های ثبت نام oauth را در pebl.io نشان می دهد

ارائه دهنده هویت مورد نظر خود را انتخاب کنید و مراحل را دنبال کنید. و مطمئن شوید که درخواست رایگان خود را انجام می دهید *.pebl.rocks زیر دامنه! ما از این برای بقیه آموزش استفاده خواهیم کرد.

Docker & pebl CLI

تنها دو مورد نیاز سیستم برای pebl وجود دارد که Docker و pebl CLI هستند. اگر Docker را نصب نکرده اید، به وب سایت docker بروید و دستورالعمل های آنها را دنبال کنید.

برای pebl CLI، گزینه تصحیح پیوند در اسناد تنظیم pebl را انتخاب کنید. مطمئن شوید که لینک دانلود صحیح را برای سیستم خود انتخاب کرده اید! اگر از مک استفاده می کنید، می توانید با مراجعه به منوی Apple و سپس About This Mac بررسی کنید که آیا سیستم شما Intel یا M1 است.

اسکرین شات صفحه درباره این مک اپل را نشان می دهد

با اجرا بررسی کنید که CLI به درستی نصب شده است pebl بدون هیچ آرگ:

$ pebl
usage:

    pebl {command}

available commands:

       up  start the local pebl cluster.
     down  stop the local pebl cluster.
     info  attach and show info about the local pebl cluster.
      run  execute a pebl program locally.
   deploy  execute a pebl program in the cloud.
   tunnel  creates a tunnel to a redis instance.
     auth  manages the credentials needed for certain commands.
  version  print the version of the cli.

$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سرویس ساده

بلوک اصلی ساختمانی که pebl فراهم می کند a سرویس. در پلتفرم های دیگر ممکن است به عنوان یک برنامه بدون سرور شناخته شود. در اصل سرویس pebl سروری است که می تواند به درخواست ها پاسخ دهد.

حالا بیایید با ایجاد یک سرویس بسیار ساده با استفاده از پایتون به pebl بپردازیم.

سلام دنیا!

یک پوشه پروژه اسکرچ در جایی از سیستم خود ایجاد کنید. در مثال های خود استفاده خواهیم کرد ~/work/scratch:

$ mkdir -p ~/work/scratch
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اما با خیال راحت طرح دیگری را انتخاب کنید که برای تنظیم خود منطقی باشد. این پوشه به عنوان ریشه پروژه ما عمل می کند.

حالا بیایید یک زیرپوشه ایجاد کنیم که شامل سرویس ساده hello world ما باشد.

mkdir ~/work/scratch/hello
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد یک main.py (~/work/scratch/hello/main.py) که متد اصلی را نگه می دارد و به صورت زیر پیست می کند:

from flask import Flask

app = Flask(__name__)

@app.route("https://dev.to/")
def root():
    return "hello, world!\n"

import pebl
pebl.service(app, "hey.pebl.rocks")  # put your own domain here
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بخش اول از main.py اگر قبلاً از Flask استفاده کرده اید، باید بسیار آشنا به نظر برسد. این یک تعریف فلاسک بسیار ساده است، با یک کنترل کننده در مسیر ریشه. دو خط آخر جایی است که ما اعلام می کنیم که این برنامه Flask باید یک سرویس باشد که در شما میزبانی می شود *.pebl.rocks نقطه پایانی

در این مرحله ممکن است انتظار داشته باشید که باید مقداری یامل مخصوص pebl جداگانه ایجاد کنیم. اما واقعاً این فراخوانی تک روش است تمام آن چیزی که طول می کشد برای تعریف یک سرویس با pebl! بنابراین برای جمع بندی:

  1. قابلیت های ابر (pebl.service) به عنوان کد معمولی در برنامه گنجانده می شوند
  2. شما می توانید به هر کتابخانه پایتون دیگری بدون پیکربندی اضافی مانند Flask اعتماد کنید

اکنون برای اجرای این، به تصویر Docker پایه pebl برای ایجاد یک ظرف قابل استفاده مجدد تکیه می کنیم. برو جلو و ایجاد کن Dockerfile (~/work/scratch/hello/Dockerfile) با محتوای زیر:

FROM peblcloud/python
COPY . .
RUN pip install flask
ENTRYPOINT python -u main.py
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

زمان اجرا محلی

Pebl به شما اجازه می دهد کد خود را به صورت محلی اجرا کنید تا از صحت اطمینان حاصل کنید و یک چرخه تکرار فوق العاده سریع ارائه دهید. ابتدا یک خوشه محلی را راه اندازی کنید که شامل تمام بارهای کاری محلی ما باشد pebl up:

$ pebl up
 :: initializing new pebl cluster...
 :: done!
 :: run `pebl info` to see logs, endpoints, and other info about the running cluster!
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از پیکربندی خوشه، به مسیر بروید hello زیر پوشه و اجرا کنید pebl run:

$ cd ~/work/scratch/hello
$ pebl run
 :: building docker project...
 :: starting container...
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس اجرا کنید pebl info برای مشاهده وضعیت خوشه در حال اجرا.

تصویر صفحه پایانه ای که صفحه را از اطلاعات pebl نشان می دهد

شما باید چیزی شبیه به این را ببینید، اما با خودتان *.pebl.rocks زیر دامنه به جای hey.pebl.rocks. ادامه دهید و سعی کنید یک درخواست به سرور خود ارسال کنید.

$ curl localhost:32807
hello, world!
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مطمئن شوید که پورت صحیح را همانطور که در صفحه اطلاعات خود نشان داده شده است قرار داده اید!

Cloud Runtime

با تعبیه استفاده از زیرساخت ابری خود در برنامه خود، pebl یک مزیت کلیدی را باز می کند: توانایی استقرار دقیقاً همان برنامه در زمان های مختلف اجرا، بدون هیچ گونه تغییری.

به عبارت دیگر، دیگر نیازی به بررسی های خاص محیطی یا تعریف فایل های پیکربندی چندگانه برای استقرار محلی در مقابل تولید نیست.

بنابراین pebl انتقال برنامه های خود را به فضای ابری پس از انجام آزمایش محلی آنها بسیار آسان می کند. فقط بدو pebl deploy به روشی مشابه pebl run:

$ cd ~/work/scratch/hello
$ pebl deploy
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر با خطاهای احراز هویت مواجه شدید، حتما اجرا کنید pebl auth و مراحل را دنبال کنید!

پس از موفقیت آمیز بودن استقرار، سعی کنید درخواستی را با curl ارسال کنید. حتما استفاده کنید https زیرا همه سرویس‌های موجود در ابر به‌طور پیش‌فرض TLS دریافت می‌کنند و pebl ترافیک غیر TLS را مجاز نمی‌داند.

$ curl https://hey.pebl.rocks
hello, world!
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همچنین می‌توانید به کنسول pebl بروید تا گزارشی از تمام ترافیک ورودی به نقاط پایانی خود دریافت کنید.

اسکرین شات از کنسول در pebl.io

میکروسرویس ها

یک راه متداول برای ساختار بارهای کاری ابری، تقسیم آنها به سرویس های کوچک است که هر کدام بخش متفاوتی از سیستم بزرگتر را ارائه می دهند. با pebl می توانیم با استفاده از آن به آن برسیم خدمات داخلی قابلیت

خدمات داخلی مشابه هستند pebl.service که قبلا استفاده کردیم، با یک تفاوت کلیدی. آنها فقط در معرض بارهای کاری دیگر شما هستند و برای ترافیک خارجی پیکربندی نشده اند.

بنابراین در این بخش اضافه کردن یک سرویس داخلی و استفاده از Go به جای Python برای برجسته کردن ویژگی agnostic زبان pebl را بررسی خواهیم کرد.

برو Setup

بیایید یک زیرپوشه در پوشه اسکرچ خود ایجاد کنیم تا تنظیمات Go را نگه داریم.

$ mkdir ~/work/scratch/go
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس یک پروژه Go را با استفاده از آن مقداردهی اولیه کنید go mod init:

$ cd ~/work/scratch/go
$ go mod init scratch
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و برخلاف پایتون، از آنجایی که Go کامپایل شده است، در واقع به Dockerfile نیاز نداریم. در عوض باید بسته pebl را برای Go دانلود کنیم:

$ cd ~/work/scratch/go
$ go get github.com/peblcloud/go
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سرویس کاربر

و برای ایجاد انگیزه برای استفاده واقعی، ما یک سرویس Go داخلی ایجاد خواهیم کرد که به عنوان یک سرویس کاربر عمل می کند، سرویسی که مدیریت داده های کاربر را انجام می دهد. ایجاد یک main.go (~/work/scratch/go/main.go):

package main

import (
    "github.com/peblcloud/go"
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("https://dev.to/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("this is an internal service!\n"))
    })

    pebl.InternalService(mux, "go.internal")
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بنابراین همانطور که قبلاً با پایتون انجام داده بودیم، یک شی سرور بر اساس آن ایجاد می کنیم net/http. سپس با ارسال شیء سرور پیکربندی شده به SDK pebl pebl.InternalService زنگ زدن.

توجه داشته باشید که برخلاف سرویسی که قبلا تعریف کردیم، یک دامنه به ظاهر نامعتبر ارائه می‌کنیم go.internal. برای سرویس‌های داخلی، نقطه پایانی می‌تواند هر چیزی باشد، اگرچه توصیه می‌کنیم از یک طرح آسان برای به خاطر سپردن استفاده کنید، مانند .local یا .internal TLD.

بیایید این را اجرا کنیم! مانند قبل از اجرا pebl run برای اجرای محلی:

$ cd ~/work/scratch/go
$ pebl run
 :: building golang project...
 :: staging build at: /var/folders/92/_vg8jtqx7kncxb_9jlpw8rmm0000gn/T/3019178735
 :: containerizing the build...
 :: starting container...
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون وقتی صفحه اطلاعات را بررسی می کنید، باید ورودی دیگری را مشاهده کنید که به عنوان برچسب گذاری شده است internal:

اسکرین شات پنجره اطلاعات به روز شده از اجرای سرویس Go به صورت محلی را نشان می دهد

می‌توانید با curl درخواست‌ها را به این نقطه پایانی داخلی جدید ارسال کنید:

$ curl localhost:32808
this is an internal service!
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که امکان ارسال درخواست هایی مانند این به سرویس داخلی به دلیل راحتی در هنگام اجرای محلی ارائه می شود. وقتی در زمان اجرا ابری مستقر می شوید، نمی توانید از خارج از خوشه به خدمات داخلی دسترسی داشته باشید.

ردیس

اکنون سرویس Go داخلی ما چندان جالب نیست زیرا واقعاً بر اساس درخواست ما کاری انجام نمی دهد. به منظور پشتیبانی از مجموعه بسیار گسترده تری از برنامه ها، pebl از طریق Redis پایداری را ارائه می دهد. و همانطور که تاکنون انجام داده‌ایم، این قابلیت را از طریق SDK باز می‌کنیم.

پس بیایید سرویس Go را به روز کنیم (~/work/scratch/go/main.go) با ترکیب Redis.

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "net/http"
    "net/url"

    "github.com/peblcloud/go"
    "github.com/redis/go-redis/v9"
)

func main() {
    connInfo, _ := pebl.Redis("users")
    client := redis.NewClient(&redis.Options{
        Addr: fmt.Sprintf("%s:%d", connInfo.Host, connInfo.Port),
    })

    mux := http.NewServeMux()
    mux.HandleFunc("https://dev.to/", func(w http.ResponseWriter, r *http.Request) {
        query, _ := url.ParseQuery(r.URL.RawQuery)
        name := query.Get("name")
        userInfo, _ := client.HGetAll(context.Background(), name).Result()
        payload, _ := json.Marshal(userInfo)
        w.Write(payload)
    })

    pebl.InternalService(mux, "go.internal")
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس با اجرا کردن، وابستگی های ماژول خود را به روز کنید go mod tidy، که باید به طور خودکار پایین بیاید github.com/redis/go-redis/v9. اگر به دلایلی این کار نمی کند، می توانید به صورت دستی اجرا کنید go get github.com/redis/go-redis/v9.

حالا این سرویس Go را با اجرا اجرا کنید pebl run داخل ~/work/scratch/go/. اکنون صفحه اطلاعات شما باید نمونه redis مورد استفاده ما را به نام فهرست کند users.

تصویر صفحه نمایش پنجره اطلاعات به روز شده از اجرای redis به صورت محلی را نشان می دهد

اگر در این مرحله سعی کنید و درخواست‌هایی را به سرویس Go داخلی خود ارسال کنید، همیشه یک نتیجه خالی دریافت می‌کنید زیرا نمونه redis ما هنوز اطلاعات کاربری ندارد.

$ curl 'localhost:32808?name=alice'
{}
$ curl 'localhost:32808?name=bob'
{}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اما می توانید با استفاده از پورت در معرض نمایش داده شده در صفحه اطلاعات، داده ها را در redis محلی خود به سرعت مدیریت کنید.

$ redis-cli -p 32809
127.0.0.1:32809> hset alice name alice email alice@example.org
(integer) 2
127.0.0.1:32809> hset bob name bob email bob@example.org
(integer) 2
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا وقتی درخواست ها را با هر کدام ارسال می کنید alice یا bob به عنوان پرس و جو، اطلاعات کاربری json آنها را در پاسخ دریافت خواهید کرد:

$ curl 'localhost:32808?name=alice'
{"email":"alice@example.org","name":"alice"}
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پروکسی

اکنون برای استفاده از این سرویس داخلی، زیرمجموعه ای از درخواست ها را از سرویس خارجی پایتون به سرویس Go داخلی خود پروکسی می کنیم. بیایید خود را به روز کنیم main.py در ~/work/scratch/hello/ پوشه:

from flask import Flask
import requests

app = Flask(__name__)

@app.route("https://dev.to/")
def root():
    return "hello, world!\n"

@app.route("/user/<name>")
def user_service(name):
    r = requests.get(f"http://go.internal?name={name}")
    return r.text, r.status_code

import pebl
pebl.service(app, "hey.pebl.rocks")  # put your own domain here
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بنابراین در اینجا ما به کتابخانه درخواست های محبوب برای ارسال تکیه می کنیم /user درخواست به سرویس داخلی Go در go.internal:80. بار دیگر قدرت pebl این است که می‌تواند کتابخانه‌های پایتون را به راحتی و بدون هیچ گونه پیکربندی خارجی ترکیب کند. اما قبل از اینکه بتوانیم این را به صورت محلی اجرا کنیم، باید اطمینان حاصل کنیم که کتابخانه درخواست ها برای استفاده در کانتینر در دسترس است. بنابراین به روز رسانی کنید Dockerfile:

FROM peblcloud/python
COPY . .
RUN pip install flask requests
ENTRYPOINT python -u main.py
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ادامه دهید و سعی کنید این را اجرا کنید! شما قادر خواهید بود نقطه پایانی خارجی را در قسمت پرس و جو کنید /user مسیر دسترسی به سرویس داخلی:

$ curl localhost:32807/user/alice
{"email":"alice@example.org","name":"alice"}
$ curl localhost:32807/user/bob
{"email":"bob@example.org","name":"bob"}
$
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حال استقرار

ادامه دهید و این تغییرات را اعمال کنید! ابتدا سرویس Go داخلی را مستقر کنید:

$ cd ~/work/scratch/go
$ pebl deploy
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس فراخوانی کنید pebl deploy یک بار دیگر در زیر پروژه پایتون:

$ cd ~/work/scratch/hello
$ pebl deploy
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Pebl به‌طور خودکار به‌روزرسانی‌های بدون خرابی سرویس‌ها را پیاده‌سازی می‌کند. این بدان معنی است که هیچ درخواستی در طول این انتقال حذف نخواهد شد. پس از تکمیل استقرار، می‌توانید درخواست‌های مشابه را به زمان اجرا ابری ارسال کنید:

$ curl https://hey.pebl.rocks/user/alice
{}
$ curl https://hey.pebl.rocks/user/bob
{}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و همانطور که انتظار می رفت، باید نتایج خالی را مشاهده کنید زیرا زمان اجرا ابری ما داده هایی را که برای زمان اجرا محلی خود پر کرده ایم ندارد.

مدیریت ردیس

برای دسترسی به redis هایی که در زمان اجرا ابری هستند، می توانیم از pebl CLI استفاده کنیم pebl tunnel دستور:

$ pebl tunnel
 :: tunnel established at: 127.0.0.1:59039
 :: use redis-cli to connect:
 :: redis-cli -p 59039
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تونل ترافیک محلی را به نمونه های redis شما در ابر پراکسی می کند. می توانید استفاده کنید redis-cli با -p آرگومان برای اتصال به پورت پروکسی و تنظیم همان داده هایی که به صورت محلی استفاده می کنیم:

$ redis-cli -p 59039
127.0.0.1:59039> hset alice name alice email alice@example.org
(integer) 2
127.0.0.1:59039> hset bob name bob email bob@example.org
(integer) 2
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون درخواست های شما به ابر همان نتایج قبلی را نشان می دهد:

$ curl https://hey.pebl.rocks/user/alice
{"email":"alice@example.org","name":"alice"}
$ curl https://hey.pebl.rocks/user/bob
{"email":"bob@example.org","name":"bob"}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مراحل بعدی

بنابراین ما سه قابلیت pebl را بررسی کرده‌ایم – خدمات، سرویس‌های داخلی و redis. می‌توانید با جستجو در مرجع SDK، بقیه پیشنهادات pebl را کشف کنید.

همچنین می‌توانید راهنماهای متعدد ما را در مورد نحوه انجام وظایف رایج ابری دنبال کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا