«1. Введение

В этой статье мы познакомимся с Zookeeper и тем, как он используется для обнаружения служб, которое используется как централизованное знание о службах в облаке.

Spring Cloud Zookeeper обеспечивает интеграцию Apache Zookeeper с приложениями Spring Boot посредством автоматической настройки и привязки к среде Spring.

2. Настройка обнаружения сервисов

Мы создадим два приложения:

    Приложение, которое будет предоставлять сервис (называемое в этой статье поставщиком сервисов) Приложение, которое будет использовать этот сервис (называемое потребителем сервисов). )

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

Во-первых, давайте добавим в наш pom необходимые зависимости spring-cloud-starter-zookeeper-discovery, spring-web, spring-cloud-dependencies, spring-boot-starter-actuator и spring-cloud-starter-feign. .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. Discover Service With Feign Client

Мы будем использовать Spring Cloud Feign Integration, проект Netflix, который позволяет определить декларативный REST-клиент. Мы объявляем, как выглядит URL-адрес, и feign позаботится о подключении к службе REST.

Клиент Feign импортируется через пакет spring-cloud-starter-feign. Мы аннотируем @Configuration с помощью @EnableFeignClients, чтобы использовать его в приложении.

Наконец, мы аннотируем интерфейс с помощью @FeignClient(“service-name”) и автоматически подключаем его к нашему приложению, чтобы получить программный доступ к этому сервису.

Здесь в аннотации @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.