С широким применением микросервисной архитектуры обнаружение сервисов стало незаменимым компонентом. Обнаружение сервисов — ключевой вопрос в архитектуре микросервисов, который включает в себя управление и координацию большого количества сервисов в распределенной системе. В этой статье будут рассмотрены основные концепции, принципы работы и практическое применение обнаружения сервисов. Сначала мы представим основные концепции и принципы работы обнаружения сервисов, затем на практических примерах продемонстрируем применение обнаружения сервисов на практике и, наконец, изучим проблемы и будущие тенденции развития открытия сервисов. Мы надеемся, что благодаря этой статье читатели смогут получить полное и глубокое представление об обнаружении сервисов.
Архитектура микросервисов — это архитектурный стиль, который делит одно приложение на набор небольших сервисов. Каждая служба работает в своем собственном процессе, и службы взаимодействуют друг с другом через упрощенный механизм (обычно API-интерфейс HTTP-ресурсов). Эти услуги основаны на бизнес-возможностях и могут быть развернуты независимо с помощью полностью автоматизированного механизма развертывания. Кроме того, эти сервисы могут быть написаны на разных языках программирования и использовать разные технологии хранения данных.
Обнаружение сервисов является ключевым компонентом распределенных систем, и его основная функция — отслеживание сетевого расположения всех сервисов в системе. В микросервисной архитектуре, поскольку существует множество сервисов и их расположение может часто меняться, необходим механизм обнаружения сервисов для динамического поиска и мониторинга сервисов.
Обнаружение службы обычно включает в себя два основных процесса: регистрацию службы и поиск службы. Регистрация службы означает регистрацию собственного сетевого адреса в центре регистрации службы при запуске службы; поиск службы означает, что, когда службе необходимо вызвать другую службу, она запрашивает центр регистрации службы, чтобы получить сетевой адрес вызываемой службы.
Благодаря обнаружению сервисов каждому сервису не нужно заботиться о конкретном местонахождении других сервисов. Для связи ему достаточно знать имя сервиса, что значительно повышает гибкость и масштабируемость системы.
В микросервисной архитектуре важность обнаружения сервисов в основном отражается в следующих аспектах:
Таким образом, обнаружение сервисов играет решающую роль в микросервисной архитектуре.
Принцип работы обнаружения служб в основном включает в себя два этапа: регистрацию службы и поиск службы.
Регистрация службы. Когда служба (например, экземпляр микрослужбы) запускается, она отправляет свой сетевой адрес (например, IP-адрес и номер порта) и, возможно, другую информацию (например, имя службы, номер версии и т. д.) в службу регистрации службы. центр. Реестр службы отвечает за хранение и поддержание этой информации, чтобы, когда другим службам потребуется взаимодействовать со службой, они могли получить сетевой адрес службы, запросив реестр службы. Этот механизм обеспечивает динамическое обнаружение и связь между службами, повышая гибкость и масштабируемость системы.
Поиск службы. Поиск службы — еще один важный шаг в процессе обнаружения службы. Когда службе (например, экземпляру микрослужбы) необходимо вызвать другую службу, она запрашивает сетевой адрес вызываемой службы из реестра служб. Центр регистрации услуги вернет адрес вызываемой услуги, после чего вызывающий абонент сможет напрямую связаться с вызываемой услугой. Этот механизм обеспечивает динамическое обнаружение и связь между службами, повышая гибкость и масштабируемость системы.
Центр регистрации услуг также должен иметь возможности балансировки нагрузки. В большой распределенной системе центру регистрации сервисов может потребоваться обработка большого количества запросов на регистрацию и поиск сервисов. Если все запросы обрабатываются одним центром регистрации сервисов, это может стать узким местом системы. Поэтому обычно развертываются несколько экземпляров центра регистрации служб, а запросы распределяются по разным экземплярам с помощью механизма балансировки нагрузки для улучшения возможностей обработки и доступности системы.
Кроме того, центру регистрации услуг также необходимо предоставить механизм, позволяющий, когда услуга имеет несколько экземпляров, один экземпляр может быть выбран и возвращен вызывающей стороне в соответствии с определенной стратегией (например, опросом, случайным образом, в соответствии с условиями нагрузки и т. д.). .). Это также метод балансировки нагрузки.
Поэтому центру регистрации сервисов необходимо не только управлять регистрацией и поиском сервисов, но и иметь возможности балансировки нагрузки для обеспечения высокой доступности и высокой производительности системы.
Мониторинг услуг. Центру регистрации услуг необходимо отслеживать зарегистрированные услуги, включая доступность услуг, время отклика, частоту ошибок и другие показатели. Эти данные мониторинга можно использовать для анализа рабочего состояния службы, а также для своевременного обнаружения и решения проблем.
Среди них тестирование доступности услуг обычно реализуется посредством проверки работоспособности:
Проверка работоспособности. Центр регистрации услуг обычно регулярно выполняет проверки работоспособности зарегистрированных услуг, чтобы проверить, доступна ли услуга. Проверка работоспособности обычно отправляет простой запрос к службе, например запрос HTTP HEAD. Если служба отвечает нормально, служба считается исправной; если служба не может ответить или ответ неправильный, центр регистрации службы считает службу неработоспособной и объявляет ее неработоспособной. будет удален из списка служб, что не позволит другим службам вызывать недоступную службу.
Динамическое обновление центра регистрации обнаружения услуг означает, что при изменении статуса услуги (например, услуга онлайн, офлайн, сбой и т. д.) центр регистрации услуги может обновлять информацию о состоянии услуги в режиме реального времени.
В частности, динамические обновления в основном включают в себя следующие аспекты:
Благодаря этому механизму динамического обновления центр регистрации сервисов может отражать последнее состояние сервисов в системе в режиме реального времени, тем самым обеспечивая динамическое обнаружение и связь между сервисами, а также повышая гибкость и доступность системы.
Обнаружение сервисов может использовать различные протоколы, включая HTTP, RPC, DNS и т. д. Каждый протокол имеет свои преимущества и недостатки:
HTTP:
RPC (нравиться gRPC, Бережливость):
DNS:
Выше приведены некоторые преимущества и недостатки использования различных протоколов для обнаружения сервисов. Какой протокол выбрать, зависит от конкретных потребностей и среды системы.
Реализация обнаружения служб поставщиком услуг в основном включает в себя следующие шаги:
Вот пример поставщика услуг, реализованный с использованием Spring Cloud и Eureka:
@SpringBootApplication
@EnableEurekaClient
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
В этом примере,@EnableEurekaClient
Аннотации включены Eureka клиент, что приводит к автоматической регистрации службы в Eureka сервер и периодически отправляет контрольные сигналы. Другая информация о службе (например, имя службы, адрес, порт и т. д.) может быть установлена в файле конфигурации.
Реализация обнаружения служб потребителем службы в основном включает в себя следующие шаги:
Вот пример потребителя сервиса, реализованного с использованием Spring Cloud и Eureka:
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
@Autowired
private DiscoveryClient discoveryClient;
public void doSomething() {
List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
if (!instances.isEmpty()) {
ServiceInstance instance = instances.get(0); // Здесь мы просто возьмем первый пример, который может понадобиться в реальных приложениях. нагрузкиалгоритм // использовать instance.getHost() и instance.getPort() Получите адрес и порт Служить, затем сделайте звонок Служить.
}
}
}
В этом примере,@EnableDiscoveryClient
Аннотации включен Служить клиент обнаружения, который позволяет Служить запросы Eureka Служить Приобретение устройства Служитьпоставщикизинформация。doSomething
В методе мы сначала передаем discoveryClient.getInstances
Метод получает информацию о поставщике услуг, а затем выполняет вызов службы.
Реализация обнаружения служб потребителем службы в основном включает в себя следующие шаги:
Вот пример потребителя сервиса, реализованного с использованием Spring Cloud и Eureka:
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
@Autowired
private DiscoveryClient discoveryClient;
public void doSomething() {
List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
if (!instances.isEmpty()) {
ServiceInstance instance = instances.get(0); // Здесь мы просто возьмем первый пример, который может понадобиться в реальных приложениях. нагрузкиалгоритм // использовать instance.getHost() и instance.getPort() Получите адрес и порт Служить, затем сделайте звонок Служить.
}
}
}
В этом примере,@EnableDiscoveryClient
Аннотации включен Служить клиент обнаружения, который позволяет Служить запросы Eureka Служить Приобретение устройства Служитьпоставщикизинформация。doSomething
В методе мы сначала передаем discoveryClient.getInstances
Метод получает информацию о поставщике услуг, а затем выполняет вызов службы.
Внедрение обнаружения служб в центре регистрации в основном включает в себя следующие этапы:
Ниже приводится использование Spring Boot и HTTP Пример реализованного упрощенного реестра сервисов:
@SpringBootApplication
@RestController
public class RegistryCenterApplication {
private Map<String, String> services = new ConcurrentHashMap<>();
public static void main(String[] args) {
SpringApplication.run(RegistryCenterApplication.class, args);
}
@PostMapping("/register")
public void register(@RequestParam String serviceName, @RequestParam String serviceAddress) {
services.put(serviceName, serviceAddress);
}
@GetMapping("/discover")
public String discover(@RequestParam String serviceName) {
return services.get(serviceName);
}
}
В этом примере мы используем ConcurrentHashMap
хранить Служитьинформация,/register
Интерфейс для регистрации Служить,/discover
Интерфейс используется для запроса услуг. Это всего лишь очень упрощенный пример. Фактический реестр служб будет более сложным и должен решать такие проблемы, как параллелизм, сетевое взаимодействие, обработка ошибок и проверки работоспособности служб.
Реализация полноценного центра регистрации услуг включает в себя большое количество контента, включая сетевое программирование, многопоточное программирование, обработку ошибок и т. д. Ниже приведен упрощенный пример с использованием Spring Boot и HTTP выполнить Служитьзарегистрироваться、Служить Находитьипроверка здоровьяиз Функция。
Сначала мы определяем ServiceInstance
Класс для представления экземпляра службы:
public class ServiceInstance {
private String serviceName;
private String host;
private int port;
// Конструктор, геттер и setter упущение
}
Затем мы определяем ServiceRegistry
Класс для реализации функции регистрации и обнаружения Служить:
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class ServiceRegistry {
private Map<String, ServiceInstance> services = new ConcurrentHashMap<>();
public void register(ServiceInstance instance) {
services.put(instance.getServiceName(), instance);
}
public ServiceInstance discover(String serviceName) {
return services.get(serviceName);
}
}
Далее мы определяем RegistryController
класс для обработки HTTP просить:
import org.springframework.web.bind.annotation.*;
@RestController
public class RegistryController {
private final ServiceRegistry registry;
public RegistryController(ServiceRegistry registry) {
this.registry = registry;
}
@PostMapping("/register")
public void register(@RequestBody ServiceInstance instance) {
registry.register(instance);
}
@GetMapping("/discover/{serviceName}")
public ServiceInstance discover(@PathVariable String serviceName) {
return registry.discover(serviceName);
}
}
Наконец, мы можем определить запланированную задачу для проверки работоспособности службы:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class HealthCheckTask {
private final ServiceRegistry registry;
public HealthCheckTask(ServiceRegistry registry) {
this.registry = registry;
}
@Scheduled(fixedRate = 60000)
public void healthCheck() {
// верно registry Каждый Служить в из выполняет проверку работоспособности. Если проверка не удалась, удалите Служить.
}
}
Это всего лишь упрощенный пример, реальный реестр служб будет более сложным. Например, обработка параллелизма может потребовать использования блокировок или других механизмов управления параллелизмом; сетевая связь может потребовать использования более сложных протоколов, таких как TCP, UDP или HTTP/2; при обработке ошибок может потребоваться учитывать различные сетевые ошибки, таймауты, сбои в обслуживании и т.д.
Eureka да Netflix Продукт с открытым исходным кодом, который обеспечивает регистрацию и обнаружение Служить, это да Spring Cloud Часть экосистемы, в основном используемая для реализации функций управления сервисами в микросервисной архитектуре. Эврика Основные особенности включают в себя:
Etcd Да CoreOS Разработано на основе Go Языковая реализация с открытым исходным кодом, высокодоступная распределенная система хранения значений «ключ-значение» для общей конфигурации и Служить обнаружению. И т.д. Основные особенности включают в себя:
ZooKeeper да Apache Это проект с открытым исходным кодом, это программное обеспечение, которое обеспечивает согласованность обслуживания распределенных приложений. Оно предоставляет такие функции, как: обслуживание конфигурации, обслуживание доменного имени, распределенная синхронизация, групповое обслуживание и т. д. смотритель зоопарка Основные особенности включают в себя:
Nacos даAlibaba с открытым исходным кодом — это простая в использовании платформа для управления, обнаружения и настройки микросервисов. Накос предоставляет простой набор API Осуществить Служитьиз регистрацию, открытие и проверку работоспособности. Накос Основные особенности включают в себя:
Кубернетес (сокращенно K8s)да Google Платформа оркестрации контейнеров с открытым исходным кодом для автоматического развертывания, расширения и управления контейнерными приложениями. Кубернетес Основные особенности включают в себя:
Поэтому Kubernetes да Платформа оркестрации контейнеров, которая очень подходит для создания и запуска распределенных систем.
Будущие тенденции развития Service Discovery, являющегося ключевым компонентом микросервисной архитектуры, могут включать следующие аспекты:
Вот и вседаверно Служить Откройте для себя будущие тенденции развитияизнекоторые прогнозы,Конкретную ситуацию развития необходимо наблюдать с учетом изменений в технологиях и на рынке.