1. Обзор
В этом уроке мы представим клиентскую службу discovery через ” Spring Cloud Netflix Eureka “.
Обнаружение служб на стороне клиента позволяет службам находить и взаимодействовать друг с другом без жесткого кодирования имени хоста и порта. Единственная “фиксированная точка” в такой архитектуре состоит из реестра служб , в котором каждая служба должна зарегистрироваться.
Недостатком является то, что все клиенты должны реализовать определенную логику для взаимодействия с этой фиксированной точкой. Это предполагает дополнительное сетевое путешествие туда и обратно до фактического запроса.
С Netflix Eureka каждый клиент может одновременно выступать в качестве сервера, чтобы реплицировать свой статус на подключенный одноранговый узел. Другими словами, клиент получает список всех подключенных одноранговых узлов реестр служб и делает все дальнейшие запросы к любым другим службам с помощью алгоритма балансировки нагрузки.
Чтобы получить информацию о присутствии клиента, они должны отправить сигнал сердцебиения в реестр.
Для достижения цели этой записи мы реализуем три микросервиса :
- a реестр служб ( Сервер Eureka ),
- a REST сервис, который регистрируется в реестре ( Клиент Eureka ) и
- веб-приложение, которое использует службу REST в качестве клиента с поддержкой реестра ( Spring Cloud Netflix Притворный клиент ).
Дальнейшее чтение:
Руководство по Spring Cloud Netflix – Hystrix
В статье показано, как настроить резерв в логике приложений с помощью Spring Cloud Hystrix.Подробнее→Spring REST с прокси-сервером Zuul
Изучение использования прокси-сервера Zuul для API Spring REST, работа с CORS и ограничение политики того же происхождения браузера.Подробнее→
2. Сервер Эврика
Реализовать Сервер Eureka для реестра служб так же просто, как:
- добавление spring-cloud-starter-netflix-eureka-server в зависимости
- включите сервер Eureka в @SpringBootApplication , аннотировав его с помощью @EnableEurekaServer
- настройка некоторых свойств
Но мы будем делать это шаг за шагом.
Во – первых, мы создадим новый проект Maven и поместим в него зависимости. Вы должны заметить, что мы импортируем spring-cloud-starter-parent во все проекты, описанные в этом руководстве:
org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.cloud spring-cloud-starter-parent Greenwich.RELEASE pom import
Примечание: мы можем проверить последние выпуски Spring Cloud в документации по проектам Spring .
Далее мы создаем основной класс приложения:
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
Наконец, мы настраиваем свойства в формате YAML , поэтому файл конфигурации application.yml будет нашим файлом конфигурации:
server: port: 8761 eureka: client: registerWithEureka: false fetchRegistry: false
Здесь мы настраиваем порт приложения– 8761 по умолчанию используется для серверов Eureka . Мы говорим встроенному Клиенту Eureka не регистрироваться в “себе”, потому что наше приложение должно действовать как сервер.
Теперь мы направим ваш браузер на http://localhost:8761 для просмотра панели мониторинга Eureka , где мы позже проверим зарегистрированные экземпляры.
На данный момент мы видим основные показатели, такие как состояние и показатели здоровья.
3. Клиент Eureka
Чтобы @SpringBootApplication был осведомлен об обнаружении, мы должны включить некоторые Spring Discovery Client (например spring-cloud-starter-netflix-eureka-client ) в наш classpath.
Затем нам нужно аннотировать @Configuration либо @EnableDiscoveryClient , либо @EnableEurekaClient – обратите внимание, что эта аннотация необязательна, если у нас есть spring-cloud-starter-netflix-eureka-client зависимость от пути к классу.
Последний явно указывает Spring Boot использовать Spring Netflix Eureka для обнаружения службы. Чтобы наполнить наше клиентское приложение некоторым жизненным циклом, мы также включим пакет spring-boot-starter-web в pom.xml и реализовать REST контроллер.
Но сначала мы добавим зависимости. Опять же, мы можем предоставить зависимости spring-cloud-starter-parent определять версии артефактов для нас:
org.springframework.cloud spring-cloud-starter-netflix-eureka-starter org.springframework.boot spring-boot-starter-web
Здесь мы реализуем основной класс приложения:
@SpringBootApplication @RestController public class EurekaClientApplication implements GreetingController { @Autowired @Lazy private EurekaClient eurekaClient; @Value("${spring.application.name}") private String appName; public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } @Override public String greeting() { return String.format( "Hello from '%s'!", eurekaClient.getApplication(appName).getName()); } }
И интерфейс GreetingController :
public interface GreetingController { @RequestMapping("/greeting") String greeting(); }
Здесь вместо интерфейса мы также могли бы просто объявить отображение внутри клиентского приложения Eureka класса. Интерфейс может быть полезен, если мы хотим поделиться им между сервером и клиентом.
Затем мы должны настроить application.yml с настроенным Spring именем приложения, чтобы однозначно идентифицировать нашего клиента в списке зарегистрированных приложений.
Мы можем позволить Пружинный Ботинок выберите для нас случайный порт, потому что позже мы получим доступ к этой службе с ее именем.
Наконец, мы должны сообщить нашему клиенту, где он должен найти реестр:
spring: application: name: spring-cloud-eureka-client server: port: 0 eureka: client: serviceUrl: defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} instance: preferIpAddress: true
Когда мы решили настроить наш клиент Eureka таким образом, мы имели в виду, что впоследствии этот вид услуг должен быть легко масштабируемым.
Теперь мы запустим клиент и направим ваш браузер на http://localhost:8761 еще раз, чтобы увидеть его статус регистрации на панели мониторинга Eureka. Используя Панель мониторинга, мы можем выполнить дальнейшую настройку, например, связать домашнюю страницу зарегистрированного клиента с Панелью мониторинга в административных целях. Однако параметры конфигурации выходят за рамки этой статьи.
4. Симулируйте Клиента
Чтобы завершить наш проект с тремя зависимыми микросервисами, мы теперь реализуем REST -потребляющее веб-приложение с использованием Spring Netflix Feign Client .
Думать о Притворяться как открытие, осознающее Пружинная опорная плита использование интерфейсов для связи с конечными точками. Эти интерфейсы будут автоматически реализованы во время выполнения и вместо сервис-url-адреса , он использует сервис-имена .
Без Симуляции нам пришлось бы автоматически подключать экземпляр Клиента Eureka к вашему контроллеру, с помощью которого мы могли бы получать служебную информацию по имени службы в качестве Приложения объекта.
Мы будем использовать это Приложение , чтобы получить список всех экземпляров этой службы, выбрать подходящий и использовать эту Информацию об экземпляре , чтобы получить имя хоста и порт. С помощью этого мы могли бы выполнить стандартный запрос с любым http – клиентом .
Например:
@Autowired private EurekaClient eurekaClient; public void doRequest() { Application application = eurekaClient.getApplication("spring-cloud-eureka-client"); InstanceInfo instanceInfo = application.getInstances().get(0); String hostname = instanceInfo.getHostName(); int port = instanceInfo.getPort(); // ... }
/| RestTemplate также можно использовать для доступа к Eureka клиентским службам по имени, но эта тема выходит за рамки этой записи.
Чтобы настроить наш проект FeignClient , мы добавим следующие четыре зависимости в его pom.xml :
org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf
Клиент Feign находится в пакете spring-cloud-starter-feign . Чтобы включить его, мы должны аннотировать @Configuration с помощью @EnableFeignClients . Чтобы использовать его, мы просто аннотируем интерфейс с помощью @FeignClient(“имя службы”) и автоматически подключаем его к контроллеру.
Хорошим способом создания таких Притворных | Клиентов является создание интерфейсов с @RequestMapping аннотированными методами и помещение их в отдельный модуль. Таким образом, они могут быть разделены между сервером и клиентом. На стороне сервера вы можете реализовать их как @Controller , а на стороне клиента они могут быть расширены и аннотированы как @FeignClient .
Кроме того, пакет spring-cloud-starter-eureka должен быть включен в проект и включен путем аннотирования основного класса приложения с помощью @EnableEurekaClient .
Зависимости spring-boot-starter-web и spring-boot-starter-thymeleaf используются для представления представления , содержащего извлеченные данные из нашего REST сервиса.
Это будет наш Притворный клиент интерфейс:
@FeignClient("spring-cloud-eureka-client") public interface GreetingClient { @RequestMapping("/greeting") String greeting(); }
Здесь мы реализуем основной класс приложения, который одновременно выступает в качестве контроллера:
@SpringBootApplication @EnableFeignClients @Controller public class FeignClientApplication { @Autowired private GreetingClient greetingClient; public static void main(String[] args) { SpringApplication.run(FeignClientApplication.class, args); } @RequestMapping("/get-greeting") public String greeting(Model model) { model.addAttribute("greeting", greetingClient.greeting()); return "greeting-view"; } }
Это будет HTML-шаблон для нашего представления:
Greeting Page
По крайней мере, файл конфигурации application.yml почти такой же, как на предыдущем шаге:
spring: application: name: spring-cloud-eureka-feign-client server: port: 8080 eureka: client: serviceUrl: defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
Теперь мы можем создать и запустить эту службу. Наконец, мы направим ваш браузер на http://localhost:8080/get-greeting и он должен отображать что-то вроде следующего:
Hello from SPRING-CLOUD-EUREKA-CLIENT!
5. “TransportException: Не удается выполнить запрос на любом известном сервере”
Во время работы сервера Eureka мы часто сталкиваемся с такими исключениями, как:
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
В основном это происходит из-за неправильной конфигурации в application.properties или application.yml . Eureka предоставляет клиенту два свойства, которые можно настроить.
- registerWithEureka: Если мы сделаем это свойство как true , то при запуске сервера встроенный клиент попытается зарегистрироваться на сервере Eureka.
- fetchRegistry: Встроенный клиент попытается извлечь реестр Eureka , если мы настроим это свойство как true.
Теперь когда мы запускаем сервер Eureka, мы не хотим регистрировать встроенный клиент для настройки себя с сервером .
Если мы пометим вышеуказанные свойства как true (или не настроим их как true по умолчанию) при запуске сервера, встроенный клиент попытается зарегистрироваться на сервере Eureka , а также попытается получить реестр, который еще не доступен. В результате мы получаем TransportException .
Поэтому мы никогда не должны настраивать эти свойства как true в серверных приложениях Eureka . Правильные настройки, которые следует ввести в application.yml , приведены ниже:
eureka: client: registerWithEureka: false fetchRegistry: false
6. Заключение
Как мы уже видели, теперь мы можем реализовать реестр служб с помощью Spring Netflix Eureka Server и зарегистрировать некоторые Клиенты Eureka с его помощью.
Поскольку наш клиент Eureka с шага 3 прослушивает случайно выбранный порт, он не знает своего местоположения без информации из реестра. С помощью Притворного клиента и нашего реестра мы можем найти и использовать службу REST , даже когда местоположение меняется.
Наконец, у нас есть общая картина использования обнаружения служб в архитектуре микросервиса.
Как обычно, вы найдете исходники на GitHub , который также включает в себя набор файлов, связанных с Docker , для использования с docker-compose для создания контейнеров из нашего проекта.