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 ConsulCONSUL_HTTPS_CERT_FILE
: o caminho para o arquivo de certificado do clienteCONSUL_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.