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ásainak felderítéséhez és a velük való kommunikációhoz a mikroszolgáltatásnak a következő 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éseket burkolja egy hurokba, 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 proxyval
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ásoktól érkező kérések 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, hogy az ügyfélszolgáltatások kéréseket küldjenek más szolgáltatásoknak.
Megjegyzés
Támogatott platformok
A Fordított proxy a Service Fabricben jelenleg a következő platformokat támogatja
- Windows-fürt: Windows 8 és újabb, illetve 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 jóváhagyási modell, amelyben az egyes szolgáltatások nem érhetők el közvetlenül külső ügyfelekről. Azure Load Balancer, amely a mikroszolgáltatások és a külső ügyfelek közötti hálózati határ, hálózati címfordítást végez, és külső kéréseket továbbít 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 Load Balancer, hogy a forgalmat a szolgáltatás által 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 a feladatátvétel során a csomópontok között mozoghatnak. Ilyen esetekben 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
Ahelyett, hogy egy adott szolgáltatás portját konfigurálja Load Balancer, csak a fordított proxy portját konfigurálhatja Load Balancer. 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 Load Balancer konfigurálja, a fürt minden olyan mikroszolgáltatása, amely HTTP-végpontot tesz elérhetővé, a fürtön kívülről is kezelhető. Ez azt jelenti, hogy a belsőnek szánt mikroszolgáltatásokat egy meghatározott rosszindulatú felhasználó felderítheti. Ez potenciálisan súlyos biztonsági réseket okozhat, amelyek kihasználhatók; például:
- A rosszindulatú felhasználók szolgáltatásmegtagadásos támadást indíthatnak egy olyan belső szolgáltatás ismételt meghívásával, amely nem rendelkezik megfelelően megkeményített támadási felülettel.
- A rosszindulatú felhasználók helytelen formátumú csomagokat kézbesíthetnek egy belső szolgáltatásnak, ami nem kívánt 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ürtön 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 fordított proxy használatával történő címzéséhez
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 fogadására. HTTPS-továbbítás esetén tekintse meg a Csatlakozás biztonságos szolgáltatáshoz a fordított proxyval című témakört, miután beállította a fordított proxyt a HTTPS figyeléséhez.
A 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 a fordított proxyhoz megadott port (például 19081).
ServiceInstanceName: Ez annak az üzembe helyezett szolgáltatáspéldánynak a teljes neve, amelyet a "háló:/" nélkül próbál elérni Rendszer. A háló:/myapp/myservice/ szolgáltatás eléréséhez például a myapp/myservice értéket kell használnia.
A szolgáltatáspéldány neve megkülönbözteti a kis- és nagybetűk nevét. Ha az URL-címben eltérő burkolatot használ a szolgáltatáspéldány nevére, a kérések 404-gyel meghiúsulnak (nem találhatók).
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 az elérni kívánt partíció számított partíciókulcsa. 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érést továbbítani kell. Ez kihagyható, ha a szolgáltatásnak csak egy figyelője van.
TargetReplicaSelector Ez határozza meg a célreplika vagy -példány kiválasztásának módját.
- 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 határozza meg 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. Az alapértelmezett érték 120 másodperc. Ez egy nem kötelező paraméter.
Példa a használatra
Vegyük például azt a hálót:/MyApp/MyService szolgáltatást, 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ó használatával érhető el a következő módon:
- 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ővé tenni kívánt erőforrások eléréséhez egyszerűen helyezze el az erőforrás elérési útját a szolgáltatás neve után az URL-címben:
- 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 a portmegosztási szolgáltatásokhoz
A Service Fabric fordított proxyja megpróbálja újra feloldani a szolgáltatás címét, és újrapróbálkozhat a kéréssel, ha egy szolgáltatás nem érhető el. Általában, 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 lett áthelyezve. Ha ez történik, a fordított proxy hálózati kapcsolati hibát kaphat, amely azt jelzi, hogy egy végpont már nem nyílik meg az eredetileg megoldott címen.
A replikák és a szolgáltatáspéldányok azonban megoszthatnak egy gazdagépfolyamatot, és egy portot is megoszthatnak egy http.sys-alapú webkiszolgáló üzemeltetésekor, beleértve a következőket:
Ebben az esetben valószínű, hogy a webkiszolgáló elérhető a gazdafolyamatban, és válaszol a kérésekre, 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álasz két különböző jelentéssel rendelkezhet:
- 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 találta meg, mert maga a szolgáltatás áthelyeződött. A fordított proxynak újra fel 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 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 feltételezi a 2. esetet, és megpróbálja megoldani és újból kiadni a kérést.
Ha az 1. esetet a fordított proxyra szeretné jelezni, 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ó Fabric_NodeIPOrFQDN
használatával a fordított proxy URL-címét az alábbi kódban leírtak szerint hozhatja létre:
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ékre van á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 szakaszra van szükség: http: vagy https: konfiguráció. További információ: Docker Compose üzembehelyezési támogatás 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 proxy eseményeinek diagnosztizálása
- Tekintse meg a gitHubon található mintaprojekt szolgáltatásai közötti HTTP-kommunikációt szemléltető példát.
- Remote procedure calls with Reliable Services remoting
- Az OWIN-t használó webes API a Reliable Servicesben
- WCF-kommunikáció a Reliable Services használatával