1. Введение
В этой статье мы познакомимся с Zookeeper и тем, как он используется для обнаружения служб, которое используется как централизованное знание об услугах в облаке.
Spring Cloud Zookeeper обеспечивает интеграцию Apache Zookeeper с приложениями Spring Boot посредством автоматической настройки и привязки к среде Spring.
2. Настройка обнаружения службы
Мы создадим два приложения:
- Приложение, которое будет предоставлять услугу (называемое в этой статье поставщиком услуг
) .
- Приложение, которое будет использовать эту службу (называемое Service Consumer ) .
Apache Zookeeper будет выступать в качестве координатора в нашей настройке обнаружения служб. Инструкции по установке Apache Zookeeper доступны по следующей ссылке .
3. Регистрация поставщика услуг
Мы включим регистрацию службы, добавив зависимость spring-cloud-starter-zookeeper-discovery
и используя аннотацию @EnableDiscoveryClient
в основном приложении.
Ниже мы покажем этот процесс шаг за шагом для службы, которая возвращает «Hello World!» в ответ на GET запросы.
3.1. Зависимости Maven
Во-первых, давайте добавим необходимые зависимости spring-cloud-starter-zookeeper-discovery
,
spring-web
,
spring-cloud-dependencies
и spring-boot-starter
в наш файл pom.xml
:
``
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2. Аннотации поставщика услуг
Далее мы аннотируем наш основной класс с помощью @EnableDiscoveryClient
. Это сделает приложение HelloWorld
осведомленным об обнаружении:
@SpringBootApplication
@EnableDiscoveryClient
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
И простой контроллер:
@GetMapping("/helloworld")
public String helloWorld() {
return "Hello World!";
}
3.3. YAML-конфигурации
Теперь давайте создадим файл YAML Application.yml
, который будет использоваться для настройки уровня журнала приложения и информирования Zookeeper о том, что приложение поддерживает обнаружение.
Имя приложения, с помощью которого регистрируется Zookeeper, является наиболее важным. Позже в потребителе службы фиктивный
клиент будет использовать это имя во время обнаружения службы:
spring:
application:
name: HelloWorld
cloud:
zookeeper:
discovery:
enabled: true
logging:
level:
org.apache.zookeeper.ClientCnxn: WARN
Приложение весенней загрузки ищет zookeeper на порту 2181 по умолчанию. Если zookeeper находится где-то еще, необходимо добавить конфигурацию:
spring:
cloud:
zookeeper:
connect-string: localhost:2181
4. Потребитель услуг
Теперь мы создадим потребителя службы REST и зарегистрируем его с помощью клиента Spring Netflix Feign.
4.1. Зависимость от Maven
Во-первых, давайте добавим необходимые зависимости spring-cloud-starter-zookeeper-discovery , spring-web , spring-cloud-dependencies , spring-boot-starter-actuator
и spring-cloud-starter-
feign в наш файл pom.xml
:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4.2. Аннотации потребителей услуг
Как и в случае с поставщиком услуг, мы аннотируем основной класс с помощью @EnableDiscoveryClient
, чтобы сделать его осведомленным об обнаружении:
@SpringBootApplication
@EnableDiscoveryClient
public class GreetingApplication {
public static void main(String[] args) {
SpringApplication.run(GreetingApplication.class, args);
}
}
4.3. Откройте для себя сервис с Feign Client
Мы будем использовать Spring Cloud Feign Integration,
проект Netflix, который позволяет определить декларативный REST-клиент. Мы объявляем, как выглядит URL-адрес, и feign позаботится о подключении к службе REST.
Клиент Feign
импортируется через пакет spring-cloud-starter-feign
. Мы аннотируем @Configuration
с помощью @EnableFeignClients
, чтобы использовать его в приложении.
Наконец, мы аннотируем интерфейс с помощью @FeignClient («имя-службы»)
и автоматически подключаем его к нашему приложению, чтобы мы могли обращаться к этой службе программно.
Здесь в аннотации @FeignClient(name = «HelloWorld»)
мы ссылаемся на имя
службы ранее созданного производителя службы.
@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. Класс контроллера
Ниже приведен простой класс контроллера службы, который будет вызывать функцию поставщика службы в нашем фиктивном клиентском классе для использования службы (детали которой абстрагируются посредством обнаружения службы) через введенный интерфейсный объект helloWorldClient
и отображает его в ответ:
@RestController
public class GreetingController {
@Autowired
private HelloWorldClient helloWorldClient;
@GetMapping("/get-greeting")
public String greeting() {
return helloWorldClient.helloWorld();
}
}
4.5. YAML-конфигурации
Затем мы создаем YAML-файл Application.yml
, очень похожий на тот, который использовался ранее. Это настраивает уровень журнала приложения:
logging:
level:
org.apache.zookeeper.ClientCnxn: WARN
Приложение ищет Zookeeper на порту 2181
по умолчанию . Если Zookeeper находится в другом месте, необходимо добавить конфигурацию:
spring:
cloud:
zookeeper:
connect-string: localhost:2181
5. Проверка установки
Служба HelloWorld REST регистрируется в Zookeeper при развертывании. Затем служба Greeting
, выступающая в роли потребителя службы, вызывает службу HelloWorld
с помощью клиента Feign.
Теперь мы можем построить и запустить эти два сервиса.
Наконец, мы укажем нашему браузеру http://localhost:8083/get-greeting
, и он должен отобразить:
Hello World!
6. Заключение
В этой статье мы увидели, как реализовать обнаружение службы с помощью Spring Cloud Zookeeper
, и мы зарегистрировали службу HelloWorld
на сервере Zookeeper, которая будет обнаружена и использована службой приветствия
с помощью клиента Feign
, не зная сведений о его местоположении.
Как всегда, код этой статьи доступен на GitHub .