Uma Introdução ao Spring Cloud Zookeeper
*1. Introdução *
Neste artigo, vamos nos familiarizar com o Zookeeper e como ele é usado para o Service Discovery, que é usado como um conhecimento centralizado sobre os serviços na nuvem.
O Spring Cloud Zookeeper fornece Apache Zookeeper para aplicativos Spring Boot por meio de configuração automática e ligação ao ambiente Spring.
===* 2. Configuração de descoberta de serviço *
Vamos criar dois aplicativos:
*Um aplicativo que fornecerá um serviço (referido neste artigo como* *_ Provedor de Serviços _* * __) __ *Um aplicativo que consumirá esse serviço (chamado* _Service Consumer_ *)
O Apache Zookeeper atuará como coordenador em nossa configuração de descoberta de serviço. As instruções de instalação do Apache Zookeeper estão disponíveis no seguinte link.
*3. Registro de provedor de serviços *
Ativaremos o registro do serviço adicionando a dependência spring-cloud-starter-zookeeper-discovery e usando a anotação _ @ EnableDiscoveryClient_ no aplicativo principal.
Abaixo, mostraremos esse processo passo a passo para o serviço que retorna o "Hello World!" em uma resposta às solicitações GET.
====* 3.1 Dependências do Maven *
Primeiro, vamos adicionar o https://search.maven.org/classic/search%7Cga%7C1%7Cspring-cloud-starter-zookeeper-discovery[spring-cloud-starter-zookeeper-discovery], spring-web, https://search.maven. org/classic/ search% 7Cga% 7C1% 7Cg% 3A% 22org.springframework.cloud% 22% 20% 20AND% 20a% 3A% 22spring-cloud-dependencies% 22 [spring-cloud-dependencies] e spring-boot-starter dependências para nossas arquivo pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>1.0.3.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
====* 3.2 Anotações do provedor de serviços *
Em seguida, anotaremos nossa classe principal com _ @ EnableDiscoveryClient_. Isso fará com que o aplicativo HelloWorld reconheça a descoberta:
@SpringBootApplication
@EnableDiscoveryClient
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
E um controlador simples:
@GetMapping("/helloworld") public String helloWorld() { return "Hello World!"; }
====* 3.3 Configurações YAML *
Agora, vamos criar um arquivo YAML Application.yml que será usado para configurar o nível do log do aplicativo e informar ao Zookeeper que o aplicativo está ativado para descoberta.
O nome do aplicativo com o qual o Zookeeper é registrado é o mais importante. Posteriormente no consumidor do serviço, um cliente feign usará esse nome durante a descoberta do serviço:
spring:
application:
name: HelloWorld
cloud:
zookeeper:
discovery:
enabled: true
logging:
level:
org.apache.zookeeper.ClientCnxn: WARN
O aplicativo de inicialização por mola procura o tratador de zoológico na porta 2181 padrão. Se o zookeeper estiver localizado em outro lugar, a configuração precisará ser adicionada:
spring:
cloud:
zookeeper:
connect-string: localhost:2181
===* 4. Consumidor de serviço *
Agora, criaremos um consumidor de serviço REST e o registraremos usando spring Netflix Feign Client.
====* 4.1 Dependência Maven *
Primeiro, vamos adicionar o https://search.maven.org/classic/search%7Cga%7C1%7Cspring-cloud-starter-zookeeper-discovery[spring-cloud-starter-zookeeper-discovery], spring-web, https://search.maven. org/classic/ search% 7Cga% 7C1% 7Cg% 3A% 22org.springframework.cloud% 22% 20% 20AND% 20a% 3A% 22spring-cloud-dependencies% 22 [spring-cloud-dependencies], spring-boot-starter-actuator e spring-cloud-starter-feign dependências em nosso arquivo pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>1.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
====* 4.2 Anotações de consumidor do serviço *
Assim como o provedor de serviços, anotamos a classe principal com _ @ EnableDiscoveryClient_ para torná-la sensível à descoberta:
@SpringBootApplication
@EnableDiscoveryClient
public class GreetingApplication {
public static void main(String[] args) {
SpringApplication.run(GreetingApplication.class, args);
}
}
====* 4.3 Descubra o serviço com o Feign Client *
Usaremos o _Spring Cloud Feign Integration, _ um projeto da Netflix que permite definir um cliente REST declarativo. Declaramos como a URL se parece e a fingida cuida da conexão com o serviço REST.
O Feign Client é importado via https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A%22spring-cloud-starter- fingir% 22 [spring-cloud-starter-fingir] _ pacote. Anotaremos uma _ @ Configuração com _ @ EnableFeignClients_ para utilizá-la no aplicativo.
Por fim, anotamos uma interface com _ @ FeignClient ("nome do serviço") _ e a conectamos automaticamente em nosso aplicativo para que possamos acessar esse serviço programaticamente.
Aqui na anotação _ @ FeignClient (name = “HelloWorld”) , nos referimos ao _service-name do produtor de serviço que criamos anteriormente.
@Configuration
@EnableFeignClients
@EnableDiscoveryClient
public class HelloWorldClient {
@Autowired
private TheClient theClient;
@FeignClient(name = "HelloWorld")
interface TheClient {
@RequestMapping(path = "/helloworld", method = RequestMethod.GET)
@ResponseBody
String helloWorld();
}
public String HelloWorld() {
return theClient.HelloWorld();
}
}
====* 4.4 Classe do Controlador *
A seguir, é apresentada uma classe simples de controlador de serviço que chamará a função do provedor de serviços em nossa classe de cliente fingido para consumir o serviço (cujos detalhes são abstraídos por meio da descoberta de serviço) por meio do objeto helloWorldClient da interface injetado e o exibe em resposta:
@RestController
public class GreetingController {
@Autowired
private HelloWorldClient helloWorldClient;
@GetMapping("/get-greeting")
public String greeting() {
return helloWorldClient.helloWorld();
}
}
====* 4.5 Configurações YAML *
Em seguida, criamos um arquivo YAML Application.yml muito semelhante ao usado anteriormente. Isso configura o nível de log do aplicativo:
logging:
level:
org.apache.zookeeper.ClientCnxn: WARN
O aplicativo procura o Zookeeper na porta 2181 padrão. Se o Zookeeper estiver localizado em outro lugar, a configuração precisará ser adicionada:
spring:
cloud:
zookeeper:
connect-string: localhost:2181
===* 5. Testando a instalação *
O serviço REST HelloWorld se registra no Zookeeper na implantação. Em seguida, o serviço Greeting atuando como consumidor do serviço chama o serviço HelloWorld usando o cliente Feign.
Agora podemos criar e executar esses dois serviços.
Por fim, apontaremos nosso navegador para http://localhost: 8080/get-greeting [http://localhost: 8083/get-greeting] e ele deverá exibir:
Hello World!
===* 6. Conclusão*
Neste artigo, vimos como implementar a descoberta de serviço usando o Spring Cloud Zookeeper e registramos um serviço chamado HelloWorld no servidor Zookeeper para ser descoberto e consumido pelo serviço Greeting usando um Feign Client sem conhecer os detalhes de localização.
Como sempre, o código deste artigo está disponível no GitHub.