Fordított proxy az Azure Service Fabricben
Az Azure Service Fabricbe beépített fordított proxy segít a Service Fabric-fürtben futó mikroszolgáltatások felderítésében és a http-végpontokkal rendelkező más szolgáltatásokkal való kommunikációban.
Mikroszolgáltatások kommunikációs modellje
A Service Fabric mikroszolgáltatásai a fürt csomópontjainak egy részhalmazán futnak, és különböző okokból migrálhatók a csomópontok között. Ennek eredményeképpen a mikroszolgáltatások végpontjai dinamikusan változhatnak. A fürt más szolgáltatásaival való kommunikációhoz a mikroszolgáltatásnak az alábbi lépéseket kell végrehajtania:
- A szolgáltatás helyének feloldása az elnevezési szolgáltatáson keresztül.
- Csatlakozzon a szolgáltatáshoz.
- Az előző lépések körbefuttatása egy olyan hurokban, amely szolgáltatásfeloldási és újrapróbálkozási szabályzatokat implementál a kapcsolati hibákra való alkalmazáshoz
További információ: Csatlakozás és kommunikáció a szolgáltatásokkal.
Kommunikáció fordított proxy használatával
A fordított proxy egy olyan szolgáltatás, amely minden csomóponton fut, és kezeli a végpontfeloldásokat, az automatikus újrapróbálkozási és egyéb csatlakozási hibákat az ügyfélszolgáltatások nevében. A fordított proxy konfigurálható úgy, hogy különböző szabályzatokat alkalmazzon az ügyfélszolgáltatások kéréseinek kezelésekor. Fordított proxy használatával az ügyfélszolgáltatás bármilyen ügyféloldali HTTP-kommunikációs kódtárat használhat, és nem igényel speciális feloldási és újrapróbálkozási logikát a szolgáltatásban.
A fordított proxy egy vagy több végpontot tesz elérhetővé a helyi csomóponton ahhoz, hogy az ügyfélszolgáltatások kéréseket küldjenek más szolgáltatásoknak.
Feljegyzés
Támogatott platformok
A Fordított proxy a Service Fabricben jelenleg az alábbi platformokat támogatja
- Windows-fürt: Windows 8 vagy újabb vagy Windows Server 2012 és újabb
- Linux-fürt: A fordított proxy jelenleg nem érhető el Linux-fürtökhöz
Mikroszolgáltatások elérése a fürtön kívülről
A mikroszolgáltatások alapértelmezett külső kommunikációs modellje egy olyan opt-in modell, amelyben az egyes szolgáltatások nem érhetők el közvetlenül külső ügyfelekről. Az Azure Load Balancer, amely a mikroszolgáltatások és a külső ügyfelek közötti hálózati határ, elvégzi a hálózati címfordítást, és továbbítja a külső kéréseket a belső IP:portvégpontoknak. Ahhoz, hogy egy mikroszolgáltatás végpontja közvetlenül elérhető legyen a külső ügyfelek számára, először konfigurálnia kell a Load Balancert, hogy a forgalmat a fürtben használt portra továbbítsa. A legtöbb mikroszolgáltatás, különösen az állapotalapú mikroszolgáltatások azonban nem a fürt összes csomópontján élnek. A mikroszolgáltatások feladatátvételkor a csomópontok között mozoghatnak. Ilyen esetekben a Load Balancer nem tudja hatékonyan meghatározni azon replikák célcsomópontjának helyét, amelyekre a forgalmat továbbítania kell.
Mikroszolgáltatások elérése fordított proxyn keresztül a fürtön kívülről
A Load Balancerben az egyes szolgáltatások portjának konfigurálása helyett csak a fordított proxy portját konfigurálhatja a Load Balancerben. Ez a konfiguráció lehetővé teszi, hogy a fürtön kívüli ügyfelek további konfiguráció nélkül elérjék a fürtön belüli szolgáltatásokat a fordított proxy használatával.
Figyelmeztetés
Ha a fordított proxy portját konfigurálja a Load Balancerben, a fürt minden olyan mikroszolgáltatása, amely HTTP-végpontot tesz elérhetővé, a fürtön kívülről kezelhető. Ez azt jelenti, hogy a belsőnek szánt mikroszolgáltatások felderíthetők egy meghatározott rosszindulatú felhasználó számára. Ez potenciálisan súlyos biztonsági réseket jelent, amelyeket ki lehet használni; például:
- A rosszindulatú felhasználók szolgáltatásmegtagadási támadást indíthatnak, ha ismételten meghívnak egy belső szolgáltatást, amely nem rendelkezik megfelelően megerősített támadási felülettel.
- A rosszindulatú felhasználók helytelenül formázott csomagokat kézbesíthetnek egy belső szolgáltatásnak, ami nem szándékos viselkedést eredményez.
- A belsőnek szánt szolgáltatások olyan privát vagy bizalmas információkat adhatnak vissza, amelyeket nem a fürten kívüli szolgáltatásoknak kívánnak közzétenni, így ezeket a bizalmas információkat rosszindulatú felhasználónak adhatja ki.
Mielőtt nyilvánossá teszi a fordított proxyportot, győződjön meg arról, hogy teljes mértékben tisztában van a fürt és a rajta futó alkalmazások lehetséges biztonsági következményeival.
URI-formátum a szolgáltatások címzéséhez fordított proxy használatával
A fordított proxy egy adott egységes erőforrás-azonosító (URI) formátumot használ annak a szolgáltatáspartíciónak a azonosításához, amelyre a bejövő kérést továbbítani kell:
http(s)://<Cluster FQDN | internal IP>:Port/<ServiceInstanceName>/<Suffix path>?PartitionKey=<key>&PartitionKind=<partitionkind>&ListenerName=<listenerName>&TargetReplicaSelector=<targetReplicaSelector>&Timeout=<timeout_in_seconds>
http(k): A fordított proxy konfigurálható HTTP- vagy HTTPS-forgalom elfogadására. A HTTPS-továbbításhoz tekintse meg a Connect to a secure service with the reverse proxyt , miután a fordított proxy beállításával figyeli a HTTPS-t.
Fürt teljes tartományneve (FQDN) | belső IP-cím: Külső ügyfelek esetén konfigurálhatja a fordított proxyt úgy, hogy az elérhető legyen a fürttartományon keresztül, például mycluster.eastus.cloudapp.azure.com. Alapértelmezés szerint a fordított proxy minden csomóponton fut. Belső forgalom esetén a fordított proxy elérhető a localhoston vagy bármely belső csomópont IP-címén, például a 10.0.0.1-en.
Port: Ez az a port, például 19081, amely a fordított proxyhoz van megadva.
ServiceInstanceName: Ez annak az üzembe helyezett szolgáltatáspéldánynak a teljes neve, amelyet a "fabric:/" séma nélkül próbál elérni. Ha például el szeretné érni a hálót:/myapp/myservice/szolgáltatás, a myapp/myservice szolgáltatást használná.
A szolgáltatáspéldány neve megkülönbözteti a kis- és nagybetűk nevét. Ha a szolgáltatáspéldány nevének eltérő burkolatát használja az URL-címben, a kérések sikertelenek lesznek a 404-zel (nem található).
Utótag elérési útja: Ez a tényleges URL-elérési út( például myapi/values/add/3) ahhoz a szolgáltatáshoz, amelyhez csatlakozni szeretne.
PartitionKey: Particionált szolgáltatás esetén ez annak a partíciónak a számítási partíciókulcsa, amelyet el szeretne érni. Vegye figyelembe, hogy ez nem a partícióazonosító GUID azonosítója. Ez a paraméter nem szükséges az egyszeri partíciós sémát használó szolgáltatásokhoz.
PartitionKind: Ez a szolgáltatáspartíciós séma. Ez lehet "Int64Range" vagy "Named". Ez a paraméter nem szükséges az egyszeri partíciós sémát használó szolgáltatásokhoz.
ListenerName A szolgáltatás végpontjai {"Endpoints":{"Listener1":"Endpoint1","Listener2":"Endpoint2" ...}} formában vannak. Ha a szolgáltatás több végpontot tesz elérhetővé, ez azonosítja azt a végpontot, amelyre az ügyfélkérelmet továbbítani kell. Ez kihagyható, ha a szolgáltatásnak csak egy figyelője van.
TargetReplicaSelector Ez a célreplika vagy -példány kiválasztásának módját adja meg.
- Ha a célszolgáltatás állapotalapú, a TargetReplicaSelector a következők egyike lehet: "PrimaryReplica", "RandomSecondaryReplica" vagy "RandomReplica". Ha ez a paraméter nincs megadva, az alapértelmezett érték a "PrimaryReplica".
- Ha a célszolgáltatás állapot nélküli, a fordított proxy kiválasztja a szolgáltatáspartíció véletlenszerű példányát a kérés továbbításához.
Időtúllépés: Ez a fordított proxy által a szolgáltatásnak az ügyfélkérés nevében létrehozott HTTP-kérés időtúllépését adja meg. Az alapértelmezett érték 120 másodperc. Ez egy nem kötelező paraméter.
Példa használatra
Vegyük például a hálót:/MyApp/MyService szolgáltatás, amely megnyitja a HTTP-figyelőt a következő URL-címen:
http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/
A szolgáltatás erőforrásai a következők:
/index.html
/api/users/<userId>
Ha a szolgáltatás az egyszeri particionálási sémát használja, a PartitionKey és a PartitionKind lekérdezési sztring paraméterei nem szükségesek, és a szolgáltatás az átjáróval a következőképpen érhető el:
- Külsőleg:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService
- Belsőleg:
http://localhost:19081/MyApp/MyService
Ha a szolgáltatás az Egységes Int64 particionálási sémát használja, a PartitionKey és a PartitionKind lekérdezési sztring paramétereit kell használni a szolgáltatás partíciójának eléréséhez:
- Külsőleg:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range
- Belsőleg:
http://localhost:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range
A szolgáltatás által elérhető erőforrások eléréséhez egyszerűen helyezze az erőforrás elérési útját a szolgáltatás neve után az URL-címre:
- Külsőleg:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService/index.html?PartitionKey=3&PartitionKind=Int64Range
- Belsőleg:
http://localhost:19081/MyApp/MyService/api/users/6?PartitionKey=3&PartitionKind=Int64Range
Az átjáró ezután továbbítja ezeket a kéréseket a szolgáltatás URL-címére:
http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/index.html
http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/api/users/6
Speciális kezelés portmegosztási szolgáltatásokhoz
A Service Fabric fordított proxyja megpróbálja újból feloldani a szolgáltatás címét, és újrapróbálkozza a kérést, ha egy szolgáltatás nem érhető el. Ha egy szolgáltatás nem érhető el, a szolgáltatáspéldány vagy a replika a normál életciklus részeként egy másik csomópontra került. Ilyen esetben a fordított proxy hálózati kapcsolati hibát kaphat, amely azt jelzi, hogy a végpont már nem nyílik meg az eredetileg feloldott címen.
A replikák vagy szolgáltatáspéldányok azonban megoszthatnak egy gazdagépfolyamatot, és egy portot is megoszthatnak, ha egy http.sys-alapú webkiszolgáló üzemelteti, beleértve a következőket:
Ebben az esetben valószínű, hogy a webkiszolgáló elérhető a gazdagép folyamatában, és válaszol a kérelmekre, de a feloldott szolgáltatáspéldány vagy -replika már nem érhető el a gazdagépen. Ebben az esetben az átjáró HTTP 404-választ kap a webkiszolgálótól. Így a HTTP 404-válasznak két különböző jelentése lehet:
- 1. eset: A szolgáltatás címe helyes, de a felhasználó által kért erőforrás nem létezik.
- 2. eset: A szolgáltatás címe helytelen, és a felhasználó által kért erőforrás egy másik csomóponton is létezhet.
Az első eset egy normál HTTP 404, amely felhasználói hibának minősül. A második esetben azonban a felhasználó olyan erőforrást kért, amely létezik. A fordított proxy nem tudta megtalálni, mert maga a szolgáltatás áthelyeződött. A fordított proxynak újra meg kell oldania a címet, és újra meg kell próbálkoznia a kéréssel.
A fordított proxynak tehát meg kell különböztetnie ezt a két esetet. A különbségtételhez egy tippre van szükség a kiszolgálótól.
Alapértelmezés szerint a fordított proxy a 2. esetet feltételezi, és megkísérli feloldani és ismét kiadni a kérést.
Az 1. esetnek a fordított proxyra való jelzéséhez a szolgáltatásnak a következő HTTP-válaszfejlécet kell visszaadnia:
X-ServiceFabric : ResourceNotFound
Ez a HTTP-válaszfejléc egy normál HTTP 404-helyzetet jelez, amelyben a kért erőforrás nem létezik, és a fordított proxy nem próbálja meg újból feloldani a szolgáltatás címét.
Speciális kezelés a tárolókban futó szolgáltatásokhoz
A tárolókon belül futó szolgáltatások esetében a környezeti változóval Fabric_NodeIPOrFQDN
létrehozhatja a fordított proxy URL-címét az alábbi kód szerint:
var fqdn = Environment.GetEnvironmentVariable("Fabric_NodeIPOrFQDN");
var serviceUrl = $"http://{fqdn}:19081/DockerSFApp/UserApiContainer";
A helyi fürt Fabric_NodeIPOrFQDN
esetében alapértelmezés szerint a "localhost" érték van beállítva. Indítsa el a helyi fürtöt a -UseMachineName
paraméterrel, hogy a tárolók elérjék a csomóponton futó fordított proxyt. További információ: A fejlesztői környezet konfigurálása tárolók hibakeresésére.
A Docker Compose-tárolókban futó Service Fabric-szolgáltatásokhoz speciális docker-compose.yml Portok szakasz http: vagy https: konfiguráció szükséges. További információ: Docker Compose üzembe helyezés támogatása az Azure Service Fabricben.
Következő lépések
- Fordított proxy beállítása és konfigurálása fürtön.
- Továbbítás beállítása a HTTP-szolgáltatás fordított proxyval történő biztonságossá tételéhez
- Fordított proxyesemények diagnosztizálása
- Tekintse meg a GitHubon egy mintaprojekt szolgáltatásai közötti HTTP-kommunikációt szemléltető példát.
- Távoli eljáráshívások a Reliable Services újramegjelenítésével
- Az OWIN-t a Reliable Servicesben használó webes API
- WCF-kommunikáció a Reliable Services használatával