← Cloudflare Workers / workers / runtime-apis / bindings
Service bindings
O Service bindings
Service bindings umožňují jednomu Workeru volat druhý, aniž by musel procházet přes veřejně dostupnou URL. Service binding umožňuje Workeru A zavolat metodu na Workeru B, nebo přeposlat požadavek z Workeru A na Worker B.
Service bindings poskytují stejné oddělení odpovědností jako mikroslužby nebo architektury orientované na služby, ale bez bolestivé konfigurace, výkonnostní režie nebo nutnosti učit se protokoly RPC.
- Service bindings jsou rychlé. Při použití Service Bindings nevzniká žádná dodatečná režie ani zpoždění. Oba Workery ve výchozím nastavení běží ve stejném vlákně stejného serveru Cloudflare. A když povolíte Smart Placement, každý Worker běží v optimální lokalitě pro celkový výkon.
- Service bindings nejsou jen HTTP. Worker A může poskytovat metody, které může Worker B volat přímo. Komunikace mezi službami vyžaduje jen napsání metod a tříd v JavaScriptu.
- Service bindings nezvyšují náklady. Funkcionalitu můžete rozdělit do více Workerů bez dodatečných nákladů. Další informace najdete v části ceny pro Service Bindings.
Service bindings se běžně používají k:
- Poskytněte sdílenou interní službu více Workers. Můžete například nasadit autentizační službu jako samostatný Worker a nechat libovolný počet dalších Workerů s ním komunikovat přes Service bindings.
- Izolujte služby od veřejného internetu. Můžete nasadit Worker, který není dostupný z veřejného internetu a lze k němu přistupovat pouze přes explicitní Service binding deklarovaný jiným Workerem.
- Umožňuje týmům nasazovat kód nezávisle na sobě. Tým A může nasazovat svůj Worker podle vlastního harmonogramu vydání a tým B může svůj Worker nasazovat samostatně.
Konfigurace
Service binding přidáte úpravou Konfigurační soubor Wrangler volajícího: Workeru, který má mít možnost iniciovat požadavky.
Pokud chcete, aby Worker A mohl volat Worker B, přidejte do Konfigurační soubor Wrangler pro Worker A:
{
"services": [
{
"binding": "<BINDING_NAME>",
"service": "<WORKER_NAME>"
}
]
}[[services]]
binding = "<BINDING_NAME>"
service = "<WORKER_NAME>"binding: Název klíče, který chcete zpřístupnit naenvobjekt.service: Název cílového Workeru, se kterým chcete komunikovat. Tento Worker musí být ve vašem účtu Cloudflare.
Rozhraní
Worker A, který deklaruje Service binding na Worker B, může Worker B volat dvěma různými způsoby:
- RPC vám umožňuje komunikovat mezi Workery pomocí funkčních volání, která si sami definujete. Například
await env.BINDING_NAME.myMethod(arg1). Toto doporučujeme pro většinu případů použití, protože si tak můžete vytvořit vlastní interní API, které váš Worker zpřístupní ostatním Workerům. - HTTP vám umožňuje komunikovat mezi Workery voláním
fetch()handler od jiných Workers a odesíláRequestobjekty a přijímáníResponseobjekty. Napříkladenv.BINDING_NAME.fetch(request).
Příklad: vytvořte první Service binding pomocí RPC
Tento příklad rozšiřuje WorkerEntrypoint třída pro podporu Service bindings založených na RPC.
Nejprve vytvořte Worker, se kterým chcete komunikovat. Budeme mu říkat "Worker B". Worker B zpřístupňuje veřejnou metodu add(a, b):
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "worker_b",
"main": "./src/workerB.js"
}"$schema" = "./node_modules/wrangler/config-schema.json"
name = "worker_b"
main = "./src/workerB.js"import { WorkerEntrypoint } from "cloudflare:workers";
export default class WorkerB extends WorkerEntrypoint {
// Currently, entrypoints without a named handler are not supported
async fetch() {
return new Response(null, { status: 404 });
}
async add(a, b) {
return a + b;
}
}Dále vytvořte Worker, který bude volat Worker B. Budeme mu říkat "Worker A". Worker A deklaruje binding na Worker B, čímž získává oprávnění volat veřejné metody Workeru B.
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "worker_a",
"main": "./src/workerA.js",
"services": [
{
"binding": "WORKER_B",
"service": "worker_b"
}
]
}"$schema" = "./node_modules/wrangler/config-schema.json"
name = "worker_a"
main = "./src/workerA.js"
[[services]]
binding = "WORKER_B"
service = "worker_b"export default {
async fetch(request, env) {
const result = await env.WORKER_B.add(1, 2);
return new Response(result);
},
};Chcete-li spustit Worker A i Worker B v místním vývojovém prostředí, musíte spustit dvě instance Wrangler ve vašem terminálu. Pro každý Worker otevřete nový terminál a spusťte npx wrangler@latest dev.
Každý Worker se nasazuje samostatně.
Životní cyklus
The Service bindings API is asynchronous, you must await libovolnou metodu, kterou zavoláte. Pokud Worker A vyvolá Worker B prostřednictvím Service bindingu a Worker A nepočká na dokončení Workeru B, Worker B se předčasně ukončí.
Více informací o životním cyklu volání Workeru přes Service Binding pomocí RPC najdete v Životní cyklus RPC dokumentaci.
Lokální vývoj
Lokální vývoj je podporován pro Service bindings. Pro každý Worker otevřete nový terminál a použijte wrangler dev v příslušném adresáři. Při spuštění wrangler dev, service bindings se zobrazí jako connected/not connected v závislosti na tom, zda Wrangler najde spuštěnou wrangler dev relaci pro daný Worker. Například:
$ wrangler dev
...
Your worker has access to the following bindings:
- Services:
- SOME_OTHER_WORKER: some-other-worker [connected]
- ANOTHER_WORKER: another-worker [not connected]Wrangler také umožňuje jedním příkazem spustit více Workerů najednou. Chcete-li to vyzkoušet, předejte více -c příznaky Wrangleru, například takto: wrangler dev -c wrangler.json -c ../other-worker/wrangler.json. První konfigurace bude považována za primární workeru, který bude jako obvykle zpřístupněn přes HTTP na http://localhost:8787. Zbývající konfigurační soubory budou považovány za sekundární a bude přístupný pouze prostřednictvím service bindingu z primárního Workeru.
Nasazení
Workers používající Service bindings se nasazují samostatně.
To při prvním nastavení a nasazení znamená, že cílový Worker (Worker B ve výše uvedených příkladech) musí být nasazen dříve než Worker A. Jinak nasazení Workeru A selže, protože Worker A deklaruje binding na Worker B, který ještě neexistuje.
Při provádění změn ve stávajících Workerech byste ve většině případů měli:
- Nejprve nasaďte změny do Workeru B, a to způsobem kompatibilním se stávajícím Workerem A. Do Workeru B můžete například přidat novou metodu.
- Dále nasaďte změny do Workeru A. Můžete například z Workeru A zavolat novou metodu na Workeru B.
- Nakonec odstraňte veškerý nepoužívaný kód, například dříve používanou metodu na Workeru B.
Smart Placement
Smart Placement automaticky umístí váš Worker do optimální lokality, která minimalizuje latenci.
Smart Placement můžete kombinovat se Service bindings a rozdělit svůj Worker na dvě služby:
Viz dokumentace ke Smart Placement další informace.
Limity
Service bindings mají následující limity:
- Každý požadavek na Worker prostřednictvím Service bindingu se počítá do vašeho limit subrequestů.
- Jeden požadavek má nejvýše 32 vyvolání Workeru, přičemž do tohoto limitu se počítá i každé volání přes Service binding. Další volání nad rámec limitu vyvolají výjimku.
- Volání service bindingu se nezapočítává do limity souběžně otevřených připojení