1: Что такое лента?
Лента - это проект с открытым исходным кодом, выпущенный Netflix. Его основная функция заключается в предоставлении алгоритмов балансировки программного нагрузки на стороне клиента для соединения сервисов среднего уровня Netflix. Компонент клиента Ribbon предоставляет серию полных элементов конфигурации, таких как тайм -аут подключения, повторная попытка и т. Д. Проще говоря, он должен перечислить все машины, стоящие за балансировщиком нагрузки (LB для короткого) в файле конфигурации. Лента автоматически поможет вам подключить эти машины на основе определенных правил (таких как простой опрос, мгновенное соединение и т. Д.). У нас также есть очень простой способ реализовать пользовательские алгоритмы балансировки нагрузки с использованием ленты.
Два: классификация схемы LB
В настоящее время основная схема LB может быть разделена на две категории: одна - централизованная LB, то есть использование независимых объектов LB (может быть оборудованием, таким как F5 или программное обеспечение, такое как Nginx) между потребителем услуг и поставщиком, а объект отвечает за пересылку запросов доступа к поставщику услуг через определенную политику; Другим является в процессе LB, который интегрирует логику LB в потребителя, и потребитель знает из центра регистрации услуг, который доступны адреса, а затем выбирает подходящий сервер из самих этих адресов. Лента принадлежит последнему. Это просто библиотека классов, которая интегрирована в потребительский процесс. Через это потребители получают адрес поставщика услуг.
Три: основные компоненты и рабочий процесс ленты
Основные компоненты ленты (все из которых являются типами интерфейсов) имеют следующее:
Серверный список
Используется для получения списка адресов. Он может быть либо статичным (предоставление фиксированного набора адресов), либо динамическим (повторяющийся запрос для списков адресов из реестра).
ServerListfilter
Используется только при использовании Dynamic Serverlist, он используется для использования определенных политик в исходном списке услуг для рассмотрения некоторых адресов.
Ируле
Выберите окончательный адрес службы в качестве результата LB. Выберите Политики включают в себя опрос, взвешивание в зависимости от времени отклика, выключатель схемы (когда доступен Hystrix) и т. Д.
Когда лента работает, предпочтительнее использовать Serverlist для получения всех доступных списков служб, а затем использовать ServerListFilter для рассмотрения некоторых адресов и, наконец, выбирать сервер в оставшихся адресах через Irule в качестве конечного результата.
Четыре: Введение в основные стратегии балансировки нагрузки, предоставленные лентой
1: Простая балансировка нагрузки на нагрузку (Roundrobin)
Запросы запланированы по очереди в опрос, то есть каждое график выполняется i = (i + 1) mod n, и I-Th-сервер выбирается.
2: балансировка случайной нагрузки (случайная)
Случайно выберите сервер со статусом UP
3: Уравновешенное балансирование нагрузки (WeensedResponsetime)
Вес выделяется в соответствии с соответствующим временем. Чем дольше соответствующее время, тем меньше вес и тем ниже вероятность выбора.
4: Zoneavoidancerule
Полное определение производительности области сервера и сервера доступности сервера
Сравнение собственных стратегий балансировки нагрузки ленты
| Имя стратегии | Политическое заявление | Описание политики | Инструкции по реализации |
| BestAvailableRule | Общедоступный класс BestAvailAbleRule Extends ClientConfigenabledRoundrobinRule | Выберите сервер с наименьшим параллельным запросом | Проверьте сервер один за другим. Если сервер споткнулся, игнорируйте его. Выберите сервер с наименьшим ActiveRequestScount |
| Доступность FilteringRule | Общедоступный класс. | Отфильтруйте те серверы, отмеченные как схема, сбитые с толку из -за сбоя подключения, и отфильтруйте те серверы с высокой параллельностью (активные соединения превышают настроенный порог) | Использование предоставления доступности для включения логики фильтрационных серверов фактически для проверки статуса работы каждого сервера, записанного в статусе |
| WeeshedResponsetimeRule | Общедоступный класс. | Вес выделяется в соответствии с соответствующим временем. Чем дольше соответствующее время, тем меньше вес и тем ниже вероятность выбора. | Фоновый поток регулярно читает время ответа на оценку из статуса и вычисляет вес для каждого сервера. Расчет веса также относительно прост. Ответ -время минус среднее время отклика каждого сервера является весом сервера. Когда статус только начинается и не сформирована статистика, используйте политику Рубина, чтобы выбрать сервер. |
| Повторение | Public Class Retryrule расширяет AbstractullAncerRule | Повторите механизм на машине для выбранной политики балансировки нагрузки. | В течение периода конфигурации, когда выбор сервера не увенчался успехом, вы продолжаете пытаться выбрать доступный сервер, используя Subrule |
| Roundrobinrule | Общедоступный класс RoundRobinRule расширяет AbstractLoadAncerRule | Опрос метода RoundRobin для выбора сервера | Индекс опроса и выберите сервер, соответствующий индексу |
| Случайный | Public Class RandomRule расширяет AbstractLackAncerRule | Случайно выберите сервер | Случайно по индексу выберите сервер, соответствующий позиции индекса |
| Zoneavoidancerule | открытый класс Zoneavoidancerule Extends PredicateBasedrule | Полное определение производительности области сервера и сервера доступности сервера | Используйте Zoneavoidancepredicate и доступность, чтобы определить, выбирается ли сервер. Предыдущий определяет, доступна ли операционная производительность зоны. Исключить недоступные зоны (все серверы). Доступность Presedicate используется для фильтрации серверов со слишком большим количеством соединений. |
5: только лента
Создать название проекта Maven Ribbon_Client
Содержание POM
<Depectientdy> <Dependency> <groupId> com.netflix.ribbon </GroupId> <ArtifactId> ленточный Core </artifactId> <sersive> 2.2.0 </version> </dependency> <dehyed> <groupid> com.netflix.ribbon </groupd> <ratifactid> ribbon-httpclient </artifactid> <merial> 2.2.0. </зависимости>
Образец client.properties файл конфигурации
# Максимальное количество RESRIES SAMER-client.ribbon.maxautoretries = 1# max Количество следующих серверов для повторения (исключая первый сервер). Образец client.ribbon.serverlistrefreshinterval = 2000# Timeout Connect, используемый Apache httpclient sample-client.ribbon.connecttimeout = 3000# Timeout, используемый Apache httpclient sample-client.ribbon.readtimeout = 3000# Начальный список серверов может быть изменена через свойство Archaius at Runtime. Sample-client.ribbon.listofservers = www.sohu.com: 80, www.163.com: 80, www.sina.com.cn: 80sample-client.ribbon.enableprimeconnections = true
Ленточный код
Импорт java.net.uri; import com.netflix.client.clientfactory; import com.netflix.client.http.httprequest; import com.netflix.client.http.httpresponse; import com.netflix.config.configurationmanager; importprestlix.loadbalaNcer.zoneawar. com.netflix.niws.client.http.restclient; public class ribbonmain {public static void main (string [] args) выбрасывает исключение {configurationManager.loadPropertiesFromResources ("Sample-client.properties"); System.out.println (ConfigurationManager.getConfigInstance (). GetProperty ("sample-client.ribbon.listofservers")); RestClient Client = (RestClient) clientFactory.getNamedClient ("Sample-Client"); Httprequest request = httprequest.newbuilder (). Uri (new uri ("/")). Build (); for (int i = 0; i <4; i ++) {httpresponse response = client.executewithloadbalancer (request); System.out.println ("Статус для URI:" + response.getRequestureuri () + "IS:" + response.getStatus ()); } Zoneawareloadbalancer lb = (Zoneawareloadbalancer) client.getloadbalancer (); System.out.println (lb.getloadbalancerstats ()); ConfigurationManager.getConfigInstance (). SetProperty ("sample-client.ribbon.listofservers", "ccblog.cn:80, www.linkedin.com:80"); System.out.println («Изменение серверов ...»); Thread.sleep (3000); for (int i = 0; i <3; i ++) {httpresponse response = client.executewithloadbalancer (request); System.out.println ("Статус для URI:" + response.getRequestureuri () + "IS:" + response.getStatus ()); } System.out.println (lb.getLoadBalancerStats ()); }}Анализ кода
Используйте Archaius ConfigurationManager для загрузки свойств;
Используйте ClientFactory для создания клиентов и балансировщиков нагрузки;
Используйте строитель для построения HTTP -запросов. Обратите внимание, что мы поддерживаем только путь «/» части URI. Как только сервер будет выбран балансировщиком нагрузки, клиент рассчитывает полный URI;
Вызов API client.executewithloadalancer () не является api exeucte ();
Динамически исправить пул серверов в конфигурации;
Дождитесь обновления списка серверов (интервал обновления, определенный в файле конфигурации, составляет 3 секунды);
Распечатайте статистику сервера, записанную балансировщиком нагрузки.
Шесть: лента в сочетании с Эврикой
Во-первых, запустите проект Eureka_register_service (регистрационный центр) и проект Biz-Service-0 (производитель услуг)
Создать проект Maven eureka_ribbon_client Этот проект запускает и связанные конфигурации зависят от eureka_register_service и Biz-Service-0
Присоединение к нему
<parent> <groupid> org.springframework.boot </GroupId> <ArtifactId> Spring-boot-Starter-parent </artifactid> <sersive> 1.4.3.3.release </version> <venuvativePath/> <!-Lookup Parent от Repository-> </parent> <зависимости> <Depoydend> <groupD> org.springFrame.cloudword. <ratifactid> Spring-Cloud-Starter-Ribbon </artifactid> </dependency> <depervice> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> </yteledence> <dehysid> <groupid> org.sprimework.boot> <strifactid> spring-boot-starter-web </artifactid> </deperency> <dependency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-test </artifactid> <compope> test </scope> </dependency> </starter> <зависимость> <зависимости> <зависимости> <Зависимость> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <зависимости> <Зависимость <groupId> org.springframework.cloud </GroupId> <artifactid> spring-cloud-зависимости </artifactid> <sersion> brixton.release </version> <sype> pom </type> <cracpe> import </scope> </release> </repect> </repertancy>
В основном классе приложения добавьте возможности Discovery Service через аннотацию @enablediscoveryclient. Создайте экземпляр Resttemplate и включите баланс нагрузку через аннотацию @loadbalanced.
@SpringBootApplication @enabledIscoveryClientPublic Class RibbonApplication {@bean @loadbalance resttemplate resttemplate () {return new Resttemplate (); } public static void main (string [] args) {springApplication.run (ribbonapplication.class, args); }}Создайте ConsumperController, чтобы потреблять сервис GetUser Biz-Service-0. Вызов сервиса с помощью прямого Resttemplate
@RestControllerPublic Class ConsumerController {@autowired resttemplate resttemplate; @Requestmapping (value = "/getUserInfo", method = requestMethod.get) public String add () {return resttemplate.getForentity ("http: // biz-service-0/getUser", string.class) .getbody (); }} Настроить центр регистрации услуг Eureka в приложении.
Spring.Application.name = ленточный consumerserver.port = 8003eureka.client.serviceurl.defaultzone = http: // localhost: 8000/eureka/
После завершения вы можете открыть http: // localhost: 8003/getuserinfo, чтобы увидеть результаты
Резюме: лента на самом деле является клиентским компонентом с мягкой нагрузкой. Его можно использовать в сочетании с другими необходимыми запросами. Объединение с Эврикой - это просто пример этого.
Кодовый адрес: https://github.com/zhp8341/springclouddemo
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.