Compartilhar via


Tutorial: Conectar-se a um Eureka Server for Spring gerenciado nos Aplicativos de Contêiner do Azure

O Eureka Server for Spring é um registro de serviço que permite que os microsserviços se registrem e descubram outros serviços. O Eureka Server for Spring está disponível como um componente dos Aplicativos de Contêiner do Azure. Você pode associar seu aplicativo de contêiner ao Eureka Server for Spring para registro automático com o servidor Eureka.

Neste tutorial, você aprenderá a:

  • Crie um componente Java do Eureka Server for Spring.
  • Associe o aplicativo de contêiner ao componente Java do Eureka Server for Spring.

Importante

Este tutorial usa serviços que podem afetar sua fatura do Azure. Se você decidir seguir o passo a passo, certifique-se de excluir os recursos apresentados neste artigo para evitar cobranças inesperadas.

Pré-requisitos

Considerações

Ao executar o Eureka Server for Spring nos Aplicativos de Contêiner, observe os seguintes detalhes:

Item Explicação
Escopo O componente Eureka Server for Spring é executado no mesmo ambiente que o aplicativo de contêiner conectado.
Dimensionamento O componente Eureka Server for Spring não pode ser dimensionado. As propriedades de dimensionamento minReplicas e maxReplicas estão definidas como 1. Para obter alta disponibilidade, confira Criar um serviço Eureka altamente disponível em Aplicativos de Contêiner.
Recursos A alocação de recursos de contêiner para o Eureka Server for Spring foi corrigida. O número de núcleos de CPU é de 0,5 e o tamanho da memória é 1 Gi.
Preços A cobrança do Eureka Server for Spring está abaixo dos preços baseados em consumo. Os recursos consumidos pelos componentes Java gerenciados são cobrados de acordo com as taxas de ativo/ocioso. Você pode excluir componentes que não estão mais em uso para interromper a cobrança.
Associação Os aplicativos de contêiner conectam-se a um componente do Eureka Server for Spring por meio de uma associação. As associações injetam as configurações nas variáveis de ambiente do aplicativo de contêiner. Depois que uma associação é estabelecida, o aplicativo de contêiner pode ler os valores de configuração das variáveis de ambiente e se conectar ao componente do Eureka Server for Spring.

Instalação

Antes de começar a trabalhar com o componente do Eureka Server for Spring, você precisa primeiro criar os recursos necessários.

Execute os seguintes comandos para criar seu grupo de recursos em um ambiente de aplicativo de contêiner.

  1. Crie variáveis para dar suporte à configuração do aplicativo. Esses valores são fornecidos para você para os fins desta lição.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export EUREKA_COMPONENT_NAME=eureka
    export APP_NAME=my-eureka-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-eureka-client:latest"
    
    Variável Descrição
    LOCATION O local da região do Azure na qual você deve criar o aplicativo de contêiner e o componente Java.
    ENVIRONMENT O nome do ambiente do aplicativo de contêiner para o aplicativo de demonstração.
    RESOURCE_GROUP O nome do grupo de recursos do Azure para seu aplicativo de demonstração.
    EUREKA_COMPONENT_NAME O nome do componente Java criado para o seu aplicativo de contêiner. Neste caso, você cria um componente Java do Eureka Server for Spring.
    IMAGE A imagem do contêiner usada no seu aplicativo de contêiner.
  2. Entre no Azure com a CLI do Azure.

    az login
    
  3. Crie um grupos de recursos.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Crie o ambiente do aplicativo de contêiner.

    az containerapp env create \
      --name $ENVIRONMENT \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION
    

Criar o componente do Eureka Server para Spring Java.

Agora que você tem um ambiente existente, você pode criar seu aplicativo de contêiner e associá-lo a uma instância de componente Java do Eureka Server for Spring.

  1. Crie o componente Java do Eureka Server for Spring.

    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
    
  2. Opcional: Atualizar a configuração do componente do Eureka Server para Spring Java.

    az containerapp env java-component eureka-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
        --configuration eureka.server.renewal-percent-threshold=0.85 eureka.server.eviction-interval-timer-in-ms=10000
    

Associar seu aplicativo de contêiner ao componente do Eureka Server para Spring Java

  1. Crie o aplicativo de contêiner e associe-o ao componente do Eureka Server for Spring.

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --ingress external \
        --target-port 8080 \
        --bind $EUREKA_COMPONENT_NAME \
        --query properties.configuration.ingress.fqdn
    
  2. Copie a URL do seu aplicativo para um editor de texto para que você possa usá-la em uma próxima etapa.

Retorne ao aplicativo de contêiner no portal. Copie a URL do seu aplicativo para um editor de texto para que você possa usá-la em uma próxima etapa.

Vá para a rota /allRegistrationStatus para exibir todos os aplicativos registrados com o componente do Eureka Server for Spring.

A associação injeta várias configurações no aplicativo como variáveis de ambiente, principalmente a propriedade eureka.client.service-url.defaultZone. Essa propriedade indica o ponto de extremidade interno do componente Java do Eureka Server.

A associação também injeta as seguintes propriedades:

"eureka.client.register-with-eureka":    "true"
"eureka.client.fetch-registry":          "true"
"eureka.instance.prefer-ip-address":     "true"

A propriedade eureka.client.register-with-eureka está definida como true para impor o registro com o servidor Eureka. Esse registro substitui a configuração local em application.properties, do servidor de configuração e assim por diante. Se você quiser defini-lo para false, poderá substituí-lo definindo uma variável de ambiente em seu aplicativo de contêiner.

A propriedade eureka.instance.prefer-ip-address é definida como true devido à regra específica de resolução do sistema de nomes de domínio no ambiente do aplicativo de contêiner. Não modifique esse valor para não interromper a associação.

Opcional: Desvincular o aplicativo de contêiner do componente Java do Eureka Server for Spring

Para remover uma associação de um aplicativo de contêiner, use a opção --unbind .

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

Exibir o aplicativo por meio de um painel

Importante

Para exibir o painel, você precisa ter pelo menos a função Microsoft.App/managedEnvironments/write atribuída à sua conta no recurso de ambiente gerenciado. Você pode atribuir explicitamente a função Owner ou a função Contributor no recurso. Você também pode seguir as etapas para criar uma definição de função personalizada e atribuí-la à sua conta.

  1. Crie uma definição de função personalizada.

    az role definition create --role-definition '{
        "Name": "<YOUR_ROLE_NAME>",
        "IsCustom": true,
        "Description": "Can access managed Java Component dashboards in managed environments",
        "Actions": [
            "Microsoft.App/managedEnvironments/write"
        ],
        "AssignableScopes": ["/subscriptions/<SUBSCRIPTION_ID>"]
    }'
    

    Substitua o espaço reservado <SUBSCRIPTION_ID> no valor AssignableScopes pela ID da assinatura.

  2. Atribua a função personalizada à sua conta em um recurso de ambiente gerenciado.

    Obtenha a ID do recurso do ambiente gerenciado:

    export ENVIRONMENT_ID=$(az containerapp env show \
        --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    
  3. Atribua a função de à sua conta de usuário.

    Antes de executar esse comando, substitua os espaços reservados, indicados pelos colchetes <>, por sua ID de usuário ou de entidade de serviço e pelo nome da função.

    az role assignment create \
        --assignee <USER_OR_SERVICE_PRINCIPAL_ID> \
        --role "<ROLE_NAME>" \
        --scope $ENVIRONMENT_ID
    

    Observação

    O valor <USER_OR_SERVICE_PRINCIPAL_ID> geralmente deve ser a identidade que você usa para acessar o portal do Azure. O valor <ROLE_NAME> é o nome atribuído na etapa 1.

  4. Obtenha a URL do painel de controle do Servidor Eureka para Spring.

    az containerapp env java-component eureka-server-for-spring show \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME \
        --query properties.ingress.fqdn \
        --output tsv
    

    Esse comando retorna a URL que pode ser usada para acessar o painel do Eureka Server for Spring. Com o painel, você também pode ver seu aplicativo de contêiner, conforme mostrado na captura de tela a seguir.

    Captura de tela que mostra o painel do Eureka Server for Spring.

Opcional: integrar o servidor Eureka para componentes Spring e Admin para Spring Java

Se você quiser integrar o Servidor Eureka para Spring e os componentes do Admin para Spring Java, consulte Integrar o Administrador Gerenciado para Spring com o Eureka Server para Spring.

Limpar os recursos

Os recursos criados neste tutorial têm um efeito na sua fatura do Azure. Se você não for usar esses serviços a longo prazo, execute o comando a seguir para remover tudo o que foi criado neste tutorial.

az group delete --resource-group $RESOURCE_GROUP

Lista de configuração permitida para o Eureka Server for Spring

As seções a seguir descrevem as configurações com suporte. Para obter mais informações, confira Spring Cloud Eureka Server.

Observação

Envie tickets de suporte para solicitações de novos recursos.

Opções de configuração

O comando az containerapp update usa o parâmetro --configuration para controlar como o Eureka Server for Spring é configurado. Você pode usar vários parâmetros ao mesmo tempo, desde que estejam separados por um espaço. Para obter mais informações, confira Spring Cloud Eureka Server.

As definições de configuração a seguir estão disponíveis na propriedade de configuração eureka.server:

Nome Descrição Valor padrão
eureka.server.enable-self-preservation Quando habilitado, o servidor controla o número de renovações que deve receber do servidor. A qualquer momento, o número de renovações cai abaixo da porcentagem limite definida pelo eureka.server.renewal-percent-threshold. O valor padrão é definido como true no servidor Eureka original, mas no componente Java do Servidor Eureka, o valor padrão é definido como false. Confira Limitações do componente Java do Eureka Server for Spring. false
eureka.server.renewal-percent-threshold O percentual mínimo de renovações esperado dos clientes no período especificado pelo eureka.server.renewal-threshold-update-interval-ms. Se as renovações forem suspensas abaixo do limite, as expirações serão desabilitadas se eureka.server.enable-self-preservation estiver habilitado. 0.85
eureka.server.renewal-threshold-update-interval-ms O intervalo com o qual o limite, conforme especificado em eureka.server.renewal-percent-threshold, precisa ser atualizado. 0
eureka.server.expected-client-renewal-interval-seconds O intervalo com o qual se espera que os clientes enviem as pulsações. O padrão é 30 segundos. Se os clientes enviarem pulsações com uma frequência diferente, digamos, a cada 15 segundos, esse parâmetro deverá ser ajustado de acordo. Caso contrário, a autopreservação não funcionará conforme o esperado. 30
eureka.server.response-cache-auto-expiration-in-seconds Obtém o tempo para o qual a carga do registro deve ser mantido no cache, se não for invalidado pelos eventos de alteração. 180
eureka.server.response-cache-update-interval-ms Obtém o intervalo de tempo com o qual o cache de carga do cliente deve ser atualizado. 0
eureka.server.use-read-only-response-cache Atualmente, o com.netflix.eureka.registry.ResponseCache usa uma estratégia de cache de dois níveis para as respostas. Um cache readWrite com uma política de expiração e um cache readonly que armazena em cache sem expirar. true
eureka.server.disable-delta Verifica se as informações delta podem ser fornecidas ao cliente. false
eureka.server.retention-time-in-m-s-in-delta-queue Obtenha o tempo pelo qual as informações delta devem ser armazenadas em cache para que os clientes recuperem o valor, sem que seja perdido. 0
eureka.server.delta-retention-timer-interval-in-ms Obtenha o intervalo de tempo com o qual a tarefa de limpeza deve ser ativada e verifique se há informações delta expiradas. 0
eureka.server.eviction-interval-timer-in-ms Obtenha o intervalo de tempo com o qual a tarefa que expira instâncias deve ser ativada e executada. 60000
eureka.server.sync-when-timestamp-differs Verifica se as instâncias devem ser sincronizadas quando o carimbo de data/hora for diferente. true
eureka.server.rate-limiter-enabled Indica se o limitador de taxa deve ser habilitado ou desabilitado. false
eureka.server.rate-limiter-burst-size Limitador de taxa, propriedade do algoritmo de token bucket. 10
eureka.server.rate-limiter-registry-fetch-average-rate Limitador de taxa, propriedade do algoritmo de token bucket. Especifica a taxa média de solicitação aplicada. 500
eureka.server.rate-limiter-privileged-clients Uma lista de clientes certificados. Essa lista é adicional aos clientes Eureka Java padrão. N/A
eureka.server.rate-limiter-throttle-standard-clients Indica se a taxa limita clientes padrão. Se definido como false, somente clientes fora do padrão terão taxa limitada. false
eureka.server.rate-limiter-full-fetch-average-rate Limitador de taxa, propriedade do algoritmo de token bucket. Especifica a taxa média de solicitação aplicada. 100

Configurações comuns

  • Configurações relacionadas ao registro em log:
    • logging.level.*
    • logging.group.*
    • Qualquer outra configuração no namespace logging.* deve ser proibida, por exemplo, gravar arquivos de log usando logging.file deve ser proibido.

Chamada entre aplicativos

Este exemplo mostra como escrever código Java para fazer chamadas entre aplicativos registrados com o componente Eureka Server for Spring. Quando os aplicativos contêineres estão vinculados ao Eureka, eles se comunicam entre si por meio do servidor Eureka.

O exemplo cria dois aplicativos, um chamador e um receptor. Ambos os aplicativos se comunicam entre si usando o componente Eureka Server for Spring. O aplicativo chamado expõe um terminal que é chamado pelo aplicativo chamador.

  1. Crie o aplicativo chamado. Habilite o cliente Eureka em seu aplicativo Spring Boot adicionando a anotação @EnableDiscoveryClient à sua classe principal.

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CalleeApplication {
      public static void main(String[] args) {
        SpringApplication.run(CalleeApplication.class, args);
      }
    }
    
  2. Crie um terminal no aplicativo chamado que é chamado pelo aplicativo chamador.

    @RestController
    public class CalleeController {
    
        @GetMapping("/call")
        public String calledByCaller() {
            return "Hello from Application callee!";
        }
    }
    
  3. Defina o nome do aplicativo chamado no arquivo de configuração do aplicativo, por exemplo, em application.yml.

    spring.application.name=callee
    
  4. Crie o aplicativo chamador.

    Adicione a anotação @EnableDiscoveryClient para habilitar a funcionalidade do cliente Eureka. Além disso, crie um bean WebClient.Builder com a anotação @LoadBalanced para realizar chamadas com balanceamento de carga para outros serviços.

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CallerApplication {
      public static void main(String[] args) {
        SpringApplication.run(CallerApplication.class, args);
      }
    
      @Bean
      @LoadBalanced
      public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
      }
    }
    
  5. Crie um controlador no aplicativo chamador que use o WebClient.Builder para chamar o aplicativo chamado usando seu nome de aplicativo, chamado.

    @RestController
    public class CallerController {
        @Autowired
        private WebClient.Builder webClientBuilder;
    
        @GetMapping("/call-callee")
        public Mono<String> callCallee() {
            return webClientBuilder.build()
                .get()
                .uri("http://callee/call")
                .retrieve()
                .bodyToMono(String.class);
        }
    }
    

Agora você tem um aplicativo chamador e um receptor que se comunicam entre si usando componentes Java do Eureka Server for Spring. Certifique-se de que ambos os aplicativos estejam em execução e vinculados ao servidor Eureka antes de testar o ponto de extremidade /call-callee no aplicativo chamador.

Limitações

O componente Java do Eureka Server vem com uma configuração padrão, eureka.server.enable-self-preservation, definida como false. Essa configuração padrão ajuda a evitar momentos em que as instâncias não são excluídas depois que a autopreservação é habilitada. Se as instâncias forem excluídas muito cedo, algumas solicitações poderão ser direcionadas para instâncias inexistentes. Se desejar alterar essa configuração para true, você poderá substituí-la definindo suas próprias configurações no componente Java.

Próximas etapas

Integrar o Administrador Gerenciado para Spring com o Servidor Eureka para Spring