Servislər arasında əlaqə: daxili ünvanlar və xarici ünvanı olmayan servislər.
Bir tətbiqin servisləri bir-birinə daxili ünvanla necə müraciət edir, RIVERVO_<NAME>_URL dəyişənləri, xarici ünvanı olmayan servislər, bir neçə nüsxə, həmçinin vaxt limitləri və təkrar cəhdlər — Node.js, Laravel və Python nümunələri ilə.
Bir tətbiqin servisləri bir-birinə internetə çıxmadan, birbaşa müraciət edir. Sayt öz API-sinə, fon prosesi isə daxili servisə sorğu göndərə bilər. Bu trafik ödənişsizdir: trafik kimi hesablanmır.
Aşağıdakı nümunələrdə iki veb servis var: ziyarətçilərin açdığı web saytı — Xarici ünvan rejimində, və yalnız web və digər servislərin müraciət etdiyi api — Yalnız daxili rejimində.
Daxili ünvan
Hər veb servisin — xarici ünvanı olan və ya yalnız daxili — http://<service-name>:<port> şəklində Daxili ünvanı var, məsələn, http://api:8080. O, servisin səhifəsində və tətbiqin İcmal bölməsində kopyalama düyməsi və «Bu tətbiqin digər servisləri ona bu ünvanla müraciət edir — internetsiz və trafik ödənişi olmadan.» izahı ilə göstərilir.
- Port repozitoriyadan yığılan servis üçün 8080, hazır Docker image-dən yaradılan servis üçün isə təyin etdiyiniz Port dəyəridir.
- Bu ünvana yalnız həmin tətbiqin servisləri müraciət edə bilər. O, internetdən və digər tətbiqlərdən açılmır.
- Ünvan
http://ilə başlayır. Bağlantı tətbiqdən kənara çıxmır, ona görə sertifikat qurmaq lazım deyil.
Ünvanları saxlayan dəyişənlər
Ünvanları koda köçürmək lazım deyil. Tətbiqin kodla işləyən hər servisi — veb servislər, fon prosesləri və planlaşdırılmış tapşırıqlar — tətbiqin hər digər veb servisinin daxili ünvanı ilə dəyişən alır:
RIVERVO_<NAME>_URL=http://<name>:<port>
NAME — servisin böyük hərflərlə yazılmış adıdır, defislər _ ilə əvəz olunur:
| Servis | Dəyişən |
|---|---|
api | RIVERVO_API_URL=http://api:8080 |
admin-api | RIVERVO_ADMIN_API_URL=http://admin-api:8080 |
web | RIVERVO_WEB_URL=http://web:8080 |
search (hazır Docker image-dən, port 7700) | RIVERVO_SEARCH_URL=http://search:7700 |
- Servis öz ünvanı üçün dəyişən almır.
- Verilənlər bazaları və Valkey qoşulma ünvanı olan öz
RIVERVO_<NAME>_URLdəyişənini saxlayır. Tətbiq daxilində servis adları unikaldır, ona görə dəyişən adları heç vaxt üst-üstə düşmür. - Dəyişənlər Dəyişənlər bölməsində Avtomatik təyin olunur siyahısında göstərilir. İstənilən avtomatik dəyişəndə olduğu kimi, eyni adlı öz dəyişəniniz (və ya ümumi dəyişən) onu əvəz edir — ətraflı: Mühit dəyişənləri.
- Dəyişənlər servisə növbəti yerləşdirmədə çatır. Yeni veb servis əlavə etdikdə və ya servisin adını dəyişdikdə digər servislər yeni və ya dəyişmiş dəyişəni öz növbəti yerləşdirmələrində alır. Onları yenidən yerləşdirin, məsələn,
rivervo deploy <app> --no-buildəmri ilə — işləyən versiya yeni yığım olmadan, yeni dəyişənlərlə yenidən işə düşür.
«Yalnız daxili» servislər
Yalnız tətbiqin digər servislərinin müraciət etdiyi veb servisin — saytınızın arxasındakı API-nin, idarəetmə hissəsinin, axtarış sisteminin — internetdə olmasına ehtiyac yoxdur. Onu Yalnız daxili rejiminə keçirin:
| Xarici ünvan | Yalnız daxili | |
|---|---|---|
İnternetdə https://<name>.rivervo.app ünvanı | var | yoxdur |
| Öz domenləriniz | var | yoxdur |
| Branch önizləmələri | var | yoxdur |
| Digər servislər üçün daxili ünvan | var | var |
| Bir neçə nüsxə və avtomatik miqyaslama, jurnal, monitorinq, işləkliyin yoxlanması | var | var |
Yalnız daxili servis digər servislər kimi işləyir; ona yalnız həmin tətbiqin digər servisləri müraciət edə bilər.
Servis yaradılarkən seçim
Veb servis yaradarkən — o cümlədən yeni tətbiqin ilk servisini repozitoriyadan, şablondan və ya hazır Docker image-dən yaradarkən — Xarici ünvan və ya Yalnız daxili seçin. Əvvəlcədən heç nə seçilmir, qərar həmişə Sizindir. Fon proseslərinin, planlaşdırılmış tapşırıqların və verilənlər bazalarının xarici ünvanı olmur, ona görə onlar üçün bu seçim göstərilmir.
Bu seçim yaranmazdan əvvəl yaradılmış servislərin xarici ünvanı saxlanılır.
Sonradan dəyişdirmə
Servis → Parametrlər → Xarici ünvan: açarı dəyişin və təsdiqləyin. Bunu yalnız tətbiqin Administratoru və ya hesab sahibi dəyişə bilər. Heç nə yenidən başladılmır.
- Servisə domen qoşulduğu müddətdə onu «Yalnız daxili» rejiminə keçirmək mümkün deyil — əvvəlcə domenləri onun Domenlər bölməsində silin. Önizləmələr də əvvəlcə söndürülməlidir.
- Xarici ünvan yenidən aktivləşdirildikdə servis əvvəlki
https://<name>.rivervo.appünvanını geri alır. Sertifikatın verilməsi təxminən bir dəqiqə çəkə bilər. - Yalnız daxili servisə domen əlavə etmək mümkün deyil — əvvəlcə onun xarici ünvanını aktivləşdirin.
Yalnız daxili servisdə Terminal bölməsi digər servislərdəki kimi işləyir.
Asinxron əlaqə
Yuxarıdakı sorğular cavab gözləyir. Servis işi ötürüb öz işinə davam etməlidirsə — fon tapşırıqları, bir neçə servisin reaksiya verdiyi hadisələr — mesajları növbə və ya mesaj brokeri vasitəsilə göndərin: Valkey, NATS və ya RabbitMQ. Ətraflı: Hadisələr və növbələr.
Bir neçə nüsxə
Müraciət etdiyiniz servis bir neçə nüsxə ilə işləyirsə, onun daxili adı bütün işləyən nüsxələrinə aparır və bağlantılar onlar arasında paylanır.
Bağlantıları açıq saxlayan və təkrar istifadə edən müştəri (keep-alive bağlantı hovuzu) sorğularını eyni nüsxəyə göndərməyə davam edə bilər; yeni bağlantılar yenidən paylanır. Bu, normaldır və heç bir ayar tələb etmir.
Vaxt limitləri və təkrar cəhdlər
Yerləşdirmə zamanı və ya avtomatik miqyaslama nüsxəni dayandırdıqda icra olunan sorğu xəta ilə bitə bilər. İki vərdiş servislər arasındakı sorğuları etibarlı edir:
- Qısa vaxt limiti — bir neçə saniyə. Belə olduqda sorğu düşdüyü nüsxə dayanarkən gözləmədə qalmır.
- Təkrarlanması təhlükəsiz olan sorğular —
GETilə məlumatların oxunması — üçün qısa fasilə ilə bir-iki təkrar cəhd. API-niz təkrar sorğunu yenisindən ayıra bilmirsə, məlumatları dəyişən sorğuları (ödənişlər, sifarişlər) təkrarlamayın.
Nümunə: Node.js
const api = process.env.RIVERVO_API_URL
async function getWithRetry(url, attempts = 3) {
for (let i = 1; ; i++) {
try {
const res = await fetch(url, { signal: AbortSignal.timeout(5000) })
if (res.status < 500 || i === attempts) return res
} catch (err) {
if (i === attempts) throw err
}
await new Promise((resolve) => setTimeout(resolve, 200 * i))
}
}
const res = await getWithRetry(`${api}/orders`)
const orders = await res.json()Nümunə: Laravel
Ünvanı config/services.php faylında göstərin:
'api' => [
'url' => env('RIVERVO_API_URL'),
],Sonra onu config() ilə oxuyun. İşləyən mühitdə konfiqurasiya keşlənir və konfiqurasiya fayllarından kənarda çağırılan env() boş dəyər qaytarır:
use Illuminate\Support\Facades\Http;
$orders = Http::timeout(5)
->retry(2, 200)
->get(config('services.api.url').'/orders')
->json();timeout(5) ən çox 5 saniyə gözləyir; retry(2, 200) aralarında 200 ms fasilə ilə 2 cəhdədək edir.
Nümunə: Python
import os
import requests
API = os.environ["RIVERVO_API_URL"]
orders = requests.get(f"{API}/orders", timeout=5).json()GET üçün təkrar cəhdlərlə:
import os
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
API = os.environ["RIVERVO_API_URL"]
session = requests.Session()
retry = Retry(total=2, backoff_factor=0.2, allowed_methods=["GET"], status_forcelist=[502, 503, 504])
session.mount("http://", HTTPAdapter(max_retries=retry))
orders = session.get(f"{API}/orders", timeout=5).json()Uğursuz GET sorğusu — bağlantı xətası və ya 502, 503, 504 cavabı — hər dəfə artan qısa fasilə ilə 2 dəfəyədək təkrarlanır.
Komanda sətri və Rivervo MCP
rivervo appsvə servis haqqında məlumat hər veb servisin daxili ünvanını və onun xarici ünvanının olub-olmadığını göstərir.rivervo services set-public <service> on|offxarici ünvanı aktivləşdirir və ya söndürür. Bunun üçün Administrator rolu və Tam giriş səviyyəli token lazımdır.- Rivervo MCP daxilində eyni əməliyyatı
set_public_addressaləti yerinə yetirir.
Tokenlər və komanda sətri haqqında: Proqramçı alətləri.