(16) 981791110 contato@policast.studio

O que é o Consul e qual é a sua relação com o Symfony?

O Consul é uma ferramenta de descoberta de serviços distribuídos. Ele permite consultar, registrar e monitorar serviços em ambientes distribuídos. O Symfony oferece suporte ao Consul por meio do Bundle de descoberta de serviços do Consul e do Bundle do Kubernetes.

Como instalar o Bundle de descoberta de serviços do Consul?

Para instalar o Bundle de descoberta de serviços do Consul, basta executar o comando composer require symfony/consul-discovery-bundle. Em seguida, adicione o Bundle ao seu Kernel em AppKernel.php:

use SymfonyComponentHttpKernelKernel; use SymfonyComponentConfigLoaderLoaderInterface;

class AppKernel extends Kernel { public function registerBundles() { $bundles = [ // ... new SymfonyBundleConsulDiscoveryBundleConsulDiscoveryBundle(), ];

// ... return $bundles; } // ... }

Como configurar o Consul no Symfony?

Para configurar o Consul no Symfony, é necessário definir as seguintes variáveis de ambiente:

  • CONSUL_HTTP_ADDR: o endereço HTTP do servidor Consul (ex: http://127.0.0.1:8500)
  • CONSUL_HTTP_TOKEN: o token do Consul para autenticação (opcional)

Em seguida, adicione as seguintes configurações ao seu arquivo services.yaml:

consul_discovery: http:
client:
base_uri: '%env(consul_http_addr)%'
headers:
'X-Consul-Token': '%env(consul_http_token)%'

Como registrar um serviço no Consul?

Para registrar um serviço no Consul, basta adicionar a anotação @Service a uma classe de serviço:

use SymfonyComponentConsoleCommandCommand; use SensioBundleFrameworkExtraBundleConfigurationService;

/**
* @Service("my_command")
*/
class MyCommand extends Command { // ... }

Em seguida, execute o comando bin/console consul:register-services para registrar todos os serviços no Consul.

Como consultar serviços no Consul?

Para consultar serviços no Consul, é possível usar a classe Consul. Por exemplo, para obter todos os serviços registrados:

use SensioBundleFrameworkExtraBundleConfigurationRoute; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SensioBundleFrameworkExtraBundleConfigurationMethod;
use SensioBundleFrameworkExtraBundleConfigurationParamConverter;
use SensioBundleFrameworkExtraBundleConfigurationTemplate; use SymfonyComponentHttpFoundationRequest;
use SensioBundleFrameworkExtraBundleConfigurationCache;
use SymfonyComponentSerializerSerializerInterface;

/**
* @Route("/services")
*/
class ServicesController extends AbstractController { /** * @Route("", name="services_index") * @Method({"GET"}) */ public function index(Consul $consul) { $services = $consul->catalog()->services();

return $this->render('services/index.html.twig', [ 'services' => $services, ]); } }

Como implementar o balanceamento de carga com o Consul e o Symfony?

Para implementar o balanceamento de carga com o Consul e o Symfony, é possível usar o Bundle do Kubernetes. Basta configurar o serviço kubernetes.federation_service_discovery.load_balancer com o driver do Consul:

kubernetes: federation_service_discovery: load_balancer: type: consul consul: address: '%env(consul_http_addr)%'
ca_file: '%kernel.project_dir%/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
token_file: '%kernel.project_dir%/var/run/secrets/kubernetes.io/serviceaccount/token'

Como configurar o Consul para monitorar serviços do Symfony?

Para monitorar serviços do Symfony com o Consul, é possível usar o Bundle de monitoramento do Consul. Basta instalar o Bundle com o comando composer require symfony/consul-health-check-bundle e adicionar a anotação @HealthCheck a uma classe de serviço:

use SensioBundleFrameworkExtraBundleConfigurationRoute; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SensioBundleFrameworkExtraBundleConfigurationMethod;
use SensioBundleFrameworkExtraBundleConfigurationParamConverter;
use SensioBundleFrameworkExtraBundleConfigurationTemplate; use SymfonyComponentHttpFoundationRequest;
use SensioBundleFrameworkExtraBundleConfigurationCache;
use SymfonyComponentSerializerSerializerInterface;

/**
* @Route("/services")
* @HealthCheck(path="/healthcheck")
*/
class ServicesController extends AbstractController { // ... }

Como executar o monitoramento de saúde do Consul?

Para executar o monitoramento de saúde do Consul, basta executar o comando bin/console consul:health-check. O comando verifica todos os serviços registrados no Consul e executa as verificações de saúde definidas para cada serviço.

Como configurar o Consul para usar TLS?

Para configurar o Consul para usar TLS, é necessário definir as seguintes variáveis de ambiente:

  • CONSUL_HTTPS_ADDR: o endereço HTTPS do servidor Consul (ex: https://127.0.0.1:8500)
  • CONSUL_HTTPS_CA_FILE: o caminho para o arquivo CA (Certificate Authority) do Consul
  • CONSUL_HTTPS_CERT_FILE: o caminho para o arquivo de certificado do cliente
  • CONSUL_HTTPS_KEY_FILE: o caminho para o arquivo de chave privada do cliente

Em seguida, adicione as seguintes configurações ao seu arquivo services.yaml:

consul_discovery: https:
client:
base_uri: '%env(consul_https_addr)%'
cafile: '%env(consul_https_ca_file)%'
cert: '%env(consul_https_cert_file)%'
key: '%env(consul_https_key_file)%'

Como implementar o fallback para outros serviços quando um serviço falha?

Para implementar o fallback para outros serviços quando um serviço falha, é possível usar o Bundle do Kubernetes com a opção failover. Basta configurar o serviço kubernetes.federation_service_discovery.load_balancer com a opção failover:

kubernetes: federation_service_discovery: load_balancer: type: consul consul: address: '%env(consul_http_addr)%'
ca_file: '%kernel.project_dir%/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
token_file: '%kernel.project_dir%/var/run/secrets/kubernetes.io/serviceaccount/token'
failover:
- service_name: 'my-other-service'
endpoint: 'tcp://my-other-service:80'

Se o serviço principal falhar, o fallback será ativado e o serviço secundário será usado em seu lugar.