Partilhar via


Conectar a um Eureka Server gerido para Spring nas Azure Container Apps

O Eureka Server for Spring é um registo de serviços que permite aos microsserviços registarem-se e descobrirem outros serviços. O Eureka Server for Spring está disponível como um componente do Azure Container Apps. Pode associar a sua aplicação de contentores ao Eureka Server for Spring para registo automático no servidor Eureka.

Neste tutorial, irá aprender a:

  • Crie um servidor Eureka para o componente Spring Java.
  • Vincule a sua aplicação container ao Eureka Server para o componente Spring Java.

Importante

Este tutorial utiliza serviços que podem afetar a sua fatura Azure. Se você decidir acompanhar, 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 em aplicativos de contêiner, esteja ciente dos seguintes detalhes:

Item Explicação
Âmbito 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 minReplicas de dimensionamento e maxReplicas estão ambas definidas como 1. Para obter alta disponibilidade, veja Crie um serviço Eureka altamente disponível em aplicações de contêiner.
Recursos A alocação de recursos de contêiner para o Eureka Server for Spring é fixa. O número de núcleos da CPU é 0.5, e o tamanho da memória é 1 Gi.
Preços O Eureka Server for Spring billing enquadra-se nos preços baseados no consumo. Os recursos consumidos pelos componentes Java geridos são faturados de acordo com as taxas de atividade/inatividade. Você pode excluir componentes que não estão mais em uso para interromper a cobrança.
Enlace Os aplicativos de contêiner se conectam a um componente do Eureka Server for Spring por meio de uma ligação. As associações injetam configurações em variáveis de ambiente do aplicativo de contêiner. Depois que uma associação é estabelecida, o aplicativo contêiner pode ler os valores de configuração das variáveis de ambiente e conectar-se ao componente Eureka Server for Spring.

Configuração

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

Execute os comandos a seguir 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 Azure onde cria a sua aplicação de contentores e o componente Java.
    ENVIRONMENT O nome do ambiente do aplicativo de contêiner para seu aplicativo de demonstração.
    RESOURCE_GROUP O nome do grupo de recursos do Azure para a sua aplicação de demonstração.
    EUREKA_COMPONENT_NAME O nome do componente Java criado para a tua aplicação container. Neste caso, crias um Eureka Server para o componente Spring Java.
    IMAGE A imagem de contêiner usada em seu aplicativo de contêiner.
  2. Inicie sessão no Azure com a CLI do Azure.

    az login
    
  3. Crie um grupo de recursos.

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

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

Criar o Eureka Server para o componente Spring Java

Agora que já tem um ambiente existente, pode criar a sua aplicação container e associá-la a uma instância de componente Java do Eureka Server para o Spring.

  1. Crie o Eureka Server para o componente Spring Java.

    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
    
  2. Opcional: Atualize o Eureka Server para a configuração dos componentes 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
    

Vincule a sua aplicação container ao Eureka Server para o componente Spring Java

  1. Crie o aplicativo de contêiner e vincule-o ao componente 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 o URL do seu aplicativo para um editor de texto para que você possa usá-lo em uma próxima etapa.

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

Vá para a /allRegistrationStatus rota para ver todas as aplicações registadas no servidor Eureka para o componente Spring.

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

A ligaçã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 eureka.client.register-with-eureka propriedade está configurada para true garantir o registo no servidor Eureka. Esse registro substitui a configuração local no application.properties, do servidor de configuração e assim por diante. Se quiser defini-lo como false, você pode substituí-lo definindo uma variável de ambiente em seu aplicativo de contêiner.

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

Opcional: Desvincule a sua aplicação container do Eureka Server para um componente Spring Java

Para remover um vínculo de uma aplicação container, use a opção --unbind.

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

Visualize o aplicativo através de um painel

Importante

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

Nota

O dashboard não está disponível no Azure e é operado pela 21Vianet.

  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>"]
    }'
    

    Certifique-se de substituir o espaço reservado <SUBSCRIPTION_ID> no valor AssignableScopes pelo seu ID de subscrição.

  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 à sua conta.

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

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

    Nota

    O valor <USER_OR_SERVICE_PRINCIPAL_ID> normalmente deve ser a identidade que usa para aceder ao portal Azure. O <ROLE_NAME> valor é o nome que você atribuiu na etapa 1.

  4. Obtenha o URL do painel do Eureka Server for 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
    

    Este comando devolve o URL que pode utilizar para aceder ao 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 ecrã que mostra o painel do Eureka Server for Spring.

Opcional: Integrar o Eureka Server para o Spring e o Admin para os componentes do Spring Java

Se quiser integrar o Eureka Server para Spring e os componentes Admin para Java Spring, consulte Integre o Admin gerido para Spring com o Eureka Server para Spring.

Limpar recursos

Os recursos criados neste tutorial têm um impacto na sua fatura do Azure. Se você não vai usar esses serviços a longo prazo, execute o seguinte comando para remover tudo o que você criou neste tutorial.

az group delete --resource-group $RESOURCE_GROUP

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

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

Nota

Pode submeter tickets de suporte para pedidos de novas funcionalidades.

Opções de configuração

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

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

Nome Descrição Valor predefinido
eureka.server.enable-self-preservation Quando ativado, o servidor controla o número de renovações que deve receber do servidor. Quando o número de renovações cai abaixo da percentagem limiar definida por eureka.server.renewal-percent-threshold. O valor predefinido está definido como true no servidor Eureka original, mas no componente Java Eureka Server, o valor padrão está definido como false. Veja Limitações do Eureka Server para o componente Spring Java. false
eureka.server.renewal-percent-threshold A percentagem mínima de renovações que se espera dos clientes no período especificado pela eureka.server.renewal-threshold-update-interval-ms. Se as renovações caírem abaixo do limite, as expirações serão desativadas se eureka.server.enable-self-preservation estiver habilitado. 0.85
eureka.server.renewal-threshold-update-interval-ms O intervalo com o qual o limiar - 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 os seus batimentos cardíacos. O padrão é de 30 segundos. Se os clientes enviarem batimentos cardíacos com frequências diferentes, por exemplo, a cada 15 segundos, então este parâmetro deve ser ajustado em conformidade, caso contrário, a autopreservação não funciona como esperado. 30
eureka.server.response-cache-auto-expiration-in-seconds Obtém o tempo durante o qual a carga útil do registo deve ser mantida na cache caso os eventos de alteração não a invalidem. 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 O com.netflix.eureka.registry.ResponseCache atualmente usa uma estratégia de cache de dois níveis para respostas. Um readWrite cache com uma política de expiração e um readonly cache que armazena sem expirar. true
eureka.server.disable-delta Verifica se as informações do delta podem ser fornecidas ao cliente ou não. false
eureka.server.retention-time-in-m-s-in-delta-queue Obtenha o tempo durante o qual as informações delta devem ser armazenadas em cache para que os clientes recuperem o valor sem perdê-lo. 0
eureka.server.delta-retention-timer-interval-in-ms Obtenha o intervalo de tempo em que a tarefa de limpeza deve despertar e verifique se há informações de delta expiradas. 0
eureka.server.eviction-interval-timer-in-ms Obtenha o intervalo de tempo com que a tarefa que encerra as 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 é diferente. true
eureka.server.rate-limiter-enabled Indica se o limitador de taxa deve ser ativado ou desativado. false
eureka.server.rate-limiter-burst-size Limitador de taxa, propriedade do algoritmo do bucket de token. 10
eureka.server.rate-limiter-registry-fetch-average-rate Limitador de taxa, propriedade do algoritmo do bucket de token. Especifica a taxa média de pedidos aplicada. 500
eureka.server.rate-limiter-privileged-clients Uma lista de clientes certificados além dos clientes padrão Eureka Java. N/A
eureka.server.rate-limiter-throttle-standard-clients Indique se a taxa limita os clientes padrão. Se definido como false, apenas clientes não padrão têm taxa limitada. false
eureka.server.rate-limiter-full-fetch-average-rate Limitador de taxa, propriedade do algoritmo do bucket de token. Especifica a taxa média de pedidos aplicada. 100

Configurações comuns

  • Configurações relacionadas ao registo:
    • logging.level.*
    • logging.group.*
    • Quaisquer outras configurações sob o logging.* namespace devem ser proibidas - por exemplo, escrever arquivos de log usando logging.file deve ser proibido.

Chamada entre aplicativos

Este exemplo mostra-lhe como escrever código Java para chamar entre aplicações registadas no componente Eureka Server for Spring. Quando as aplicações de contentor estão ligadas ao Eureka, comunicam entre si através do servidor Eureka.

O exemplo cria dois aplicativos, um chamador e um destinatário. Ambos os aplicativos se comunicam entre si usando o componente Eureka Server for Spring. O aplicativo callee expõe um ponto de extremidade que é chamado pelo aplicativo chamador.

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

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CalleeApplication {
      public static void main(String[] args) {
        SpringApplication.run(CalleeApplication.class, args);
      }
    }
    
  2. Crie um endpoint na aplicação do destinatário que é chamado pela aplicação chamadora.

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

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

    Adicione a anotação para ativar a @EnableDiscoveryClient funcionalidade do cliente Eureka. Além disso, crie um WebClient.Builder bean com a @LoadBalanced anotação para executar 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 na aplicação emissor que usa o WebClient.Builder para chamar a aplicação destinatária pelo seu nome, callee.

    @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 tem uma aplicação de chamada e uma de receção de chamada que comunicam entre si usando Eureka Server para componentes Spring Java. Certifique-se de que ambas as aplicações estão em execução e vinculadas ao servidor Eureka antes de testar o endpoint /call-callee na aplicação chamadora.

Limitações

  • O componente Eureka Server Java vem com uma configuração predefinida, eureka.server.enable-self-preservation, definida para 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 é ativada. Se as instâncias forem excluídas muito cedo, algumas solicitações poderão ser direcionadas para instâncias inexistentes. Se quiseres alterar esta definição para true, podes sobrescrevê-la definindo as tuas próprias configurações no componente Java.
  • O dashboard da Eureka não está disponível no Azure e é operado pela 21Vianet.

Próximos passos

Integre o Admin gerenciado para o Spring com o Eureka Server for Spring