Spring cloud (2) — обнаружение сервисов (Eureka, Consul)

сервер Spring балансировки нагрузки DNS

В области распределенных систем хорошо известенCAP定理(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性, эти три свойства в любой распределенной системе不能同时满足,最多同时满足两个);eureka是AP,zookeeper是CP. за服务发现С точки зрения,可用性Сравнивать数据一致性более важный -AP胜过CP

Consul zookeeper euerka etcd
Служба проверки здоровья Состояние службы, память, жесткий диск и т. д. (Слабое) долгое соединение, поддержка активности Настраиваемая поддержка пульс соединения
Несколько центров обработки данных служба поддержки
служба хранения кв служба поддержки служба поддержки служба поддержки
последовательность raft paxos raft
CAP ca cp ap cp
Использование интерфейса (многоязычность) Поддержка http и dns клиент http (Sidecar) http/grpc
наблюдать за поддержкой (клиент наблюдает за изменениями поставщика услуг) Полный/поддержка длительного опроса служба поддержки Поддерживает длительный опрос/большинство приращений Поддержка длительного опроса
самоконтроль metrics metrics metrics
Безопасность acl /https acl поддержка https (слабая)
весенняя интеграция с облаком поддерживается поддерживается поддерживается поддерживается
  • raft: Raft сильно зависит от доступности узлов Leader для обеспечения согласованности данных кластера.

    raft

  • paxos: Лидер отправителя в первый раз отправляет сообщение о подготовке всем остальным серверам с запросом на подготовку. Если большинство серверов отвечает на обещание, они готовы и могут принять запись; второй отправитель отправляет официальное предложение всем серверам. , большинство серверов успешны, если ответ был получен.

  • long polling: Долгий опрос, клиент отправляет Ajax-запрос на сервер, сервер удерживает соединение после получения запроса, возвращает ответную информацию и закрывает соединение до тех пор, пока не появится новое сообщение, а затем отправляет новый запрос на сервер после клиент обрабатывает ответную информацию.

  • metrics: В качестве библиотеки измерений для мониторинга показателей она предоставляет множество модулей для предоставления вспомогательной статистики для сторонних библиотек или приложений, а также может отправлять данные измерений в Ganglia и Graphite для обеспечения графического мониторинга.

  • Eureka的自我保护模式
    Eureka ServerВо время работы он будет подсчитывать, была ли доля отказов сердцебиения в пределах 15 минут. Ниже 85%, если ниже (фактически в Производственная среда обычно связана с сетью нестабильность сети),Eureka ServerИнформация о регистрации текущего экземпляра будет защищена, а показывает предупреждение. Защищенный режим в основном используется для группы клиентов иEureka ServerСуществуют сетевые разногласия между защита в зональных сценариях. В защищенном режимеEureka Serverпопытается защитить свои услуги Примечание информацию в реестре и больше не удалять данные в реестре сервисов (то есть никакие микросервисы не будут незарегистрированными).
    такEurekaФилософия, сохраняя”好数据“и”坏数据“Это лучше, чем выбрасывать любые «хорошие данные», так что этот шаблон очень хорошо работает на практике. ,

Почему бы не использовать zookeeper в качестве службы обнаружения?

  1. ZooKeeperЭто служба распределенной координации, и ее ответственность заключается в обеспечении синхронизации и согласованности данных (Примечание: данные конфигурации, данные о состоянии) между всеми службами, находящимися под ее юрисдикцией; (строгая согласованность)
  2. Ядром службы обнаружения должна быть необходимость подчеркнуть высокую доступность службы.
  3. ZooKeeperИспользуйте единый главный процессLeaderИспользуется для обработки всех запросов транзакций клиента, используяZAB协议Транслировать статус количества серверов в транзакции всемFollowerвключено; как выбрать, если две из трех услуг завислиleader;1 不大于 (3/2)=1的,
  4. Правильная настройка и обслуживаниеZooKeeper服务это очень сложно
  5. В кластере возникла ошибка сегментации сети (из-за сбоя коммутатора подсети под коммутатором не могут получить доступ друг к другу)ZooKeeperОни будут удалены из своей области управления, и внешний мир не сможет получить доступ к этим узлам.“健康”Да, может оказывать услуги
  6. Даже если служба обнаружения вернется包含不实的信息的结果也比什么都不返回要好(Не удается найти доступный сервер из-за временного сбоя сети)

следовательно,EurekaОн вполне может справиться с ситуацией, когда некоторые узлы теряют связь из-за сетевых сбоев, а неzookeeperЭто парализовало бы всю службу реестра.

Spring Cloud Eureka (Реестр услуг)

  • добавить зависимости
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
  • Открытая регистрация в сервисе

пройти через@EnableEurekaServerАннотация запускает сервисный реестр, предоставляемый другим приложениям для диалога, эта аннотация должна находиться вspringboot工程Началоapplication类плюс

    package io.ymq.example.eureka.server;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }

Поставщик облачных услуг Spring

  • поставщик услуг
  • Зарегистрируйте собственный сервис в реестре Eureka, чтобы потребители сервиса могли его найти.
  • добавить зависимости
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
  • Открытая регистрация в сервисе
    В основном классе приложения, добавив@EnableEurekaClient, но толькоEurekaдоступны, вы также можете использовать@EnableDiscoveryClient. Требуется настройка для поискаEureka注册中心服务器
    discovery serviceРеализаций много(eureka、consul、zookeeperЖдать)
    @EnableDiscoveryClientна основеspring-cloud-commons,
    @EnableEurekaClientна основеspring-cloud-netflix.
    То есть, если выбранный реестрeureka, тогда рекомендуйте@EnableEurekaClient,
    Если это другой реестр, рекомендуется использовать@EnableDiscoveryClient.
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

	public static void main(String[] args) {
		SpringApplication.run(EurekaProviderApplication.class, args);
	}
}
  • Добавьте конфигурацию application.yml
    Добавьте конфигурацию, чтобы найти сервер Eureka
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: eureka-provider
server:
  port: 8081

Потребитель облачных сервисов Spring

В направленииEurekaСлужба регистрации, потребительское использованиеRibbonВключить балансировку нагрузки

Что такое лента?

RibbonдаNetflixВыпущенный проект с открытым исходным кодом, основная функция которого заключается в обеспечении алгоритма балансировки нагрузки программного обеспечения на стороне клиента, будетNetflixУслуги среднего уровня связаны друг с другом.RibbonКлиентский компонент предоставляет ряд полных элементов конфигурации, таких как время ожидания соединения, повторная попытка и т. д. Проще говоря, он указан в файле конфигурацииLoad Balancer(简称LB)Все машины позади,Ribbonавтоматически поможет вам на основе определенных правил(如简单轮询,随即连接等)для подключения этих машин. Мы также просты в использованииRibbonРеализуйте собственный алгоритм балансировки нагрузки.

Основные компоненты ленты

RibbonПреферанс на работе пройдетServerListчтобы получить список всех доступных сервисов, затем перейдитеServerListFilterОтфильтруйте некоторые адреса и, наконец, передайте оставшиеся адресаIRuleВ качестве окончательного результата был выбран один сервер.

  • ServerList: Используется для получения списка адресов. Он может быть либо статическим (предоставляя фиксированный набор адресов), либо динамическим (регулярно запрашивая список адресов из реестра).
  • ServerListFilter: только при использовании динамическогоServerListПри использовании он используется для фильтрации некоторых адресов в исходном списке услуг с использованием определенной политики.
  • IRule: выберите конечный адрес службы какLB结果. Стратегии выбора轮询、根据响应时间加权、断路器(当Hystrix可用时)Ждать.

Основная стратегия балансировки нагрузки, предоставляемая Ribbon

  • 简单轮询负载均衡(RoundRobin):Запросы планируются к разным серверам по очереди в циклическом режиме, то есть i = (i + 1) mod n выполняется каждый раз, когда выполняется расписание, и выбирается i-й сервер.
  • 随机负载均衡 (Random):Случайным образом выберите сервер со статусом UP
  • 加权响应时间负载均衡 (WeightedResponseTime):Назначьте вес в соответствии с соответствующим временем.Чем больше соответствующее время, тем меньше вес и меньше вероятность быть выбранным.
  • 区域感知轮询负载均衡(ZoneAvoidanceRule): Совместите производительность региона, в котором находится сервер, и доступность сервера для выбора сервера.

Поставщик услуг (предоставляет услуги)

  • Открытая регистрация в сервисеЗарегистрируйте три
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
    @Value("${server.port}")
    String port;
    @RequestMapping("/")
    public String home() {
        return "Hello world ,port:" + port;
    }
    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderApplication.class, args);
    }
}
  • Добавьте конфигурацию application.yml
    Порты 8081, 8082, 8083 по порядку
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: eureka-provider

server:
  port: 8081

Потребители услуг (в зависимости от других услуг)

  • pom.xml добавить зависимости
<!-- 客户端负载均衡 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

<!-- eureka客户端 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
  • Включить балансировку нагрузки службы
    Зарегистрируйтесь в сервисном реестре через @EnableDiscoveryClient и добавьте bean: restTemplate в ioc программы и используйте аннотацию @LoadBalanced, чтобы указать, что этот restRemplate включает балансировку нагрузки.
@EnableDiscoveryClient
@SpringBootApplication
public class RibbonConsumerApplication {
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
	public static void main(String[] args) {
		SpringApplication.run(RibbonConsumerApplication.class, args);
	}
}
  • метод поставщика потребителей
/**
 * 描述:调用提供者的 `home` 方法
 **/
@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/hello")
    public String hello() {
        return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody();
    }
}
  • Добавьте конфигурацию application.yml
    Укажите адрес службы в реестре, настройте собственный порт службы, имя службы
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: ribbon-consumer

server:
  port: 9000

Запускайте службы по очереди(Eureka服务,三台service provider和service Consumer),ПроверятьribbonВключить ли балансировку нагрузки

Spring Cloud Consul (реализация управления услугами для Consul)

так какConsulОн предоставляет сам сервер, поэтому нам не нужно实现EurekaПри создании сервисного реестра напрямую черезСкачать серверную программу консулготов к использованию.Consulвстроенный服务注册и发现框架(одноразовое), обладает следующими свойствами (см. список выше):

  • Реализация протокола распределенной согласованности
  • медицинское обследование
  • Хранение ключей/значений
  • Решение для нескольких центров обработки данных

Преимущества консула

  • Используйте алгоритм Raft для обеспечения согласованности, который является более простым, чем сложный алгоритм Paxos.
  • Поддерживает несколько центров обработки данных, а службы внутренней и внешней сетей используют разные порты для мониторинга
  • Кластер с несколькими центрами обработки данных может избежать единой точки отказа одного центра обработки данных, и при его развертывании необходимо учитывать задержку сети, фрагментацию и т. д.
  • Поддержка здоровья Check
  • Поддержка интерфейса протокола http и dns
  • Официально предоставить веб-интерфейс управления

Роль консула

  • client: Клиент, без сохранения состояния, перенаправляет запросы интерфейса HTTP и DNS на кластер серверов в локальной сети, все службы, зарегистрированные на текущем узле, будут перенаправлены на сервер, который сам не сохраняет эту информацию.
  • server: сервер, сохранение информации о конфигурации, кластер высокой доступности, связь с локальным клиентом в локальной сети, функция такая же, как у клиента, с той лишь разницей, что вся информация будет сохраняться локально, поэтому в случае сбоя информация может быть зарезервирована. . Связь с другими дата-центрами через WAN.Рекомендуется количество серверов в каждом дата-центре 3 или 5.
  • server-leader: Указывает, что этот сервер является их боссом.Он отличается от других серверов тем, что должен отвечать за синхронизацию зарегистрированной информации с другими серверами, а также отвечает за мониторинг работоспособности каждого узла.
  • raft: гарантия согласованности данных между серверными узлами.Протокол согласованности использует raft, в то время как zookeeper использует paxos, а etcd использует taft.
  • 服务发现协议: Consul использует протоколы http и dns, etcd поддерживает только http
  • 服务注册: Поддерживает два способа регистрации службы, и консул официально рекомендует второй способ.
  1. Один из них — зарегистрировать http API через службу консула, а сама служба вызывает API для реализации регистрации.
  2. Другой способ — реализовать регистрацию через файл конфигурации json и предоставить службы, которые необходимо зарегистрировать, в файле конфигурации формата json.
  • 服务发现: поддерживает два способа обнаружения службы,
  1. Один из них — запросить, какие сервисы доступны через http API,
  2. Другой — через DNS (порт 8600), который поставляется вместе с агентом консула.Имя домена дается в форме ИМЯ.служба.консул.ИМЯ — это имя службы в определенном файле конфигурации службы. Метод DNS может проверить службу с помощью метода проверки.
  • Протокол связи между сервисами: Consul использует протокол сплетен для управления членством и широковещательной рассылкой сообщений всему кластеру.

Эпилог

оconsulПостроение окружения и приложение будут добавлены позже~
существуетgithubпримерно наSpring CloudПолное развертывание.
Другие связанные статьи
Весеннее облако (1) - знакомство и подборка
Spring cloud (2) — обнаружение сервисов (Eureka, Consul)
Spring cloud (3) — балансировка нагрузки (Feign, Ribbon)
Весеннее облако (4) - предохранитель (Hystrix)
Spring cloud (5) — шлюз маршрутизации (Zuul)
Spring cloud (6) — управление конфигурацией и обновление (Config, Bus)
Наконец,дать звезду~
личный блог~
короткая книга~