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

بررسی اجمالی
در این راهنما می خواهم pebl، a پلتفرم ابری کامل و رایگان.
برخلاف رویکرد عادی به Infrastructure as Code، pebl برای کنترل ابر شما به اعلام مجموعه ای از فایل های yaml متکی نیست. در عوض pebl قابلیت های ابری را از طریق SDK های خاص زبان در برنامه شما تعبیه می کند.
شروع شدن
ثبت نام
بنابراین ابتدا باید برای یک حساب کاربری رایگان در 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! بنابراین برای جمع بندی:
- قابلیت های ابر (
pebl.service
) به عنوان کد معمولی در برنامه گنجانده می شوند - شما می توانید به هر کتابخانه پایتون دیگری بدون پیکربندی اضافی مانند 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.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 می توانیم با استفاده از آن به آن برسیم خدمات داخلی قابلیت
خدمات داخلی مشابه هستند 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
:
میتوانید با 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
.
اگر در این مرحله سعی کنید و درخواستهایی را به سرویس 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 را کشف کنید.
همچنین میتوانید راهنماهای متعدد ما را در مورد نحوه انجام وظایف رایج ابری دنبال کنید.