Spring Boot - как общаться между микросервисами?

В настоящее время я работаю над проектом микросервисов Spring Boot. Я создал службы, и каждая служба работает отдельно. При этом мне нужны некоторые службы для связи с другими службами. Как я могу этого добиться?

Я видел несколько блогов об этом, в которых для этого используются облачные серверы Netflix, Eureka. Есть ли способ добиться этого в моей локальной среде без использования облачных серверов?

Вы можете запустить Eureka локально, однако Eureka - это не связь между микросервисами, а обнаружение других микросервисов. После того, как вы обнаружили микросервис, вам решать, как с ним взаимодействовать, Eureka не говорит вам, как это делать. Это означает, что ваш вопрос действительно широкий, теоретически вы даже можете общаться в коде Морзе в двоичном формате через TCP, если хотите.

g00glen00b 24.05.2018 13:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
17
1
50 506
7

Ответы 7

Как упоминал @ g00glen00b в комментариях, Eureka не используется для связи между микросервисами. Это для обнаружения службы. Я знаю два способа связи с другими микросервисами:

  1. RestTemplate
  2. Имитировать клиента

RestTemplate очень прост в использовании. Не требует настройки.

например

   ResponseType obj=  new RestTemplate().getForObject(URL, ResponseType.class, params);

url - URL

responseType - тип возвращаемого значения

params - переменные для расширения шаблона

Spring Doc ссылка на сайт для справки

Конечно вы можете. Микросервисы - это просто REST-сервисы. Вы должны понимать, как работают REST-сервисы. После этого просто напишите 2 микросервиса (2 Rest-Services: продюсер-сервис и потребитель-сервис) с Spring-boot, позвольте им работать под разными портами сервера, вызовите сервис-потребитель из другого, и все: у вас есть Микросервисы. Теперь это примитивный способ написания микросервисов.

Чтобы заставить их развиваться, вам нужно добавить немного «магии» (без ракетостроения), например, используя Ribbon для распределения нагрузки между двумя экземплярами вашей «службы-производителя».

Вы можете использовать службу обнаружения, которая представляет собой просто приложение с весенней загрузкой с аннотацией @EnableEurekaServer (вам необходимо добавить соответствующую зависимость в свой pom) Теперь добавьте к вашим первым (примитивным) микросервисам аннотацию @EnableDiscoveryClient к основным классам и defaultZone, указывающую на вашу службу eureka в application.properties (или application.yml) обоих, запустите службу eureka (служба обнаружения) и 2 микросервиса: они будут зарегистрированы в службе обнаружения. Конечно, теперь вам не нужно жестко кодировать http-адрес службы-производителя в службе-потребителе. Взгляните на этот руководство

Отредактировано 21 ноября 2018 г. в 12:41 GMT

Предположим, что ваша первая (тривиальная) микрослужба (чистая служба отдыха) работает на вашем компьютере под портом 8091.

В контроллере вашего второго (тривиального) микросервиса вы вызываете свою первую службу с помощью RestTemplate.getForEntity (url, responseType, uriVariables), как в примере в связанном руководстве:

ResponseEntity<CurrencyConversionBean> responseEntity = 
   new RestTemplate().getForEntity(
        "http://localhost:8091/currency-exchange/from/{from}/to/{to}", CurrencyConversionBean.class,  uriVariables);

Где url: URL-адрес вашей первой (микро) (остальной) службы. responseType: класс / тип объекта, ожидаемого в качестве ответа. uriVariables: это карта, содержащая переменные для шаблона URI.

Существуют разные способы связи между микросервисами. Но какой использовать: зависит от варианта использования.

  1. Api call: это фактический вызов rest api другой службы с использованием RestTemplate, FeignClient и т. д. Как.
ResponseType obj=  new RestTemplate().getForObject(URL, ResponseType.class, params);
  1. Но что, если сценарий использования другой, например, у вас есть микросервис клиент и микросервис заказы, оба используют отдельную базу данных. У вас есть customer name и другие детали в базе данных orders. Как только клиент обновит свое имя, вам также необходимо обновить данные в базе данных заказов. Как это можно сделать. Через API call? Тогда что, если микросервис учетная запись также нуждается в этом обновлении. Так что Rest api будет накладными расходами. В этом случае мы можем использовать MessageQueues как RabbitMQ. Микросервис клиента создаст событие обновления клиента, и любой микросервис, который в этом заинтересован, может подписаться.

Communication through message queue like RabbitMQ

Spring.io rabbit руководство по mq

Мне интересно узнать о выборке данных из разных микросервисов. Я хочу получить имя клиента из микросервиса продукта. В моем случае сервисная служба должна вызвать службу заказа, чтобы получить идентификатор заказа, на основе идентификатора заказа мне нужно вызвать в микросервис клиента, чтобы узнать имя клиента. в моем случае не одно поле содержит много полей для получения таких данных. вы предложите какое-нибудь решение проблемы?

Narasimha A 13.04.2020 15:53
@Autowired
    private RestTemplate restTemplate;

@Autowired
    private EurekaClient eurekaClient;


@RequestMapping("/dashboard/{myself}")
    public EmployeeInfo findme(@PathVariable Long myself) {
        Application application = eurekaClient.getApplication(employeeSearchServiceId);
        InstanceInfo instanceInfo = application.getInstances().get(0);
        String url = "http://" + instanceInfo.getIPAddr() + ":" + instanceInfo.getPort() + "/" + "employee/find/" + myself;
        System.out.println("URL" + url);
        EmployeeInfo emp = restTemplate.getForObject(url, EmployeeInfo.class);
        System.out.println("RESPONSE " + emp);
        return emp;
    }

source: https://dzone.com/articles/microservices-communication-service-to-service

В ответах, включая код, должно быть хотя бы минимальное описание, объясняющее, как работает код и почему он отвечает на вопрос. Кроме того, необходимо улучшить форматирование кода. Я предложил исправить последнюю проблему, исправьте, пожалуйста, часть описания кода.

Roberto Caboni 03.01.2020 14:11

Хотя REST знаком и поэтому прост в реализации, если вам нужны более гибкие и Java-подобные коммуникации, Spring (Spring-to-Spring) HTTP Invoker может быть хорошим выбором.

Spring's HTTP invoker is a good choice if you need HTTP-based remoting but also rely on Java serialization. It shares the basic infrastructure with RMI invokers, just using HTTP as transport. Note that HTTP invokers are not only limited to Java-to-Java remoting but also to Spring on both the client and server side. (The latter also applies to Spring's RMI invoker for non-RMI interfaces.)

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

Вам понадобятся эти библиотеки: Зуульский шлюз, Сервер обнаружения Eureka, Клиент Eureka Discovery, Шаблон отдыха (если вы разрабатываете REST API).

Шлюз может управлять всей маршрутизацией для приложений микросервисов с весенней загрузкой. Используя только аннотации и application.properties, вы можете настроить весь сервер. Вам НЕ нужно писать одну строку кода Java.

Сервер обнаружения прослушивает события, когда запускается или останавливается новый микросервис. Он регистрирует все микросервисы, помеченные @EnableEurekaClient.

Rest Template - это зрелая клиентская библиотека для отдыха, которая очень гибкая с точки зрения настраиваемых конфигураций HTTP-запросов и HTTP-ответов. Например, вы можете использовать конфигурации клиентских http-перехватчиков для перехвата HTTP-запроса и ответов для добавления дополнительных данных или информации журнала и т. д.

У меня есть приложение для микросервисов с открытым исходным кодом на моей странице GitHub. Бесплатно распространять, разветвлять, клонировать, коммерциализировать .. Свободно от желания :-)

Всего наилучшего..

Вы можете поделиться ссылкой на GitHub для меня?

Nankai 21.05.2021 09:52

Это зависит от вашего выбора, от того, хотите ли вы синхронизировать связь или асинхронную связь между вашими сервисами. Для служб синхронизации вы можете использовать любой из этих сторонних инструментов:

  1. Hashcorp Consul
  2. Netflix Eureka [Вы можете балансировать клиентскую нагрузку с помощью Netflix RIBBON]
  3. NATS так далее

Для Async вы можете использовать такие решения для обмена сообщениями, как:

  1. Redis [использовать список / потоки]
  2. ActiveMQ
  3. RabitMQ
  4. Кафка
  5. NATS так далее

Другие вопросы по теме