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




Как упоминал @ g00glen00b в комментариях, Eureka не используется для связи между микросервисами. Это для обнаружения службы. Я знаю два способа связи с другими микросервисами:
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.
Существуют разные способы связи между микросервисами. Но какой использовать: зависит от варианта использования.
Api call: это фактический вызов rest api другой службы с использованием RestTemplate, FeignClient и т. д. Как.ResponseType obj= new RestTemplate().getForObject(URL, ResponseType.class, params);
customer name и другие детали в базе данных orders. Как только клиент обновит свое имя, вам также необходимо обновить данные в базе данных заказов. Как это можно сделать. Через API call? Тогда что, если микросервис учетная запись также нуждается в этом обновлении. Так что Rest api будет накладными расходами. В этом случае мы можем использовать MessageQueues как RabbitMQ. Микросервис клиента создаст событие обновления клиента, и любой микросервис, который в этом заинтересован, может подписаться.Communication through message queue like RabbitMQ
Spring.io rabbit руководство по mq
Мне интересно узнать о выборке данных из разных микросервисов. Я хочу получить имя клиента из микросервиса продукта. В моем случае сервисная служба должна вызвать службу заказа, чтобы получить идентификатор заказа, на основе идентификатора заказа мне нужно вызвать в микросервис клиента, чтобы узнать имя клиента. в моем случае не одно поле содержит много полей для получения таких данных. вы предложите какое-нибудь решение проблемы?
@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
В ответах, включая код, должно быть хотя бы минимальное описание, объясняющее, как работает код и почему он отвечает на вопрос. Кроме того, необходимо улучшить форматирование кода. Я предложил исправить последнюю проблему, исправьте, пожалуйста, часть описания кода.
Хотя 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 для меня?
Это зависит от вашего выбора, от того, хотите ли вы синхронизировать связь или асинхронную связь между вашими сервисами. Для служб синхронизации вы можете использовать любой из этих сторонних инструментов:
Для Async вы можете использовать такие решения для обмена сообщениями, как:
Вы можете запустить Eureka локально, однако Eureka - это не связь между микросервисами, а обнаружение других микросервисов. После того, как вы обнаружили микросервис, вам решать, как с ним взаимодействовать, Eureka не говорит вам, как это делать. Это означает, что ваш вопрос действительно широкий, теоретически вы даже можете общаться в коде Морзе в двоичном формате через TCP, если хотите.