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ə.

5 DƏQ OXUMA

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:

ServisDəyişən
apiRIVERVO_API_URL=http://api:8080
admin-apiRIVERVO_ADMIN_API_URL=http://admin-api:8080
webRIVERVO_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>_URL də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 ünvanYalnız daxili
İnternetdə https://<name>.rivervo.app ünvanıvaryoxdur
Öz domenlərinizvaryoxdur
Branch önizləmələrivaryoxdur
Digər servislər üçün daxili ünvanvarvar
Bir neçə nüsxə və avtomatik miqyaslama, jurnal, monitorinq, işləkliyin yoxlanmasıvarvar

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 — GET ilə 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 apps və 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|off xarici ü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_address aləti yerinə yetirir.

Tokenlər və komanda sətri haqqında: Proqramçı alətləri.

Daha sualınız varmı?

Canlı dəstəklə əlaqə saxlayın — günün istənilən vaxtı 3 dəqiqədən az median cavab müddəti.

Dəstəklə əlaqə