Proxy inverso no Azure Service FabricReverse proxy in Azure Service Fabric

Proxy inverso integrado do Azure Service Fabric ajuda a microsserviços em execução no cluster do Service Fabric detetar e comunicar com outros serviços que têm pontos finais de http.Reverse proxy built into Azure Service Fabric helps microservices running in a Service Fabric cluster discover and communicate with other services that have http endpoints.

Modelo de comunicação de MicrosserviçosMicroservices communication model

Microsserviços no Service Fabric execute num subconjunto de nós do cluster e podem migrar entre os nós por vários motivos.Microservices in Service Fabric run on a subset of nodes in the cluster and can migrate between the nodes for various reasons. Como resultado, podem alterar dinamicamente os pontos finais para microsserviços.As a result, the endpoints for microservices can change dynamically. Para detetar e comunicar com outros serviços do cluster, os microsserviços precisa passar os seguintes passos:To discover and communicate with other services in the cluster, microservice must go through the following steps:

  1. Resolva a localização de serviço através do serviço de nomenclatura.Resolve the service location through the naming service.
  2. Liga ao serviço.Connect to the service.
  3. Encapsular os passos anteriores num loop que implementa a resolução de serviço e tente novamente as políticas para aplicar em falhas de ligaçãoWrap the preceding steps in a loop that implements service resolution and retry policies to apply on connection failures

Para obter mais informações, consulte Connect e comunicar com serviços.For more information, see Connect and communicate with services.

Comunicar utilizando o proxy inversoCommunicating by using the reverse proxy

Proxy inverso é um serviço que é executado em cada nó e lida com a resolução do ponto de extremidade, tentativas automáticas e outras falhas de ligação em nome dos serviços de cliente.Reverse proxy is a service that runs on every node and handles endpoint resolution, automatic retry, and other connection failures on behalf of client services. Proxy inverso pode ser configurado para aplicar várias políticas, como ele lida com pedidos de serviços do cliente.Reverse proxy can be configured to apply various policies as it handles requests from client services. Utilizar um proxy inverso, permite que o serviço de cliente utilizar quaisquer bibliotecas de comunicação do lado do cliente HTTP e não requerem resolução especial e repetir a lógica no serviço.Using a reverse proxy allows the client service to use any client-side HTTP communication libraries and does not require special resolution and retry logic in the service.

Proxy inverso expõe um ou mais pontos finais no nó local para serviços de cliente a utilizar para enviar pedidos para outros serviços.Reverse proxy exposes one or more endpoints on local node for client services to use for sending requests to other services.

Comunicação interna

Nota

Plataformas suportadasSupported Platforms

Atualmente, o proxy inverso no Service Fabric suporta as seguintes plataformasReverse proxy in Service Fabric currently supports the following platforms

  • Cluster do Windows: Windows 8 e posterior ou Windows Server 2012 e versões posteriorWindows Cluster: Windows 8 and later or Windows Server 2012 and later
  • Cluster do Linux: Proxy inverso não está atualmente disponível para clusters do LinuxLinux Cluster: Reverse Proxy is not currently available for Linux clusters

Atingir microsserviços de fora do clusterReaching microservices from outside the cluster

O modelo de comunicação externa padrão para microsserviços é um modelo de participação ativa em que cada serviço não é possível aceder diretamente a partir de clientes externos.The default external communication model for microservices is an opt-in model where each service cannot be accessed directly from external clients. O Azure Load Balancer, que é um limite de rede entre os microsserviços e clientes externos, executa a tradução de endereços de rede e encaminha solicitações externas para pontos de extremidade IP: porta interna.Azure Load Balancer, which is a network boundary between microservices and external clients, performs network address translation and forwards external requests to internal IP:port endpoints. Para tornar o ponto final de um microsserviço diretamente acessível aos clientes externos, primeiro tem de configurar o Balanceador de carga para encaminhar o tráfego para cada porta que o serviço utiliza no cluster.To make a microservice's endpoint directly accessible to external clients, you must first configure Load Balancer to forward traffic to each port that the service uses in the cluster. Além disso, a maioria dos microsserviços, especialmente os microsserviços com estado, não vivem em todos os nós do cluster.Furthermore, most microservices, especially stateful microservices, don't live on all nodes of the cluster. Os microsserviços podem se mover entre nós numa ativação pós-falha.The microservices can move between nodes on failover. Nesses casos, o Balanceador de carga não consegue determinar com eficiência a localização do nó de destino das réplicas para que encaminhe tráfego.In such cases, Load Balancer cannot effectively determine the location of the target node of the replicas to which it should forward traffic.

Atingir microsserviços através do proxy inverso de fora do clusterReaching microservices via the reverse proxy from outside the cluster

Em vez de configurar a porta de um serviço individual no balanceador de carga, pode configurar apenas a porta do proxy reverso no balanceador de carga.Instead of configuring the port of an individual service in Load Balancer, you can configure just the port of the reverse proxy in Load Balancer. Esta configuração permite que os clientes fora do cluster a alcançar serviços dentro do cluster utilizando o proxy inverso sem configuração adicional.This configuration lets clients outside the cluster reach services inside the cluster by using the reverse proxy without additional configuration.

Comunicação externa

Aviso

Quando configura a porta do proxy inverso no balanceador de carga, todos os microsserviços no cluster que expõem um ponto de extremidade HTTP são endereçáveis a partir de fora do cluster.When you configure the reverse proxy's port in Load Balancer, all microservices in the cluster that expose an HTTP endpoint are addressable from outside the cluster. Isso significa que os microsserviços devem ser interno podem ser Detetáveis por um determinado utilizador mal intencionado.This means that microservices meant to be internal may be discoverable by a determined malicious user. Isso apresenta potencialmente sérias vulnerabilidades que podem ser exploradas; Por exemplo:This potentially presents serious vulnerabilities that can be exploited; for example:

  • Um utilizador mal intencionado pode iniciar um ataque de negação de serviço chamando um serviço interno que não tenha uma superfície de ataque suficientemente fortalecidos repetidamente.A malicious user may launch a denial of service attack by repeatedly calling an internal service that does not have a sufficiently hardened attack surface.
  • Um utilizador mal intencionado pode enviar pacotes com formato incorreto para um serviço interno, resultando em comportamentos indesejados.A malicious user may deliver malformed packets to an internal service resulting in unintended behavior.
  • Um serviço devem ser interno pode retornar informações confidenciais ou privadas, que não se destina a ser exposto aos serviços fora do cluster, expondo, portanto, essas informações confidenciais para um utilizador mal intencionado.A service meant to be internal may return private or sensitive information not intended to be exposed to services outside the cluster, thus exposing this sensitive information to a malicious user.

Certifique-se totalmente entender e atenuar as possíveis ramificações de segurança do cluster e as aplicações em execução, antes de fazer a porta de proxy inverso pública.Make sure you fully understand and mitigate the potential security ramifications for your cluster and the apps running on it, before you make the reverse proxy port public.

Formato URI para abordar os serviços ao utilizar o proxy inversoURI format for addressing services by using the reverse proxy

O proxy inverso usa um formato de identifier (URI) de recurso uniforme específico para identificar a partição de serviço ao qual a solicitação de entrada deve ser reencaminhada:The reverse proxy uses a specific uniform resource identifier (URI) format to identify the service partition to which the incoming request should be forwarded:

http(s)://<Cluster FQDN | internal IP>:Port/<ServiceInstanceName>/<Suffix path>?PartitionKey=<key>&PartitionKind=<partitionkind>&ListenerName=<listenerName>&TargetReplicaSelector=<targetReplicaSelector>&Timeout=<timeout_in_seconds>
  • http(s): O proxy inverso pode ser configurado para aceitar o tráfego HTTP ou HTTPS.http(s): The reverse proxy can be configured to accept HTTP or HTTPS traffic. Para o encaminhamento de HTTPS, consulte ligar a um serviço seguro com o proxy inverso assim que tiver a configuração de proxy inverso para escutar o HTTPS.For HTTPS forwarding, refer to Connect to a secure service with the reverse proxy once you have reverse proxy setup to listen on HTTPS.

  • Nome de domínio completamente qualificado (FQDN) do cluster | interní IP adresa: Para clientes externos, pode configurar o proxy inverso para que seja acessível por meio do domínio do cluster, como mycluster.eastus.cloudapp.azure.com.Cluster fully qualified domain name (FQDN) | internal IP: For external clients, you can configure the reverse proxy so that it is reachable through the cluster domain, such as mycluster.eastus.cloudapp.azure.com. Por predefinição, o proxy inverso é executado em cada nó.By default, the reverse proxy runs on every node. Para o tráfego interno, o proxy inverso pode ser contatado em localhost ou em qualquer IP interno do nó, como 10.0.0.1.For internal traffic, the reverse proxy can be reached on localhost or on any internal node IP, such as 10.0.0.1.

  • Porta: Esta é a porta, de como 19081, que foi especificada para o proxy inverso.Port: This is the port, such as 19081, that has been specified for the reverse proxy.

  • ServiceInstanceName: Este é o nome completamente qualificado da instância do serviço implementado que está a tentar acessar sem o "fabric: /" esquema.ServiceInstanceName: This is the fully-qualified name of the deployed service instance that you are trying to reach without the "fabric:/" scheme. Por exemplo, para aceder a fabric: / myapp/myservice/ serviço, usaria myapp/meuserviço.For example, to reach the fabric:/myapp/myservice/ service, you would use myapp/myservice.

    O nome da instância de serviço diferencia maiúsculas de minúsculas.The service instance name is case-sensitive. Utilizar uma maiúsculas/minúsculas diferentes para o nome de instância de serviço no URL faz com que os pedidos a falhar com 404 (não encontrado).Using a different casing for the service instance name in the URL causes the requests to fail with 404 (Not Found).

  • Caminho de sufixo: Este é o caminho de URL real, como myapi/valores/Adicionar/3, para o serviço que deseja se conectar.Suffix path: This is the actual URL path, such as myapi/values/add/3, for the service that you want to connect to.

  • PartitionKey: Para um serviço particionado, esta é a chave de partição calculada da partição que pretende aceder.PartitionKey: For a partitioned service, this is the computed partition key of the partition that you want to reach. Tenha em atenção que se trata não a GUID de ID de partição.Note that this is not the partition ID GUID. Este parâmetro não é necessário para serviços que utilizam o esquema de partição singleton.This parameter is not required for services that use the singleton partition scheme.

  • PartitionKind: Este é o esquema de partição de serviço.PartitionKind: This is the service partition scheme. Isso pode ser 'Int64Range' ou "Com o nome".This can be 'Int64Range' or 'Named'. Este parâmetro não é necessário para serviços que utilizam o esquema de partição singleton.This parameter is not required for services that use the singleton partition scheme.

  • ListenerName os pontos de extremidade do serviço têm o formato {"Pontos finais": {"Listener1": "Endpoint1", "Listener2": "Endpoint2"...}}.ListenerName The endpoints from the service are of the form {"Endpoints":{"Listener1":"Endpoint1","Listener2":"Endpoint2" ...}}. Quando o serviço expõe vários pontos de extremidade, identifica o ponto final que o pedido de cliente deve ser reencaminhado.When the service exposes multiple endpoints, this identifies the endpoint that the client request should be forwarded to. Isso pode ser omitido se o serviço tiver apenas um serviço de escuta.This can be omitted if the service has only one listener.

  • TargetReplicaSelector esta ação Especifica como a réplica de destino ou a instância deve ser selecionada.TargetReplicaSelector This specifies how the target replica or instance should be selected.

    • Quando o serviço de destino está com monitoração de estado, o TargetReplicaSelector pode ser um dos seguintes: 'PrimaryReplica', 'RandomSecondaryReplica' ou 'RandomReplica'.When the target service is stateful, the TargetReplicaSelector can be one of the following: 'PrimaryReplica', 'RandomSecondaryReplica', or 'RandomReplica'. Se este parâmetro não for especificado, a predefinição é 'PrimaryReplica'.When this parameter is not specified, the default is 'PrimaryReplica'.
    • Quando o serviço de destino está sem monitoração de estado, o proxy inverso escolhe uma instância aleatória da partição para encaminhar a solicitação ao serviço.When the target service is stateless, reverse proxy picks a random instance of the service partition to forward the request to.
  • Tempo limite: Esta ação Especifica o tempo limite do pedido HTTP criado pelo proxy inverso para o serviço em nome do pedido do cliente.Timeout: This specifies the timeout for the HTTP request created by the reverse proxy to the service on behalf of the client request. O valor predefinido é de 60 segundos.The default value is 60 seconds. Este é um parâmetro opcional.This is an optional parameter.

Exemplo de utilizaçãoExample usage

Por exemplo, vamos dar a fabric: / MyApp/Meuserviço serviço que abre um serviço de escuta HTTP no seguinte URL:As an example, let's take the fabric:/MyApp/MyService service that opens an HTTP listener on the following URL:

http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/

Seguem-se os recursos para o serviço:Following are the resources for the service:

  • /index.html
  • /api/users/<userId>

Se o serviço utiliza o singleton a criação de partições de esquema, o PartitionKey e PartitionKind parâmetros de cadeia de caracteres de consulta não são necessários, e o serviço pode ser contatado através do gateway como:If the service uses the singleton partitioning scheme, the PartitionKey and PartitionKind query string parameters are not required, and the service can be reached by using the gateway as:

  • Externamente: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyServiceExternally: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService
  • Internamente: http://localhost:19081/MyApp/MyServiceInternally: http://localhost:19081/MyApp/MyService

Se o serviço usa o esquema de particionamento de Int64 uniforme, o PartitionKey e PartitionKind parâmetros de cadeia de caracteres de consulta tem de ser utilizados para chegar a uma partição do serviço:If the service uses the Uniform Int64 partitioning scheme, the PartitionKey and PartitionKind query string parameters must be used to reach a partition of the service:

  • Externamente: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64RangeExternally: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range
  • Internamente: http://localhost:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64RangeInternally: http://localhost:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range

Para aceder os recursos que o serviço expõe, basta coloca o caminho de recurso após o nome do serviço no URL:To reach the resources that the service exposes, simply place the resource path after the service name in the URL:

  • Externamente: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService/index.html?PartitionKey=3&PartitionKind=Int64RangeExternally: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService/index.html?PartitionKey=3&PartitionKind=Int64Range
  • Internamente: http://localhost:19081/MyApp/MyService/api/users/6?PartitionKey=3&PartitionKind=Int64RangeInternally: http://localhost:19081/MyApp/MyService/api/users/6?PartitionKey=3&PartitionKind=Int64Range

O gateway, em seguida, irá reencaminhar estes pedidos para o URL do serviço:The gateway will then forward these requests to the service's URL:

  • 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

Um tratamento especial para o compartilhamento de porta de serviçosSpecial handling for port-sharing services

O proxy inverso do Service Fabric tenta resolver um endereço de serviço novamente e repita o pedido quando não é possível aceder um serviço.The Service Fabric reverse proxy attempts to resolve a service address again and retry the request when a service cannot be reached. Em geral, quando não é possível aceder um serviço, a instância de serviço ou a réplica foi movido para um nó diferente como parte do seu ciclo de vida normal.Generally, when a service cannot be reached, the service instance or replica has moved to a different node as part of its normal lifecycle. Quando isto acontecer, o proxy inverso poderá receber um erro de ligação de rede que indica que um ponto final já não está aberto no endereço resolvido originalmente.When this happens, the reverse proxy might receive a network connection error indicating that an endpoint is no longer open on the originally resolved address.

No entanto, as réplicas ou instâncias de serviço pode partilhar um processo de host e também pode partilhar uma porta quando alojadas por um servidor web baseado em http. sys, incluindo:However, replicas or service instances can share a host process and might also share a port when hosted by an http.sys-based web server, including:

Nesta situação, é provável que o servidor web está disponível no processo do host e a responder a pedidos, mas a instância de serviço resolvidos ou a réplica já não está disponível no anfitrião.In this situation, it is likely that the web server is available in the host process and responding to requests, but the resolved service instance or replica is no longer available on the host. Neste caso, o gateway irá receber uma resposta HTTP 404 do servidor web.In this case, the gateway will receive an HTTP 404 response from the web server. Portanto, uma resposta HTTP 404 pode ter dois significados diferentes:Thus, an HTTP 404 response can have two distinct meanings:

  • Caso #1: O endereço do serviço está correto, mas o recurso que o usuário solicitou não existe.Case #1: The service address is correct, but the resource that the user requested does not exist.
  • Caso #2: O endereço do serviço está incorreto, e o recurso que o usuário solicitou pode existir num nó diferente.Case #2: The service address is incorrect, and the resource that the user requested might exist on a different node.

O primeiro caso é um HTTP 404 normal, que é considerado um erro de utilizador.The first case is a normal HTTP 404, which is considered a user error. No entanto, no segundo caso, o utilizador solicitou um recurso que existem.However, in the second case, the user has requested a resource that does exist. O proxy inverso não foi possível localizá-la porque o próprio serviço foi movido.The reverse proxy was unable to locate it because the service itself has moved. O proxy inverso tem de resolver o endereço novamente e repita o pedido.The reverse proxy needs to resolve the address again and retry the request.

O proxy inverso, portanto, precisa de uma maneira para distinguir entre esses dois casos.The reverse proxy thus needs a way to distinguish between these two cases. Para fazer essa distinção, uma sugestão do servidor é necessária.To make that distinction, a hint from the server is required.

  • Por predefinição, o proxy inverso pressupõe caso #2 e tenta resolver e emitir o pedido novamente.By default, the reverse proxy assumes case #2 and attempts to resolve and issue the request again.

  • Para indicar caso #1 para o proxy inverso, o serviço deve retornar o seguinte cabeçalho de resposta HTTP:To indicate case #1 to the reverse proxy, the service should return the following HTTP response header:

    X-ServiceFabric : ResourceNotFound

Este cabeçalho de resposta HTTP indica uma situação de HTTP 404 normal em que o recurso solicitado não existe e o proxy inverso não irá tentar resolver o endereço do serviço novamente.This HTTP response header indicates a normal HTTP 404 situation in which the requested resource does not exist, and the reverse proxy will not attempt to resolve the service address again.

Tratamento especial para serviços em execução em contentoresSpecial handling for services running in containers

Para serviços em execução no interior de contentores, pode utilizar a variável de ambiente Fabric_NodeIPOrFQDN construir o inverter o URL de proxy como no seguinte código:For services running inside containers, you can use the environment variable, Fabric_NodeIPOrFQDN to construct the reverse proxy URL as in the following code:

    var fqdn = Environment.GetEnvironmentVariable("Fabric_NodeIPOrFQDN");
    var serviceUrl = $"http://{fqdn}:19081/DockerSFApp/UserApiContainer";

Para o cluster local, Fabric_NodeIPOrFQDN está definido como "localhost" por predefinição.For the local cluster, Fabric_NodeIPOrFQDN is set to "localhost" by default. Inicie o cluster local com o -UseMachineName parâmetro para se certificar de que os contentores podem entrar em execução no nó de proxy inverso.Start the local cluster with the -UseMachineName parameter to make sure containers can reach reverse proxy running on the node. Para obter mais informações, consulte configurar o seu ambiente de desenvolvimento para depurar contentores.For more information, see Configure your developer environment to debug containers.

Serviços do Service Fabric que são executados dentro de contentores do Docker Compose requerem um especial docker-Compose portas secção http: ou https: configuração.Service Fabric services that run within Docker Compose containers require a special docker-compose.yml Ports section http: or https: configuration. Para obter mais informações, consulte suporte de implementação do Docker Compose no Azure Service Fabric.For more information, see Docker Compose deployment support in Azure Service Fabric.

Passos SeguintesNext steps