Para demonstrar a integração, vamos criar dois projetos: um como provedor de serviços e outro como consumidor. Ambos usarão o Nacos para descoberta de serviços e o OpenFeign para chamadas remotas com balanceamento de carga.
Provedor de Serviços
Este é um serviço básico registrado no Nacos, expondo um endponit simples.
Dependências Maven no arquivo pom.xml:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Configuração no arquivo application.yml:
servidor:
porta: 8081
primavera:
aplicação:
nome: servico-provedor
nuvem:
nacos:
descoberta:
endereço-servidor: localhost:8848
Código-fonte:
// Classe principal
@EnableDiscoveryClient
@SpringBootApplication
public class AplicacaoProvedor {
public static void main(String[] args) {
SpringApplication.run(AplicacaoProvedor.class, args);
}
}
// Controlador REST
@RestController
public class SaudacaoControlador {
@GetMapping("/api/saudacao")
public String obterSaudacao() {
return "Olá do provedor!";
}
}
Consumidor de Serviços
O consumidor utiliza OpenFeign para chamar o provedor e LoadBalancer para distribuir a carga.
Dependências Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Configuração no arquivo application.yml:
servidor:
porta: 8082
primavera:
aplicação:
nome: servico-consumidor
nuvem:
nacos:
descoberta:
endereço-servidor: localhost:8848
Código-fonte:
// Interface Feign para comunicação com o provedor
@FeignClient(name = "servico-provedor")
public interface ProvedorCliente {
@GetMapping("/api/saudacao")
String buscarSaudacao();
}
// Controlador que usa o cliente Feign
@RestController
public class ConsumidorControlador {
@Autowired
private ProvedorCliente provedorCliente;
@GetMapping("/consumir")
public String consumirServico() {
return provedorCliente.buscarSaudacao();
}
}
// Classe principal com anotações para Feign e descoberta
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class AplicacaoConsumidor {
public static void main(String[] args) {
SpringApplication.run(AplicacaoConsumidor.class, args);
}
}
Ao iniciar ambos os serviços, eles serão visíveis no painel do Nacos. Teste a chamada acessando o endpoint /consumir no consumidor, que retornará a resposta do provedor.
Em ambientes de produção, é comum que um serviço atue tanto como provedor quanto consumidor. Uma prática recomendada é fazer o controlador implementar a interface Feign, o que permite herdar anotações como @RequestMapping e integrar facilmente com ferramentas como Swagger para documentação automática da API, mantendo o código mais coeso e legível.