Например у нас есть скажем две какие-то сущности в нашей системе, которые хранятся в своих репозитариях и с которыми происходят какие-то процессы. В микросервисной архитектуре мы можем раскидать их два сервиса! Предположим что нам это зачем-то нужно. Например у нас есть два сервиса 1) employee-service который содержит в себе информацию о работниках и 2) organization-service который содержит информацию об организациях. Но у нас в организации есть сотрудники и соответственно второй сервис может получать информацию из первого. Для этого мы можем из второго сервиса вызывать первый например через Spring RestTemplate. Но есть и вариант еще лучше и проще. Это декларативное описание API с помощью Feign.
@FeignClient(name = "employee-service")
public interface EmployeeClient {
@GetMapping("/organization/{organizationId}")
List findByOrganization(@PathVariable("organizationId") Long organizationId);
}
Вот таким простым образом мы из organization-service можем использовать emplyee-service. Но как organization-service узнает где находится employee-service? Ведь даже если они на одной машине, порты могут быть разные. Или вообще может выбираться рандомный свободный порт. Тут у нас на сцену выходит еще один, третий сервис, ведь у нас же микросервисная архитектура. Это discovery-service, еще одно spring-boot
приложение. Создать его проще простого, вот так:
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(DiscoveryApplication.class).run(args);
}
}
. Да для dicsovery-service мы будем использовать Eurekу. Теперь мы можем запусть эвкрику скажем на 8061 порту, потом зайти и глянуть какие же сервисы там зарегистрированы (Instances currently registered with Eureka). Теперь нам нужно чтобы наши сервисы регистрировались в Eureke и тогда они без проблем будут общаться друг с другом даже если будут постоянно перезжать по разным аддресам. Для этого нужно всего лишь добавить евкрика-клиент в зависимости вот так:
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
. И прописать в конфиги наших сервисов как они будут подключаться к еврике, вот так:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8061/eureka/
instance:
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
.
Комментариев нет:
Отправить комментарий