Статьи

Весеннее Облако Netflix Эврика

Этот урок о весеннем облаке Netflix Eureka. Здесь мы будем создавать сервер обнаружения eureka и микросервисы, которые будут самостоятельно регистрироваться на сервере обнаружения и клиенте, который будет использовать клиентский API-интерфейс netflix для обнаружения сервиса и использовать микросервисы, предоставляемые сервисом, с примером примера. Поэтому мы будем разрабатывать 3 различных весенних загрузочных приложения для каждого сервера обнаружения, службы и клиента. Также мы рассмотрим панель инструментов eureka по умолчанию и другую полезную информацию, доступную на панели инструментов.

Spring cloud netflix обеспечивает интеграцию Netflix OSS для приложений весенней загрузки, используя простую конфигурацию на основе аннотаций. Теперь настало время, когда мы создаем микросервисы вместо массового приложения и разворачиваем эти микросервисы в облаке. В этой архитектуре обнаружение сервисов является одним из ключевых принципов. Обнаружение сервисов автоматизирует процесс создания нескольких экземпляров по требованию и обеспечивает высокую доступность наших микросервисов. Здесь мы будем использовать Eureka в качестве сервера и клиента Netflix Service Discovery.

Spring Cloud Eureka Discovery Server

Сервер обнаружения — это реестр всех доступных служб. Различные службы могут регистрироваться и отменять регистрацию на этом сервере. Реализовать сервер обнаружения eureka с помощью весенней загрузки очень просто. Для этого сначала мы создадим приложение весенней загрузки с приведенными ниже зависимостями из start.spring.io и импортируем его в нашу IDE.

Это приводит к следующим maven-зависимостям. Зависимости, необходимые для включения Spring Cloud — это Spring-Cloud-зависимости.

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencies></span> <Зависимостей></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <Идентификатор_группы> org.springframework.boot </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>pring-boot-starter-actuator</artifactId></span> <Артефакт> Принг-загрузочный стартер-привод </ артефакт></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.cloud</groupId></span> <Идентификатор_группы> org.springframework.cloud </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-cloud-starter-eureka-server</artifactId></span> <Артефакт> весна-облако-стартер-Эврика-сервер </ артефакт></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
 
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <Идентификатор_группы> org.springframework.boot </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-boot-starter-test</artifactId></span> <Артефакт> весна-загрузка-стартер-тест </ артефакт></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>test</scope></span> <Сфера> Тест </ сфера></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencies></span> </ Зависимости></span>
 
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencyManagement></span> <DependencyManagement></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencies></span> <Зависимостей></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.cloud</groupId></span> <Идентификатор_группы> org.springframework.cloud </ идентификатор_группы></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-cloud-dependencies</artifactId></span> <Артефакт> весна-облако зависимостей </ артефакт></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><version>${spring-cloud.version}</version></span> <Версия> $ {весна-cloud.version} </ версия></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><type>pom</type></span> <Тип> POM </ тип></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>import</scope></span> <Сфера> импорта </ сфера></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencies></span> </ Зависимости></span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencyManagement></span> </ DependencyManagement></span>

И у нас есть следующие свойства, определенные в application.properties Здесь spring.application.name предоставляет уникальный идентификатор этого сервиса. При запуске сервера обнаружения он попытается зарегистрироваться на своем равноправном сервере обнаружения для высокой доступности, которую у нас нет для это руководство. У нас нет нескольких экземпляров сервера обнаружения. Hence eureka.client.register-with-eureka имеет значение false.

Точно так же у нас есть свойство eureka.client.fetch-registry, которое указывает, должен ли этот клиент получать информацию реестра eureka с сервера eureka. И server.port должен определить порт, на котором будет работать наш сервер dicovery.

1
2
3
4
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">spring.application.name=discovery-server</span> spring.application.name = открытие-сервер</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">eureka.client.register-with-eureka=false</span> eureka.client.register-с-Eureka = ложь</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">eureka.client.fetch-registry=false</span> eureka.client.fetch-реестр = ложь</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">server.port=8761</span> server.port = 8761</span>

Теперь давайте определим наше DiscoveryServerApplication. @ EnableEurekaServer включит конфигурации сервера eureka. Когда мы запустим этот класс как java-программу, он добавит новый одноранговый узел по адресу http: // localhost: 8761 / eureka /, и наш микросервис будет вызывать этот URL-адрес, чтобы зарегистрироваться.

DiscoveryServerApplication.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">package com.devglan.discoveryserver;</span> пакет com.devglan.discoveryserver;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.boot.SpringApplication;</span> import org.springframework.boot.SpringApplication;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.boot.autoconfigure.SpringBootApplication;</span> import org.springframework.boot.autoconfigure.SpringBootApplication;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;</span> import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@EnableEurekaServer</span> @EnableEurekaServer</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@SpringBootApplication</span> @SpringBootApplication</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public class DiscoveryServerApplication {</span> открытый класс DiscoveryServerApplication {</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public static void main(String[] args) {</span> public static void main (String [] args) {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">SpringApplication.run(DiscoveryServerApplication.class, args);</span> SpringApplication.run (DiscoveryServerApplication.class, args);</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Вот и все для сервера обнаружения. Наш сервер обнаружения готов принять запрос на регистрацию от любого сервиса по адресу http: // localhost: 8761 / eureka

Служба Spring Cloud Eureka

Когда сервер обнаружения будет готов, теперь мы позволим нам создать наш микросервис . Опять же, это будет приложение весенней загрузки, и мы будем использовать стартовую загрузку для загрузки примера проекта.

Вот файл POM.

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencies></span> <Зависимостей></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <Идентификатор_группы> org.springframework.boot </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-boot-starter-actuator</artifactId></span> <Артефакт> весна-загрузочный стартер-привод </ артефакт></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.cloud</groupId></span> <Идентификатор_группы> org.springframework.cloud </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-cloud-starter-eureka</artifactId></span> <Артефакт> весна-облако-стартер-эврика </ артефакт></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
 
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <Идентификатор_группы> org.springframework.boot </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-boot-starter-test</artifactId></span> <Артефакт> весна-загрузка-стартер-тест </ артефакт></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>test</scope></span> <Сфера> Тест </ сфера></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencies></span> </ Зависимости></span>
 
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencyManagement></span> <DependencyManagement></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencies></span> <Зависимостей></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.cloud</groupId></span> <Идентификатор_группы> org.springframework.cloud </ идентификатор_группы></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-cloud-dependencies</artifactId></span> <Артефакт> весна-облако зависимостей </ артефакт></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><version>${spring-cloud.version}</version></span> <Версия> $ {весна-cloud.version} </ версия></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><type>pom</type></span> <Тип> POM </ тип></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>import</scope></span> <Сфера> импорта </ сфера></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencies></span> </ Зависимости></span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencyManagement></span> </ DependencyManagement></span>

Этот модуль будет действовать как микросервис, и при запуске он будет регистрироваться на сервере обнаружения. Для этой регистрации нам необходимо сконфигурировать в application.properties о сервере обнаружения. Ниже приведены записи.spring.application.name и уникальный идентификатор. для этого сервиса и eureka.client.service-url.defaultZone — это URL-адрес сервера, на котором хранится сервис.

1
2
3
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">spring.application.name=eureka-service</span> spring.application.name = Эврика-сервис</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">eureka.client.service-url.defaultZone=http://localhost:8761/eureka</span> eureka.client.service-url.defaultZone = HTTP: // локальный: 8761 / эврика</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">server.port=8085</span> server.port = 8085</span>

Чтобы настроить это приложение как службу eureka и клиент для сервера обнаружения, нам нужно аннотировать наше приложение весенней загрузки с помощью @EnableDiscoveryClient.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">package com.devglan.eurekaservice;</span> пакет com.devglan.eurekaservice;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.boot.SpringApplication;</span> import org.springframework.boot.SpringApplication;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.boot.autoconfigure.SpringBootApplication;</span> import org.springframework.boot.autoconfigure.SpringBootApplication;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.cloud.client.discovery.EnableDiscoveryClient;</span> import org.springframework.cloud.client.discovery.EnableDiscoveryClient;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@EnableDiscoveryClient</span> @EnableDiscoveryClient</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@SpringBootApplication</span> @SpringBootApplication</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public class EurekaServiceApplication {</span> открытый класс EurekaServiceApplication {</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public static void main(String[] args) {</span> public static void main (String [] args) {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">SpringApplication.run(EurekaServiceApplication.class, args);</span> SpringApplication.run (EurekaServiceApplication.class, args);</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Ниже приведен класс контроллера, где мы представили наши микросервисы для клиентских приложений.

GreetingController.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">package com.devglan.eurekaservice.controller;</span> пакет com.devglan.eurekaservice.controller;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.web.bind.annotation.GetMapping;</span> import org.springframework.web.bind.annotation.GetMapping;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.web.bind.annotation.RestController;</span> import org.springframework.web.bind.annotation.RestController;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@RestController</span> @RestController</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public class GreetingController {</span> открытый класс GreetingController {</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@GetMapping("/")</span> @GetMapping ( "/")</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public String greeting(){</span> public String приветствие () {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">return "Hello from" ;</span> вернуть «Привет из»;</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
 
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Spring Cloud Eureka Клиент

Теперь пришло время определить наш клиент. Для этого снова у нас будет следующий проект, созданный с помощью Spring Starter.

Этот клиент будет взаимодействовать с сервером обнаружения службы eureka и обнаруживать службу с помощью клиента eureka, а затем использовать микроуслуги, представленные в нашей реализации службы выше. Ниже приведен пример файла pom.xml.

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencies></span> <Зависимостей></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <Идентификатор_группы> org.springframework.boot </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-boot-starter-actuator</artifactId></span> <Артефакт> весна-загрузочный стартер-привод </ артефакт></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.cloud</groupId></span> <Идентификатор_группы> org.springframework.cloud </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-cloud-starter-eureka</artifactId></span> <Артефакт> весна-облако-стартер-эврика </ артефакт></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
 
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <Идентификатор_группы> org.springframework.boot </ идентификатор_группы></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-boot-starter-test</artifactId></span> <Артефакт> весна-загрузка-стартер-тест </ артефакт></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>test</scope></span> <Сфера> Тест </ сфера></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencies></span> </ Зависимости></span>
 
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencyManagement></span> <DependencyManagement></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependencies></span> <Зависимостей></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <Зависимость></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.cloud</groupId></span> <Идентификатор_группы> org.springframework.cloud </ идентификатор_группы></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-cloud-dependencies</artifactId></span> <Артефакт> весна-облако зависимостей </ артефакт></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><version>${spring-cloud.version}</version></span> <Версия> $ {весна-cloud.version} </ версия></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><type>pom</type></span> <Тип> POM </ тип></span>
               <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>import</scope></span> <Сфера> импорта </ сфера></span>
           <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </ Зависимость></span>
       <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencies></span> </ Зависимости></span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependencyManagement></span> </ DependencyManagement></span>

Следующие записи необходимы в файле application.properties . Поскольку это клиентский проект, следовательно, мы не хотим, чтобы он регистрировался на сервере обнаружения. Но могут быть сценарии, в которых приложение может быть как клиентом, так и сервером. В этом случае eureka.client.register-with-eureka будет иметь значение true.

application.properties

1
2
3
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">spring.application.name=eureka-client</span> spring.application.name = Eureka-клиент</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">eureka.client.service-url.defaultZone=http://localhost:8761/eureka</span> eureka.client.service-url.defaultZone = HTTP: // локальный: 8761 / эврика</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">eureka.client.register-with-eureka=false</span> eureka.client.register-с-Eureka = ложь</span>

Следующим будет наш класс Application. Он аннотирован @EnableDiscoveryClient для регистрации этого приложения в качестве клиента обнаружения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">package com.devglan.eurekaclient;</span> пакет com.devglan.eurekaclient;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.boot.SpringApplication;</span> import org.springframework.boot.SpringApplication;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.boot.autoconfigure.SpringBootApplication;</span> import org.springframework.boot.autoconfigure.SpringBootApplication;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.cloud.client.discovery.EnableDiscoveryClient;</span> import org.springframework.cloud.client.discovery.EnableDiscoveryClient;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@EnableDiscoveryClient</span> @EnableDiscoveryClient</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@SpringBootApplication</span> @SpringBootApplication</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public class EurekaClientApplication {</span> открытый класс EurekaClientApplication {</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public static void main(String[] args) {</span> public static void main (String [] args) {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">SpringApplication.run(EurekaClientApplication.class, args);</span> SpringApplication.run (EurekaClientApplication.class, args);</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Теперь мы будем определять наш контроллер, у которого будет один API, представленный на корневом уровне. Этот API обнаружит службы с сервера обнаружения и вызовет службу. Вот, мы автоматически подключили клиент eureka, и getNextServerFromEureka () принимает два параметра. Первый параметр — это сервисный идентификатор приложения микроуслуг. Наша реализация службы выше зарегистрировалась в клиенте обнаружения с таким именем eureka-service, и это же имя будет использоваться клиентским приложением eureka для обнаружения службы.

Как только эта служба обнаружена, клиент вызывает microservices.Remeber, что мы представили один API приветствия в реализации службы выше, и тот же API будет вызываться клиентом.

ClientController.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">package com.devglan.eurekaclient.controller;</span> пакет com.devglan.eurekaclient.controller;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import com.netflix.appinfo.InstanceInfo;</span> import com.netflix.appinfo.InstanceInfo;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import com.netflix.discovery.EurekaClient;</span> import com.netflix.discovery.EurekaClient;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.beans.factory.annotation.Autowired;</span> import org.springframework.beans.factory.annotation.Autowired;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.boot.web.client.RestTemplateBuilder;</span> import org.springframework.boot.web.client.RestTemplateBuilder;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.web.bind.annotation.GetMapping;</span> import org.springframework.web.bind.annotation.GetMapping;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.web.bind.annotation.RestController;</span> import org.springframework.web.bind.annotation.RestController;</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import org.springframework.web.client.RestTemplate;</span> import org.springframework.web.client.RestTemplate;</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@RestController</span> @RestController</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public class ClientController {</span> открытый класс ClientController {</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Autowired</span> @Autowired</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">private EurekaClient eurekaClient;</span> частный EurekaClient eurekaClient;</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Autowired</span> @Autowired</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">private RestTemplateBuilder restTemplateBuilder;</span> частный RestTemplateBuilder restTemplateBuilder;</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@GetMapping("/")</span> @GetMapping ( "/")</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public String invokeService(){</span> public String invokeService () {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">RestTemplate restTemplate = restTemplateBuilder.build();</span> RestTemplate restTemplate = restTemplateBuilder.build ();</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("eureka-service", false);</span> InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka ("eureka-service", false);</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">String serviceBaseUrl = instanceInfo.getHomePageUrl();</span> String serviceBaseUrl = instanceInfo.getHomePageUrl ();</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">return restTemplate.getForObject(serviceBaseUrl, String.class);</span> return restTemplate.getForObject (serviceBaseUrl, String.class);</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Тестирование приложения

Чтобы протестировать приложение, сначала запустите сервер обнаружения. Для этого нам нужно запустить DiscoveryServerApplication.java как приложение Java. Вы можете проверить консоль и найти похожие журналы, как показано ниже. Вы также можете увидеть URL http: // localhost: 8761 / eureka / в консоли, предоставляемой сервером обнаружения для регистрации служб.

Теперь запустите сервис. Запустите EurekaServiceApplication.java как приложение Java. Вы также можете запустить несколько экземпляров этой службы. Все экземпляры будут зарегистрированы на сервере обнаружения. При успешной регистрации службы вы получите ответ 204 от клиента обнаружения.

Теперь аналогичным образом запустите клиент, запустив EurekaClientApplication.java как приложение Java.

Теперь нажмите URL-адрес http: // localhost: 8080, чтобы проверить ответ на строку как Hello from из приложения-службы eureka.

Spring Eureka Dashboard

Вы, возможно, заметили в файле application.properties в реализации сервера обнаружения, что порт, который мы настроили, — 8761. На этом порту Spring cloud eureka предоставляет панель мониторинга, которая по умолчанию включена и отображает полезные метаданные и статус обслуживания. Здесь мы можем проверить информация о репликах сервера обнаружения, которая в нашем случае равна 1, работает на локальном хосте. Аналогично, у нас есть информация о зарегистрированной службе на сервере обнаружения с текущим состоянием.

Вывод

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

Смотреть оригинальную статью здесь: Spring Cloud Netflix Eureka

Мнения, высказанные участниками Java Code Geeks, являются их собственными.