1. Микросервисы
1. Что такое микросервисы? Как независимо общаться между микросервисами?
Что такое микросервисы? Происхождение концепции микросервиса:Microservices
Микрослужбы — это набор небольших служб для создания приложения. Службы работают независимо в разных процессах, а службы взаимодействуют с помощью упрощенных механизмов связи (таких как интерфейсы RESTful), а службы могут развертываться независимо с помощью автоматизированных методов развертывания. Поскольку в микросервисной архитектуре сервисы независимы друг от друга, разные сервисы могут разрабатываться на разных языках или использовать разные типы баз данных в соответствии с потребностями бизнеса.
- Архитектура микросервиса представляет собой распределенную систему, которая разделена на различные сервисные единицы в зависимости от бизнеса и устраняет недостатки производительности единой системы.
- Микросервисы — это архитектурный стиль, в котором большое программное приложение состоит из нескольких сервисных единиц. Сервисные модули в системе могут быть развернуты независимо друг от друга, и каждый сервисный модуль слабо связан.
Как независимо общаться между микросервисами?
Синхронизировать:
HTTP-протокол REST: запрос REST — это наиболее часто используемый метод связи в микросервисах, основанный на протоколе HTTP\HTTPS. RESTFUL характеризуется:
- Каждый URI представляет 1 ресурс
- Клиент использует GET, POST, PUT, DELETE для управления ресурсами на стороне сервера: GET используется для получения ресурсов, POST используется для создания новых ресурсов (также может использоваться для обновления ресурсов), PUT используется для обновления ресурсов, DELETE используется для удаления ресурсов
- Манипулировать ресурсами, манипулируя их представлением, которое представляет собой XML или HTML.
- Взаимодействие между клиентом и сервером не имеет состояния между запросами, и каждый запрос от клиента к серверу должен содержать информацию, необходимую для понимания запроса.
TCP-протокол RPC: RPC (удаленный вызов процедур) удаленный вызов процедуры, простое понимание которого заключается в том, что узел запрашивает услуги, предоставляемые другим узлом. Его рабочий процесс выглядит следующим образом:
1. Выполнить оператор вызова клиента и передать параметры 2. Вызвать локальную систему для отправки сетевых сообщений 3. Отправить сообщение на удаленный хост 4. Сервер получит сообщение и параметры 5. Выполнить удаленную процедуру (службу) в соответствии с к запросу вызова и параметрам 6. Выполнить процедуру После завершения вернуть результат дескриптору сервера 7. Дескриптор сервера возвращает результат и вызывает системную сетевую службу удаленного хоста для отправки результата 8. Сообщение отправляется обратно на локальный хост 9. Дескриптор клиента получает сообщение от сетевой службы локального хоста 10. Клиент получает вызов Данные результата, возвращаемые оператором
асинхронный: промежуточное ПО сообщений
Распространенным промежуточным программным обеспечением для сообщений являются Kafka, RabbitMQ, RocketMQ, ActiveMQ, а распространенными протоколами являются AMQP, MQTTP, STOMP, XMPP.
2. Какие существуют стеки микросервисных технологий?
- Разработка микросервисов: быстрая разработка сервисов.Spring, SpringMVC,SpringBoot
- Протокол вызова микросервиса: REST, RPC (удаленный вызов процедур), RMI (удаленный вызов метода)
- МикросервисыЗарегистрируйтесь, чтобы узнать: обнаружение служб, регистрация служб и централизованное управление службами.Eureka,Zookeeper,Nacos,consul
- МикросервисыУправление конфигурацией: Унифицированное управление информацией о конфигурации одного или нескольких сервисов, централизованное управление.Disconf,SpringCloudConfig,Apollo
- Служитьбалансировки нагрузки:Ribbon(клиент),Nginx(Сервер)
- Сервисный предохранитель: Не позволяйте запросу продолжаться, когда запрос достигает определенного порога.Hystrix,Sentinel
- Служитьвызов интерфейса: связь между несколькими службами.Feign(HTTP)(HTTP),Dubbo,Apache HttpClient、Шаблон Spring Rest
- Шлюз API: Внешний запрос перехватывается и обрабатывается через API-шлюз, а затем перенаправляется на реальный сервис.Spring Cloud GateWay,Zuul
- Служитьотслеживание ссылок: очистить взаимосвязь вызова между службами.Zipkin,Brave
- сервисный мониторинг: отображает текущее состояние каждой службы (ЦП, память, доступ и т. д.) в визуальной или невизуальной форме.Zabbix,Nagios,Metrics
- Аутентификация авторизации: в соответствии с правилами безопасности или политиками безопасности, установленными системой, пользователи могут получать доступ и получать доступ только к тем ресурсам, на которые они авторизованы.Spring Security,Apache Shiro
- Пакетная обработка: пакетная обработка данных или объектов одного типа.Spring Batch
- Запланированные задачи: планируйте задачи на регулярной основе.Quartz,Elastic-job
- Очередь сообщений. Разделите бизнес-данные и обработайте их асинхронно.Kafka,RabbitMQ,RocketMQ,ActiveMQ
- Сбор журналов (elk): сбор журналов службы для анализа журналов, портретов пользователей и т. д.Elasticsearch,Logstash,Kibana
- Хранение данных: хранит данные. относительный:MySql,Oracle,MsSQL,PostgreSql; нереляционный:Mongodb,Elasticsearch
- Кэш: Храните данные.redis
- Подтаблица подбазы данных: схема подтаблицы подбазы базы данных.ShardingSphere,Mycat
- Развертывание услуг: быстрое развертывание, запуск и постоянная интеграция проектов.Docker,Jenkins,Kubernetes(K8s),Mesos
3. Каковы преимущества и недостатки микросервисов?
Преимущества микросервисов:
- Простой сервис, сосредоточенный только на одной бизнес-функции
- Каждый микросервис может разрабатываться разными командами
- Микросервисы слабо связаны
- Возможность разработки с использованием различных языков программирования и инструментов
Недостатки микросервисов:
- Операционные издержки, требования DevOps
- Отслеживание распределенных ссылок затруднено
- Сложность распределенных систем, когда количество сервисов увеличивается, управление усложняется
4. В чем разница между Spring Cloud и Dubbo?
Dubbo — это высокопроизводительная и превосходная сервисная платформа с открытым исходным кодом от Alibaba, основанная на вызовах RPC. Для Spring Cloud Netflix он основан на HTTP, поэтому его эффективность не так высока, как у Dubbo, но проблема в том, что компоненты системы Dubbo неполны и не могут обеспечить универсальное решение, например, регистрацию и обнаружение сервисов. должны быть реализованы с помощью Zookeeper. , в то время как Spring Cloud Netflix действительно предоставляет универсальное сервисное решение и имеет опыт работы с семейством Spring.
Ссылаться на:Всестороннее сравнение микросервисных фреймворков Java (Dubbo и Spring Cloud?)
- преимущество:
1. Он поддерживает различные протоколы связи, а потребитель и обслуживающая сторона используют для взаимодействия длинную ссылку, а скорость связи немного лучше;
2. При использовании метода rpc производительность лучше, чем у rpc Spring Cloud;
3. Потребление сети dubbo меньше, чем у springcloud
- недостаток:
1. Если мы используем центр конфигурации и распределенную трассировку, нам нужно интегрировать их самостоятельно;
2. Разработка затруднена, потому что многие крупномасштабные проекты не могут решить проблему зависимости пакета jar от dubbo;
- преимущество:
1. Созданный семейством Spring, Spring имеет большой опыт работы с инфраструктурой разработки корпоративного уровня, которая может обеспечить последующие обновления и улучшения.
2. Сообщество весеннего облака активно, с богатыми учебными пособиями, и при возникновении проблем легко найти решения;
3. Функция весеннего облака более совершенна, чем у даббо;
5. Spring Cloud использует метод доступа к отдыху, а независимое от технологии использование отдыха лучше;
6. Spring Cloud легко дополняет различные функции платформы по слиянию, балансировке ответственности и сервисному центру с помощью нескольких строк кода;
7. С точки зрения найма инженеров из компании весеннее облако имеет больше преимуществ, потому что его технологические обновления более ослепительны;
8. Предоставляет полный набор решений для микросервисов: регистрация обнаружения сервисов, центр конфигурации, шина сообщений, балансировка нагрузки, автоматический выключатель, мониторинг данных и т. д. Как крупный специалист по управлению микросервисами, он рассматривает его очень всесторонне, почти управление сервисом .Учтены все аспекты, что удобно для разработки «из коробки»;
- недостаток:
1. Если есть жесткие требования к времени отклика системы, больше подходят длинные ссылки.
2. Соглашение о протоколе интерфейса является относительно свободным и свободным, и требуются строгие административные меры для ограничения беспорядочного обновления интерфейса.
5. Какая связь между Spring Cloud и Spring Boot?
Spring Boot — это набор шаблонов быстрой конфигурации для Spring, который позволяет быстро разработать отдельный микросервис на основе Spring Boot Spring Cloud — это инструмент разработки облачных приложений на основе Spring Boot; Spring Boot фокусируется на отдельном отдельном микросервисе, который является быстрым и простым. для интеграции. Spring Cloud фокусируется на глобальной структуре управления службами; Spring Boot использует концепцию, согласно которой значение по умолчанию больше, чем конфигурация. Для вас было выбрано множество интеграционных решений, и вы не можете настроить их без настройки. Большая часть Spring Облако основано на Spring Boot. Основано ли оно на Spring Boot? Не можем.
Описание: SpringBoot играет связующую роль в Spring Clound. Spring Boot может использовать проекты разработки независимо от Spring Cloud, но Spring Cloud неотделим от Spring Boot, который является зависимостью.
2. Реестр службы Эврика
1. Что такое Эврика
Центр регистрации: централизованный компонент для регистрации и управления службами, а также для управления всей информацией о службах и их статусом. В реестре естьЭврика, Накос, Консул, Смотритель зоопарка, сравнение такое:
Eureka – это платформа для обнаружения сервисов, разработанная Netflix. Это сервис RESTful и базовый компонент для обнаружения и регистрации сервисов. Это одно из необходимых условий для создания микросервисов Spring Cloud. Он скрывает детали взаимодействия между сервером и клиентом, позволяя разработчикам сосредоточиться по делу.
Регистрация и обнаружение службы состоит из двух частей: серверной (Eureka Server) и клиентской (Eureka Client).
- Сервер (Сервер Эврика): общедоступная служба, которая предоставляет клиенту функции регистрации и обнаружения служб, поддерживает соответствующую информацию о клиенте, зарегистрированном на себя, и предоставляет интерфейс для клиента для получения информации о других службах в реестре, чтобы динамически меняющиеся клиенты могут взаимодействовать друг с другом между сервисами.
- Клиент (клиент Эврика): клиент определенным образом регистрирует собственную служебную информацию на сервере и поддерживает целостность собственной информации в пределах нормы, что удобно для других служб, чтобы обнаружить себя, и в то же время он может получить другую служебную информацию, которая это зависит от через сервер, и завершить вызов службы.Также есть встроенный балансировщик нагрузки для базовой балансировки нагрузки.
2. Некоторые основные концепции Эврики
Реестр регистрации службы:когдаEureka
клиент дляEureka Server
При регистрации он предоставляет свои собственные метаданные, такие как IP-адрес, порт, URL-адрес индикатора работоспособности, домашняя страница и т. д.
Продление услуги Продление:Eureka
Клиент будет отправлять пульс каждые 30 секунд (по умолчанию), чтобы обновить контракт. Сообщите о продлении контрактаEureka Server
ДолженEureka
Клиент все еще там без проблем. Обычно, еслиEureka Server
Не получено за 90 секундEureka
Обновление клиента, он удаляет экземпляр из своего реестра.
Получить реестры Получить реестры:Eureka
Клиент получает информацию реестра с сервера и кэширует ее локально. Клиенты используют эту информацию, чтобы найти другие службы для совершения удаленных вызовов. Информация в этом списке регистрации периодически обновляется (каждые 30 секунд). Каждый раз, когда возвращается информация списка регистрации, это может быть связано сEureka
Информация кэша клиента отличается,Eureka
Клиент обрабатывает это автоматически. Если по какой-либо причине информация о регистрационном списке не может быть сопоставлена вовремя,Eureka
Затем клиент получает всю информацию реестра.Eureka
Сервер кэширует информацию списка реестра, весь реестр и информация каждого приложения сжимаются, а сжатое содержимое точно такое же, как и несжатое содержимое.Eureka
клиент иEureka
Серверы могут обмениваться данными в формате JSON/XML. по умолчаниюEureka
Клиент использует сжатиеJSON
формат, чтобы получить информацию о списке регистрации.
Сервис не в сети Отмена: клиент Eureka отправляет запрос на отмену на сервер Eureka, когда программа закрывается. После отправки запроса информация об экземпляре клиента удаляется из реестра экземпляров сервера. Этот запрос на выход не выполняется автоматически, он должен вызвать следующее:DiscoveryManager.getInstance().shutdownComponent();
Услуга Ликвидация Выселение: по умолчанию, когда клиент Eureka не отправляет обновление службы, то есть пульс, на сервер Eureka в течение 90 секунд подряд (3 периода обновления), сервер Eureka удалит экземпляр службы из списка регистрации службы, что то есть услуга будет удалена.
3. Инфраструктура Юрика
Eureka повышает гибкость, масштабируемость и доступность системы с помощью таких механизмов, как обнаружение сердцебиения, проверка работоспособности и клиентский кэш..GitHub.com/Netflix/Евро…
Eureka включает в себя два компонента: Eureka Server и Eureka Client. Eureka Server предоставляет возможности обнаружения служб. При запуске каждой микрослужбы она регистрирует свою собственную информацию на Eureka Server через Eureka Client, а Eureka Server сохраняет информацию о службе.
- Поставщик услуг регистрирует услугу на сервере Eureka, а сервер Eureka получает событие регистрации и синхронизирует данные в кластере и разделе.Потребитель услуги может получить информацию о регистрации услуги в центре регистрации и сделать вызов службы.
- Каждый сервер Eureka также является клиентом Eureka, а синхронизация списка регистрации службы между несколькими серверами Eureka выполняется посредством репликации.
- После запуска микросервиса он будет периодически отправлять пульс на сервер Eureka (период по умолчанию — 30 секунд) для обновления собственной информации.
- Eureka Server не получает пульс от микросервиса в течение определенного периода времени (по умолчанию 90 секунд) и выходит из узла микросервиса.
- Клиент Eureka будет кэшировать информацию на сервере Eureka. Когда все узлы сервера Eureka отключены, потребители услуг могут использовать информацию в кеше для поиска поставщиков услуг.
4. Метаданные Эврика
Существует два типа метаданных Eureka:Стандартные и пользовательские метаданные.
- Стандартные метаданные: информация, такая как имя хоста, IP-адрес, номер порта и т. д., которая будет опубликована в списке регистрации службы для вызовов между службами.
- Пользовательские метаданные: вы можете настроить конфигурацию карты eureka.instance.metadata-map в application.yml, которая соответствует формату хранения ключ/значение. Доступ к этим данным можно получить в удаленной службе поддержки клиентов.
Такие как:
eureka:
instance:
metadata-map:
# ⾃定义元数据(key/value⾃定义)
cluster: cl1
region: rn1
В приложении DiscoveryClient можно использовать для получения всей информации о метаданных указанного микросервиса:
// 从EurekaServer获取指定微服务实例
List<ServiceInstance> serviceInstanceList =discoveryClient.getInstances("service-user");
Вы можете увидеть пользовательские метаданные через отладку:
5. Общая конфигурация Эврика
Конфигурация сервера: устанавливается в классе запуска весенней загрузки@EnableEurekaServer
Аннотация для включения службы Eureka
eureka:
instance:
hostname: xxxxx # 主机名称
prefer-ip-address: true/false # 注册时显示ip
server:
enableSelfPreservation: true # 启动自我保护
renewalPercentThreshold: 0.85 # 续约配置百分比
Конфигурация клиента: устанавливается в классе запуска весенней загрузки@EnableDiscoveryClient
Аннотация для включения службы Eureka
eureka:
client:
register-with-eureka: true/false # 是否向注册中心注册自己
fetch-registry: # 指定此客户端是否能获取eureka注册信息
service-url: # 暴露服务中心地址
defaultZone: http://xxxxxx # 默认配置
instance: instance-id: xxxxx # 指定当前客户端在注册中心的名称
6. Клиент Eureka Client
Поставщик услуг регистрирует услугу на сервере Eureka и завершает обновление услуги и другие работы, а потребитель услуги получает список услуг..
регистрация службы(поставщики услуг):
- Добавьте зависимость eureka-client и настройте адрес реестра службы Eureka.
- Когда служба запускается, она инициирует запрос на регистрацию в центр регистрации, содержащий метаданные службы.
- Реестр Eureka сохранит соответствующую информацию о сервисном узле на карте.
Продление услуги(поставщики услуг):
Служба будет продлевать контракт с реестром (обнаружение сердцебиения) каждые 30 секунд.Если контракт не будет продлен, срок аренды истечет через 90 секунд, а затем истечет срок действия службы.
Конфигурация в конфигурационном файле: вообще не надо настраивать
# 向Eureka服务中⼼集群注册服务
eureka:
instance:
# 租约续约间隔时间,默认30秒
lease-renewal-interval-in-seconds: 30
# 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
lease-expiration-duration-in-seconds: 90
Получить список услуг(Потребитель услуг):
После запуска потребитель службы получает список доступных только для чтения служб резервного копирования из списка служб Eureka Server и кэширует его локально. Данные будут повторно извлекаться и обновляться каждые 30 секунд, а временной интервал можно настроить с помощьюeureka.client.registry-fetch-interval-seconds
Исправлять.
#向Eureka服务中⼼集群注册服务
eureka:
client:
# 每隔多久拉取⼀次服务列表
registry-fetch-interval-seconds: 30
7. Сервер Эврика Сервер
сервис в автономном режиме: когда служба нормально закрывается, она отправляет запрос на паузу, что служба находится в автономном режиме, на сервер Eureka, и служба будет переведена в автономное состояние после запроса интерфейса центра регистрации.
отказ от отказа: Eureka Server будет время (каждые 60 секунд)eureka.server.eviction-interval-timer-in-ms
), чтобы проверить, находится ли сервисный узел в небольшом времени (по умолчанию 90 секунд)eureka.instance.lease-expiration-duration-in- seconds
) если пульс не получен, экземпляр выйдет из системы.
почему бы не бытьсамозащита: По умолчанию, если Eureka Server не получает пульс экземпляра микрослужбы в течение определенного периода времени (по умолчанию 90 секунд), Eureka Server удалит экземпляр. Однако, когда происходит сбой сетевого раздела, микросервис и Eureka Server не могут нормально взаимодействовать, а сам микросервис работает нормально.В это время микросервис не следует удалять, поэтому вводится механизм самозащиты.
Включена самозащита: если более 85% клиентских узлов не имеют нормального пульса в течение 15 минут, то Eureka считает, что произошел сбой сети между клиентом и реестром, и Eureka Server автоматически включает механизм самозащиты. .
На странице сервисного центра будет отображаться следующая оперативная информация:
В режиме самозащиты:
- Ни один экземпляр службы не будет устранен (может быть сетевая проблема между поставщиком услуг и EurekaServer), гарантируя, что большинство служб по-прежнему доступны.
- Eureka Server по-прежнему может принимать запросы на регистрацию и запросы для новых служб, но не будет синхронизироваться с другими узлами, чтобы гарантировать, что текущий узел по-прежнему доступен.Когда сеть стабильна, новая регистрационная информация текущего сервера Eureka будет синхронизирована с другие узлы.
Пройдено в проекте Eureka Servereureka.server.enable-self-preservation
Конфигурация может отключить самозащиту, значение по умолчанию включено:
eureka:
server:
enable-self-preservation: false # 关闭⾃我保护模式(缺省为打开)
Резюме и справка
Когда поставщик услуг запускается, он инициирует запрос на регистрацию в центр регистрации, содержащий информацию метаданных службы, и каждые 30 секунд отправляет в центр регистрации контрольный сигнал для продления контракта. Если аренда не продлена, срок действия услуги истечет через 90 секунд после истечения срока аренды. Потребитель службы получает доступный только для чтения список резервных копий из реестра и кэширует его локально, а также повторно извлекает и обновляет данные каждые 30 секунд.
Когда клиент Eureka завершается в обычном режиме, сервер переводит службу в автономный режим (она не будет завершена автоматически); сервер будет регулярно проверять каждые 60 секунд, и если он обнаружит, что экземпляр не получил пульса в течение 90 секунд, он выйдет из экземпляра; В течение 15 минут более 85% конечных узлов обслуживания клиентов не имеют нормального пульса. Серверная часть перейдет в режим самозащиты, не будет удалять экземпляры службы и по-прежнему может принимать регистрация новых услуг и запросы запросов.
Eureka (AP) повышает гибкость, масштабируемость и доступность системы с помощью таких механизмов, как обнаружение пульса, проверка работоспособности и кэширование клиентов.
Ссылка на ссылку:
- Подробное объяснение Эврики Spring Cloud
- Глубокое понимание Eureka (исходный код)
- Регистрация сервиса и открытие SpringColud Eureka
3. Балансировка нагрузки ленты
1. Обзор балансировки нагрузки
Балансировка нагрузки обычно делится на балансировку нагрузки на стороне сервера и балансировку нагрузки на стороне клиента:
- Балансировка нагрузки сервера, такие как Nginx и F5, после того, как запрос доходит до сервера, эти балансировщики нагрузки направляют запрос на целевой сервер для обработки по определенному алгоритму
- Балансировка клиентской нагрузки, например Ribbon, клиент-потребитель службы будет иметь список адресов серверов. Вызывающая сторона выбирает сервер для доступа с помощью определенного алгоритма балансировки нагрузки перед запросом. Выполнение алгоритма балансировки нагрузки выполняется на запрашивающем клиенте.
Ribbon — это балансировщик нагрузки, выпущенный Netflix. Eureka обычно используется в связке с Ribbon.Ribbon использует служебную информацию, считанную из Eureka.При вызове службы, предоставляемой поставщиком услуг, она будет загружаться по определенному алгоритму.
2. Основной компонент ленты IRule
Так называемая стратегия балансировки нагрузки заключается в том, что когда служба A вызывает службу B, существует несколько экземпляров службы B. В это время служба A выбирает для вызова экземпляр B. Лента может выбирать следующие стратегии балансировки нагрузки.
IRule: Выберите сервис для доступа из списка сервисов по определенному алгоритму:
- RoundRobinRule: стратегия опроса.
- RandomRule: Случайная политика.
- AvailabilityFilteringRule: доступные политики фильтрации. Он сначала отфильтрует сервисы, находящиеся в состоянии отключения и отключения из-за сбоев множественного доступа, а также сервисы, количество одновременных подключений которых превышает пороговое значение, а затем получит доступ к оставшемуся списку сервисов в соответствии со стратегией опроса.
- WeightedResponseTimeRule: взвешенная стратегия опроса. Рассчитать вес всех сервисов по среднему времени отклика.Чем меньше время отклика, тем выше вес сервиса и выше вероятность быть выбранным.В начале, если статистической информации недостаточно, стратегия RoundRobinRule Когда статистической информации будет достаточно, он переключится на WeightedResponseTimeRule
- RetryRule: политика повтора. Добавить механизм повтора на основе RoundRobinRule, то есть в течение заданного времени повтора многократно использовать стратегию линейного опроса для выбора доступных экземпляров
- BestAvailableRule: политика минимального количества подключений. Сначала отфильтруйте сервисы с автоматическими выключателями, сработавшими из-за сбоев множественного доступа, затем выберите сервис с наименьшим параллелизмом.
- ZoneAvoidanceRule: Политика компромисса зоны (правило по умолчанию). Двойная фильтрация используется для фильтрации экземпляров и неисправных экземпляров, которые не находятся в одном и том же регионе в одно и то же время, и выбора экземпляров с меньшим параллелизмом.
Лента имеет существующие стратегические приложения:
Глобальные настройки:
@Configuration
public class ConfigBean {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
//用新定义的负载均衡规则覆盖默认的负载均衡规则
@Bean
public IRule myRule(){
//return new RoundRobinRule();// todo 轮询
//return new RandomRule();//todo 随机
return new RetryRule();//todo 先按照轮询的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
}
}
Локальные настройки: измените политику балансировки нагрузки указанной службы в файле конфигурации. Формат:服务应用名.ribbon.NFLoadBalancerRuleClassName
#针对的被调用方微服务名称,不加就是全局生效
# service-provider 为调用的服务的名称
service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载策略调整
Настройка стратегии балансировки нагрузки ленты:
- Добавьте @RibbonClient в класс запуска: при запуске микросервиса мы можем загрузить наш собственный класс конфигурации ленты, чтобы конфигурация вступила в силу.
- Обратите внимание на детали конфигурации: в официальном документе четко содержится предупреждение о том, что пользовательский класс конфигурации не может быть помещен в текущий пакет, описанный @ComponentScan и его подпакетами, в противном случае этот класс конфигурации будет использоваться всеми клиентами Ribbon, что невозможно. Цель настройки
Требования: по-прежнему стратегия опроса, но с новыми требованиями, каждый сервер должен вызываться 5 раз.
-
Добавьте аннотации к основному классу запуска:
@RibbonClient(name = "MICROSERVICECLOUD-DEPT",configuration = MySelfRule.class)
-
Добавьте собственный алгоритм балансировки нагрузки:
@Configuration public class MySelfRule { @Bean public IRule myRule(){ return new RandomRule_ZY();//todo 自定义负载均衡算法 } }
-
Пользовательский алгоритм:
public class RandomRule_ZY extends AbstractLoadBalancerRule { public Server choose(ILoadBalancer lb, Object key) { // ...... } @Override public void initWithNiwsConfig(IClientConfig iClientConfig) {} @Override public Server choose(Object key) { return this.choose(this.getLoadBalancer(), key); } }
3. Общая конфигурация ленты
Глобальная конфигурация:
ribbon:
ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
ReadTimeout: 3000 #服务请求处理超时时间(毫秒)
OkToRetryOnAllOperations: true #对超时请求启用重试机制
MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
MaxAutoRetries: 1 # 切换实例后重试最大次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法
Укажите службу для настройки: Отличие от глобальной конфигурации в том, что узел ленты висит под именем службы.
user-service:
ribbon:
ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
ReadTimeout: 3000 #服务请求处理超时时间(毫秒)
OkToRetryOnAllOperations: true #对超时请求启用重试机制
MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
MaxAutoRetries: 1 # 切换实例后重试最大次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法
4. Применение и принцип ленты
Не нужно указывать дополнительные координаты Jar, потому чтоВ потребителе службы мы ссылаемся на eureka-client, который будет ссылаться на пакет Jar, связанный с лентой..
Используйте аннотацию @LoadBalanced, чтобы дать RestTemplate возможность балансировать нагрузку: видно, что использование функции балансировки нагрузки Ribbon очень просто, ничем не отличается от прямого использования RestTemplate, просто добавьте @LoadBalanced в RestTemplate.
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced // Ribbon负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
принцип:
Метод select(String serviceId) ServiceInstance определен в интерфейсе LoadBalancerClient для получения конкретного экземпляра службы в соответствии с именем службы;
Класс SpringClientFactory определяет контексты Map
- IClientConfig: определяет конфигурацию клиента для инициализации клиента и конфигурации балансировки нагрузки; значение по умолчанию DefaultClientConfigImpl
- IRule: стратегия балансировки нагрузки, такая как опрос и т. д.; значение по умолчанию ZoneAvoidanceRule
- IPing: определяет, как определить, является ли экземпляр службы нормальным; значение по умолчанию — DumyPing.
- ServerList: определяет метод получения списка серверов; значение по умолчаниюRibbon:
ConfigurationBasedServerList
Spring Cloud Alibaba:NacosServerList
- ServerListFilter: выберите конкретный список серверов на основе конфигурации или правил фильтрации; по умолчанию используется ZonePreferenceServerListFilter.
- ServerListUpdater: определяет стратегию динамического обновления списка серверов. Поллингсерверлиступдатер по умолчанию
Приведенная выше ссылка на реализацию по умолчаниюRibbonClientConfiguration. ZoneAwareLoadBalancer
, то схема отношений выглядит следующим образом:
Порядок определения ILoadBalancer в AnnotationConfigApplicationContext: сначала импорт через внешнюю конфигурацию, а затем класс конфигурации.
Лента по умолчанию загружается лениво. После запуска сервиса первый запрос очень медленный, а после второго намного быстрее. Включить голодающую загрузку:
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: server-1,server-2,server-3 #为哪些服务的名称开启饥饿加载,多个用逗号分隔
Ссылаться на
- Анализ исходного кода Spring Cloud Ribbon
- Spring Cloud Ribbon: сервисные вызовы с балансировкой нагрузки
- Анализ исходного кода ленты
4. Предохранитель Hystrix
Компонент Hystrix — это платформа защиты услуг, предоставляемая SpringCloud. Также известный как автоматический выключатель, широко известный как «дикобраз», он обладает способностью защищать себя.
1. Лавинный эффект
Эффект последовательной лавины: запрос в микрослужбе может потребовать реализации нескольких интерфейсов микрослужбы, что сформирует сложную цепочку вызовов. Когда время отклика микросервиса на канале разветвления слишком велико или недоступно, все запросы находятся в состоянии задержки.Если задержка достигает максимального значения системы, системные ресурсы могут быть исчерпаны, в результате чего весь распределенный система недоступна.
- Fan-in: представляет количество вызовов микросервиса, чем больше число, тем лучше возможность повторного использования модуля.
- Разветвление: количество обращений к другим микросервисам от имени микросервиса. Чем больше число, тем сложнее бизнес модуля.
Три технологии Hystrix, обеспечивающие высокую доступность сервисов: сервисный предохранитель, деградация сервисов и изоляция потоков.
- Предохранитель службы: когда служба вызывается в течение определенного периода времени, интерфейс вызываетсяколичество отказовПри достижении порогового значения или процентного значения прерыватель цепи будет включен.Во время действия прерывателя цепи служба откажет клиенту в доступе к интерфейсу прерывателя цепи.
- Понижение службы: если для интерфейса задан метод понижения, при сбое вызова интерфейса, истечении времени ожидания или отказе в доступе будет вызван метод понижения, и результат будет возвращен пользователю.
- Изоляция потоков: дополнительно создайте пул потоков для интерфейса. Для интерфейса с высокой частотой вызовов запретите интерфейсу использовать пул потоков веб-контейнера и изолируйте поток для интерфейса.
С помощью сервисного предохранителя и перехода на более раннюю версию интерфейса в случае сбоя вызова интерфейса, истечения времени ожидания или его отклонения клиенту может быть своевременно возвращено дружественное приглашение, что также снижает нагрузку на сервис и обеспечивает высокую доступность сервиса. Служебный предохранитель обычно вызывается сбоем службы, и ухудшение службы обычно рассматривается исходя из общей нагрузки; ухудшение службы неизбежно приведет к служебному сбою, но служебный предохранитель не обязательно может привести к ухудшению службы. Благодаря изоляции потоков устраняется лавинный эффект и последовательный лавинный эффект, что обеспечивает высокую доступность сервисов.
Hystrix потребляет больше ресурсов сервера, поэтому включайте защиту Hystrix только для интерфейсов с высокой степенью параллелизма в службе. Hystrix улучшает интерфейс с помощью @HystrixCommand() . Такие параметры, как время слияния, можно настроить внутри @HystrixCommand(),Параметры, настроенные в @HystrixCommand(), переопределяют параметры Hystrix, настроенные в application.yml..
2. Приложение Hystrix и соответствующая конфигурация
2.1 Ввести зависимости:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.2 Глобальная конфигурация:
hystrix:
command: #用于控制HystrixCommand的行为
default:
execution:
isolation:
strategy: THREAD #控制HystrixCommand的隔离策略,THREAD->线程池隔离策略(默认),SEMAPHORE->信号量隔离策略
thread:
timeoutInMilliseconds: 1000 #配置HystrixCommand执行的超时时间,执行超过该时间会进行服务降级处理,默认1s
interruptOnTimeout: true #配置HystrixCommand执行超时的时候是否要中断
interruptOnCancel: true #配置HystrixCommand执行被取消的时候是否要中断
timeout:
enabled: true #配置HystrixCommand的执行是否启用超时时间
semaphore:
maxConcurrentRequests: 10 #当使用信号量隔离策略时,用来控制并发量的大小,超过该并发量的请求会被拒绝。最大并发请求,默认为:10 条。当该接口已经接收 10 条请求在处理,后续请求触发熔断
fallback:
enabled: true #用于控制是否启用服务降级
circuitBreaker: #用于控制HystrixCircuitBreaker的行为
enabled: true #用于控制断路器是否跟踪健康状况以及熔断请求
requestVolumeThreshold: 20 #窗口时间内允许接口调用报错的请求数,默认20
errorThresholdPercentage: 50 # 窗口时间内允许接口调用报错占总请求数的百分比。默认:50%
sleepWindowInMilliseconds: 5000 # 熔断后休眠时⻓。默认:5000ms
forceOpen: false #强制打开断路器,拒绝所有请求
forceClosed: false #强制关闭断路器,接收所有请求
requestCache:
enabled: true #用于控制是否开启请求缓存
metrics:
rollingStats:
### 默认10秒钟内,请求次数达到20个,并且失败率在50%以上就跳闸,跳闸后活动窗⼝为5s
### 窗口时间,默认:10000ms,即 10s。timeInMilliseconds/numBuckets
### 每隔 1s 就会统计这 1s 内请求:success、failure、timeout、rejection 请求的数量
timeInMilliseconds: 10000
### 桶的数量。默认:10。设置 numBuckets 的值时,保证 timeInMilliseconds % numBuckets == 0 即可
numBuckets: 10
collapser: #用于控制HystrixCollapser的执行行为
default:
maxRequestsInBatch: 100 #控制一次合并请求合并的最大请求数
timerDelayinMilliseconds: 10 #控制多少毫秒内的请求会被合并成一个
requestCache:
enabled: true #控制合并请求是否开启缓存
threadpool: #用于控制HystrixCommand执行所在线程池的行为
default:
coreSize: 10 #线程池的核心线程数,默认10
maximumSize: 10 #线程池的最大线程数,超过该线程数的请求会被拒绝
maxQueueSize: -1 #用于设置线程池的最大队列大小,-1采用SynchronousQueue,其他正数采用LinkedBlockingQueue
queueSizeRejectionThreshold: 5 #用于设置线程池队列的拒绝阀值,由于LinkedBlockingQueue不能动态改版大小,使用时需要用该参数来控制线程数,默认5
# springboot中暴露健康检查等断点接⼝观察跳闸状态
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接⼝的细节
endpoint:
health:
show-details: always
### 访问健康检查接⼝:http://localhost:8090/actuator/health
Конфигурация экземпляра: для конфигурации экземпляра нужно только заменить значение по умолчанию в глобальной конфигурации соответствующим ключом.
hystrix:
command:
HystrixComandKey: #将default换成HystrixComrnandKey
execution:
isolation:
strategy: THREAD
collapser:
HystrixCollapserKey: #将default换成HystrixCollapserKey
maxRequestsInBatch: 100
threadpool:
HystrixThreadPoolKey: #将default换成HystrixThreadPoolKey
coreSize: 10
Описание соответствующих ключей в файле конфигурации:
- HystrixComandKey соответствует свойству commandKey в @HystrixCommand;
- HystrixCollaperKey соответствует свойству collaprKey в аннотации @HystrixCollapser;
- HystrixThreadPoolKey соответствует свойству threadPoolKey в @HystrixCommand.
2.3 Добавьте аннотации к классу запуска@EnableCircuitBreakerдля включения функции автоматического выключателя Hystrix.@EnableCircuitBreaker
,@EnableDiscoveryClient
,@SpringBootApplication
Эти три аннотации можно заменить на **@SpringCloudApplication**.
2.4 Добавление оформления Hystrix в интерфейс для повышения доступности интерфейса. использовать@HystrixCommand()
аннотация.Примечание. Параметр метода и возвращаемое значение метода, который не удалось вызвать, должны быть такими же, как у исходного метода. Даунгрейд сервиса работает только на стороне потребителя.
@RestController
public class MemberController {
// 1. 设置回调方法;设置忽略的异常,如果是报这个异常,Hystrix 不会进行捕获并执行降级方法,接口会直接抛出异常
@HystrixCommand(fallbackMethod = "inserMemberFallback", ignoreExceptions =
{ArithmeticException.class})
@GetMapping("/member/insert")
public String insertMember() {
int i = 10/0;
return "添加会员信息成功!";
}
// 2.设置 commandProperties 参数,设置窗口时间内允许的错误请求阈值,错误请求百分比,熔断器持续时间配置;
// 设置 threadPoolProperties 参数,设置线程隔离的线程池线程数,最大等待请求数
@HystrixCommand(
fallbackMethod = "deleteMemberFallback",
commandProperties = {
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value =
"5"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value
="30000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value
="60")
}
)
@GetMapping("/member/delete/{id}")
public String deleteMember(@PathVariable("id") String id) {
if("1".equals(id)) {
int i = 10/0;
}
return "删除会员信息成功";
}
@HystrixCommand(
// 线程池标识,要保持唯⼀,不唯⼀的话就共⽤了
threadPoolKey = "findResumeOpenStateTimeoutFallback",
// 线程池细节属性配置
threadPoolProperties = {
@HystrixProperty(name="coreSize",value = "1"), // 线程数
@HystrixProperty(name="maxQueueSize",value="20") // 等待队列⻓度
},
// commandProperties熔断的⼀些细节属性配置
commandProperties = {
// 每⼀个属性都是⼀个HystrixProperty
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",
value="2000"),
// hystrix⾼级配置,定制⼯作过程细节
// 8秒钟内,请求次数达到2个,并且失败率在50%以上就跳闸,跳闸后活动窗⼝设置为3s
// 统计时间窗⼝定义
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value =
"8000"),
// 统计时间窗⼝内的最⼩请求数
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value =
"2"),
// 统计时间窗⼝内的错误数量百分⽐阈值
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value =
"50"),
// ⾃我修复时的活动窗⼝⻓度
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value =
"3000")
},
fallbackMethod = "myFallBack" // 回退⽅法
)
@GetMapping("/checkStateTimeoutFallback/{userId}")
public Integer findResumeOpenStateTimeoutFallback(@PathVariable Long userId) {
// 使⽤ribbon不需要我们⾃⼰获取服务实例然后选择⼀个那么去访问了(⾃⼰的负载均衡)
String url = "http://service-resume/resume/openstate/" + userId;
Integer forObject = restTemplate.getForObject(url, Integer.class);
return forObject;
}
// 注意:该⽅法形参和返回值与原始⽅法保持⼀致
public Integer myFallBack(Long userId) {
return -123333; // 兜底数据
}
public String inserMemberFallback() {
return "调用 insertMember() 失败,执行降级方法!";
}
public String deleteMemberFallback(String id) {
return "调用 deleteMember() 失败,执行降级方法!";
}
}
3. Подробное объяснение аннотаций HystrixCommand
Общие параметры в @HystrixCommand:
- fallbackMethod: указывает метод обработки перехода на более раннюю версию службы;
- ignoreExceptions: игнорировать некоторые исключения, понижение службы не происходит;
- commandKey: имя команды, используемое для различения разных команд;
- groupKey: имя группы, Hystrix будет подсчитывать информацию о сигналах тревоги и приборной панели команды в соответствии с различными группами;
- threadPoolKey: имя пула потоков, используемое для разделения пула потоков.
Прецедент:
// 设置命令、分组及线程池名称
@HystrixCommand(fallbackMethod = "getDefaultUser",
commandKey = "getUserCommand",
groupKey = "getUserGroup",
threadPoolKey = "getUserThreadPool")
public CommonResult getUserCommand(@PathVariable Long id) {
return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
}
// 使用ignoreExceptions忽略某些异常降级
@HystrixCommand(fallbackMethod = "getDefaultUser2", ignoreExceptions = {NullPointerException.class})
public CommonResult getUserException(Long id) {
if (id == 1) {
throw new IndexOutOfBoundsException();
} else if (id == 2) {
throw new NullPointerException();
}
return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
}
public CommonResult getDefaultUser(@PathVariable Long id) {
User defaultUser = new User(-1L, "defaultUser", "123456");
return new CommonResult<>(defaultUser);
}
public CommonResult getDefaultUser2(@PathVariable Long id, Throwable e) {
LOGGER.error("getDefaultUser2 id:{},throwable class:{}", id, e.getClass());
User defaultUser = new User(-2L, "defaultUser2", "123456");
return new CommonResult<>(defaultUser);
}
4. Кэш запросов Hystrix
Когда объем параллелизма системы увеличивается, нам нужно использовать кеш для оптимизации системы, чтобы уменьшить количество одновременных потоков запросов и обеспечить эффект скорости ответа.
Связанные примечания:
- @CacheResult: включить кеш, все параметры используются в качестве ключа кеша по умолчанию, а cacheKeyMethod может указать ключ, возвращая метод типа String;
- @CacheKey: Укажите ключ кеша, вы можете указать параметр или значение атрибута в указанном параметре — это ключ кеша, а cacheKeyMethod также можно указать, возвращая метод типа String;
- @CacheRemove: чтобы удалить кеш, нужно указать commandKey.
Прецедент:
@CacheResult(cacheKeyMethod = "getCacheKey")
@HystrixCommand(fallbackMethod = "getDefaultUser", commandKey = "getUserCache")
public CommonResult getUserCache(Long id) {
LOGGER.info("getUserCache id:{}", id);
return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
}
/**
* 为缓存生成key的方法
*/
public String getCacheKey(Long id) {
return String.valueOf(id);
}
// 远程微服务被调用方法
@GetMapping("/testCache/{id}")
public CommonResult testCache(@PathVariable Long id) {
userService.getUserCache(id);
userService.getUserCache(id);
userService.getUserCache(id);
return new CommonResult("操作成功", 200);
}
Метод testCache вызывается удаленно выше, и значение id запрашивается три раза, но лог печатается в консоли только один раз, то есть кеш используется дважды.
В процессе использования кеша нам необходимоHystrixRequestContextИнициализируйте и закройте, иначе произойдет следующее исключение:
java.lang.IllegalStateException: Request caching is not available. Maybe you need to initialize the HystrixRequestContext?
at com.netflix.hystrix.HystrixRequestCache.get(HystrixRequestCache.java:104) ~[hystrix-core-1.5.18.jar:1.5.18]
at com.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:478) ~[hystrix-core-1.5.18.jar:1.5.18]
at com.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:454) ~[hystrix-core-1.5.18.jar:1.5.18]
Фильтр можно использовать для инициализации и закрытия HystrixRequestContext до и после каждого запроса:
@Component
@WebFilter(urlPatterns = "/*",asyncSupported = true)
public class HystrixRequestContextFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HystrixRequestContext context = HystrixRequestContext.initializeContext();
try {
filterChain.doFilter(servletRequest, servletResponse);
} finally {
context.close();
}
}
}
Ссылаться на
- Spring Cloud Hystrix: отказоустойчивая защита сервисов
- N способов играть в конфигурацию тайм-аута Hystrix
- Перенесемся в Spring Cloud 2.0 (5): Hystrix
- Панель управления Hystrix: мониторинг работы автоматического выключателя
5. Имитация компонентов удаленного вызова
1. Обзор притворства
Feign – это облегченный клиент службы HTTP RESTful, разработанный Netflix. Он вызывает запросы Http в форме аннотаций интерфейса Java вместо прямого вызова путем инкапсуляции пакетов HTTP-запросов в Java. Feign широко используется в решении Spring Cloud.
- Feign не требует, чтобы мы объединяли URL-адрес, а затем вызывали API restTemplate.В SpringCloud создайте интерфейс (на стороне потребителя) и добавьте соответствующие аннотации к интерфейсу.
- SpringCloud усовершенствовал Feign, чтобы позволить Feign поддерживать аннотации SpringMVC (OpenFeign).
Суть: Инкапсулирует процесс вызова Http, ориентированный на программирование интерфейса, аналогичный сервисному вызову Dubbo.
2. Применение притворства
Netflix
изOpen Feign
даSpring
устарелRibbion
изRestTemplate
альтернатива.Определите интерфейс, сопоставленный с сервером на стороне потребителя., тогда ты можешьВызовите службу на стороне поставщика, вызвав метод интерфейса на стороне потребителя.(целевая служба REST), кроме написания определения интерфейса, разработчикам не нужно писать другой код для вызова службы, что в настоящее время является широко используемым решением.
Импорт зависимостей:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
Выберите, чтобы добавить конфигурации, связанные с Feign, по мере необходимости:
feign:
client:
config:
default:
connectTimeout: 5000 # 指定Feign客户端连接提供者的超时时限,取决于网络环境 ************
readTimeout: 5000 # 指定Feign客户端从请求到获取到提供者给出的响应的超时时限 取决于业务逻辑运算时间 ************
compression:
request:
enabled: true # 开启对请求的压缩
mime-types: text/xml,application/xml,application/json
min-request-size: 2048 # 指定启用压缩的最小文件大小
response:
enabled: true # 开启对响应的压缩
hystrix:
enabled: true # 开启熔断功能
command:
default:
circuitBreaker:
sleepWindowInMilliseconds: 30000
requestVolumeThreshold: 50
execution:
timeout:
enabled: true
isolation:
strategy: SEMAPHORE
semaphore:
maxConcurrentRequests: 50
thread:
timeoutInMilliseconds: 100000 # 全局超时熔断时间 ************
ribbon:
#请求连接超时时间 ************
ConnectTimeout: 2000
#请求处理超时时间 ************
ReadTimeout: 5000
#对所有操作都进⾏重试
OkToRetryOnAllOperations: true
####根据如上配置,当访问到故障请求的时候,它会再尝试访问⼀次当前实例(次数由MaxAutoRetries配置),
####如果不行,就换一个实例进行访问,如果还不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),
####如果依然不行,返回失败信息。
MaxAutoRetries: 0 #对当前选中实例重试次数,不包括第⼀次调⽤
MaxAutoRetriesNextServer: 0 #切换实例的重试次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略调整
Добавить в класс запуска@EnableFeignClientsАннотация для включения клиента Feign
Удаленно вызвать уровень обслуживания клиента:
// 使用@FeignClient表示服务 这里的值是提供者的名称
// name属性用于指定调用服务提供者名称,和服务提供者yaml文件中spring.application.name保持一致
@FeignClient(name="provider-application")// 这里的值是提供者相应的路径
@RequestMapping("/provider")
public interface FeginService {
// 这里的路径也要和提供者相同 参数也需要一样
// 参数绑定时可以使用@PathVariable、@RequestParam、@RequestHeader等,value属性必选设置
@GetMapping("/{id}")
Map providerMethod(@PathVariable(value = "id") int id);
}
уровень контроллера:
@RestController
public class FeignController {
// 调用服务
@Autowired
private FeginService feginService;
@RequestMapping(value = "/consumer/{id}")
public Map consumerTest(@PathVariable(value = "id")Integer id) {
return feginService.providerMethod(id);
}
}
Анализ притворных заметок
Аннотация @FeignClient в основном изменяется с помощью @Target({ElementType.TYPE}), что указывает на то, что аннотация в основном используется в интерфейсе. Он имеет следующие свойства:
- name: укажите имя FeignClient. Если используется лента, имя используется как имя микрослужбы для обнаружения служб.
- path: определить унифицированный префикс текущего FeignClient.
- fallback: Определите класс отказоустойчивой обработки. При сбое вызова удаленного интерфейса или истечении времени ожидания будет вызвана отказоустойчивая логика соответствующего интерфейса. Класс, указанный с помощью резервного варианта, должен реализовывать интерфейс, помеченный @Feign
- fallbacjFactory: фабричный класс, используемый для создания экземпляров резервного класса, с помощью которого может быть реализована общая отказоустойчивая логика каждого интерфейса.Мы вводим повторяющийся код
- configuration: Класс конфигурации Feign, вы можете настроить или настроить Feign Encoder, Decoder, LogLevel, Contract
- URL-адрес: URL-адрес обычно используется для отладки, вы можете указать адрес, вызываемый @FeignClient
- decode404: при возникновении ошибки 404, если поле истинно, декодер будет вызван для декодирования, в противном случае будет выдано исключение FeignException.
3. Настройка тайм-аута
Вызов Feign разделен на два слоя, а именно вызов слоя ленты и вызов Hystrix, Высокая версия Hystrix по умолчанию закрыта.
Поддержка ленты балансировки нагрузки:Время ожидания обработки запроса Feign по умолчанию составляет 1 с. Вы можете настроить время ожидания обработки запроса. У Feign есть собственная настройка времени ожидания. Если вы настроите время ожидания ленты, лента будет иметь преимущественную силу.. в состоянии пройтиribbon.xx
для глобальной конфигурации или через服务名.ribbon.xx
выполнить детальную настройку указанного сервиса.
Если возникает указанная выше ошибка, вам необходимо добавить следующую конфигурацию: Настройка тайм-аута Feign является следующей настройкой тайм-аута ленты.
ribbon:
#请求连接超时时间 ************
ConnectTimeout: 3000
#请求处理超时时间 ************
ReadTimeout: 6000
Поддержка предохранителя Hystrix: после включения Hystrix методы в Feign будут управляться, и как только возникнет проблема, будет обработана соответствующая резервная логика; в настоящее время есть две настройки времени ожидания (Feign/hystrix), и предохранитель основан на этомМинимум два разаДля выполнения, то есть когда время обработки превысит кратчайшее время ожидания, оно будет сброшено и войдет в логику резервного понижения.
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
Если Hystrix включен, сообщение об ошибке тайм-аута Hystrix выглядит следующим образом:
На этом этапе вы можете добавить следующую конфигурацию:
hystrix:
command:
default:
circuitBreaker:
sleepWindowInMilliseconds: 30000
requestVolumeThreshold: 50
execution:
timeout:
enabled: true
isolation:
strategy: SEMAPHORE
semaphore:
maxConcurrentRequests: 50
thread:
timeoutInMilliseconds: 16000 # 全局超时熔断时间 ************
Пользовательский класс обработки FallBack (необходимо реализовать интерфейс FeignClient)
// 降级回退逻辑需要定义一个类,实现FeignClient接口,实现接口中的方法
@Component // 别忘了这个注解,还应该被扫描到
public class UserFallback implements UserServiceFeignClient {
@Override
public Integer findDefaultResumeState(Long userId) {
return 6;
}
}
Добавьте резервный атрибут и значение в UserFallback.class в аннотации @FeignClient.Уведомлениеиспользоватьfallbackсвойство, на класс@RequestMapping
Ограничение префикса URL-адреса аннотации необходимо изменить на тот, который настроен в @FeignClient.pathв свойствах.
4. Как работает притворство
В основную запись программы добавляется аннотация @EnableFeignClients, позволяющая включить сканирование и загрузку FeignClient. В соответствии со спецификацией разработки Feign Client определите интерфейс и добавьте аннотацию @FeignClientd.
Когда программа запускается, она сканирует пакет, сканирует все аннотированные классы @FeignClients и вводит эту информацию в контейнер Spring IOC.Когда вызывается метод в определенном интерфейсе Feign, он будет сгенерирован через прокси-метод JDK. Конкретный RequestTemplate.При создании прокси Feign создаст RequestTemplate для каждого метода интерфейса. При создании прокси Feign создаст объект RequestTemplate для каждого метода интерфейса и изменит объект для инкапсуляции всей информации, необходимой для HTTP-запроса, такой как имя параметра запроса, метод запроса и другая информация, определяемая в этом процессе.
Затем RequestTemplate генерирует запрос, а затем передает запрос клиенту для обработки. Здесь клиентом может быть собственный URLConnection JDK, HttpClient Apache или OKhttp. Наконец, клиент инкапсулируется в класс LoadBalanceClient, который сочетает балансировку нагрузки ленты. для отправки вызовов между серверными службами.
Feign включает сжатие GZIP
Feign поддерживает сжатие GZIP запросов и ответов, чтобы уменьшить потери производительности во время связи. Запрос можно открыть со следующими параметрами Функция сжатия с ответом:
feign:
compression:
request:
enabled: true # 开启对请求的压缩
mime-types: text/xml,application/xml,application/json # 设置压缩的数据类型,默认值
min-request-size: 2048 # 指定启用压缩的最小文件大小
response:
enabled: true # 开启对响应的压缩
Следует отметить, что после принятия сжатия передачу данных нужно осуществлять вторичным способом, а все возвращаемые значения нужно получать с помощью ResponseEntity
@FeignClient(name = "github-client")
public interface HelloFeignService {
/*
这个返回类型如果采用了压缩,那么就是二进制的方式,就需要使用ResponseEntity<byte[]>作为返回值
*/
@RequestMapping(value = "/search/repositories",method = RequestMethod.GET)
ResponseEntity<byte[]> searchRepositories(@RequestParam("q")String parameter);
}
Притвориться открытым журналом
Feign — это клиент HTTP-запросов, похожий на браузер, который может распечатывать некоторую подробную информацию журнала (заголовок ответа, код состояния) при запросе и получении ответа. По умолчанию журнал Feign не включен, рекомендуется добавлять настроенный класс в класс аннотаций или нет:
@FeignClient(name = "github-client",configuration = FeignConfig.class)
Код для класса аннотаций выглядит следующим образом:
// Feign的日志级别(Feign请求过程信息)
// NONE:默认的,不显示任何日志----性能最好
// BASIC:仅记录请求方法、URL、响应状态码以及执行时间----生产问题追踪
// HEADERS:在BASIC级别的基础上,记录请求和响应的header
// FULL:记录请求和响应的header、body和元数据----适用于开发及测试环境定位问题
@Configuration
public class FeignConfig {
/**
* Logger.Level 的具体级别如下:
NONE:不记录任何信息
BASIC:仅记录请求方法、URL以及响应状态码和执行时间
HEADERS:除了记录 BASIC级别的信息外,还会记录请求和响应的头信息
FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据
* @return
*/
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
Настройте уровень журнала журнала для отладки:
logging:
level:
# Feign日志只会对日志级别为debug的做出响应
com.fishleap.client.UserServiceFeignClient: debug
Ссылаться на
- Анализ исходного кода Spring Cloud OpenFeign
- Как работает притворство
- Анализ исходного кода Feign: вспомните некоторые ямы, на которые Feign наступил впервые
6.GateWay шлюз
1. Обзор шлюза
Gateway — это служба шлюза API, созданная на основе экосистемы Spring и основанная наSpring Boot 2.0, Spring WebFlux,а такжеProject Reactor, многие знакомые библиотеки синхронизации (такие какSpring-Data
а такжеSpring-Security
) и режим синхронного программирования вSpring Cloud Gateway
не применяется в.Адрес официального документа Spring Cloud Gateway
Spring Cloud Gateway имеет следующие функции:
- Построен на Spring Framework 5, Project Reactor и Spring Boot 2.0;
- Динамическая маршрутизация: может соответствовать любому атрибуту запроса;
- Для маршрутов можно указать Predicate и Filter;
- Интегрируйте функцию автоматического выключателя Hystrix;
- Интеграция функции обнаружения службы Spring Cloud;
- Функция ограничения тока запроса;
- Перезапись пути поддерживается.
Маршрут: Маршрут является основным компонентом шлюза. Он определяется идентификатором, целевым URI, набором предикатов и набором фильтров. Если агрегация предикатов оценивается как true, маршрут сопоставляется.
Предикат: введен на основе функционального программирования в Java 8.java.util.Predicate. При использовании предикатного (агрегационного) суждения входными параметрами являютсяServerWebExchange
Тип, который позволяет разработчикам сопоставлять произвольные параметры HTTP-запросов, такие как заголовки HTTP-запросов, параметры HTTP-запросов и т. д.
Фильтр (Filter): использует указанныйGatewayFilter
завод созданGatewayFilter
Например, запрос (параметры) или ответ (параметры) могут быть изменены до или после отправки запроса вниз по течению.
Утверждение Predicates является условием соответствия, а Filter — перехватчиком, который может реализовать переадресацию определенного маршрута в сочетании с URL-адресом.
Клиент отправляет запрос в Spring Cloud GateWay, затем находит маршрут, который соответствует запросу в отображении обработчика GateWay, и отправляет его веб-обработчику GateWay; затем обработчик отправляет запрос в нашу фактическую службу для выполнения бизнеса через указанный логика цепочки фильтров, а затем возврат. Фильтры разделены пунктирными линиями, поскольку фильтры могут выполнять бизнес-логику до (до) или после (после) отправки прокси-запроса. (Переадресация маршрута + выполнение цепочки фильтров) Фильтр может выполнять проверку параметров, проверку разрешений, мониторинг трафика, вывод журнала, преобразование протокола и т. д. в фильтре типа «до» В фильтре типа «после» он может выполнять содержимое ответа, модификацию заголовка ответа и модификацию журнала. вывод, контроль расхода и т.д.
2. Приложение шлюза
Импорт зависимостей:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Конфигурация маршрутизации:
Шлюз предоставляет два разных способа настройки маршрутизации: один — через файл yml, другой — через Java Bean.
Настройте в application.yml:
server:
port: 9201
spring:
cloud:
gateway:
routes:
- id: path_route #路由的ID
uri: ${service-url.user-service}/user/{id} #匹配后路由地址
predicates: # 断言,路径相匹配的进行路由
- Path=/user/{id}
service-url:
user-service: http://localhost:8201
Используйте конфигурацию Java Bean: добавьте связанные классы конфигурации и настройте объект RouteLocator.
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route2", r -> r.path("/user/getByUsername")
.uri("http://localhost:8201/user/getByUsername"))
.build();
}
}
3. Правила маршрутизации GateWay
Spring Cloud Gateway
Он содержит множество встроенных фабрик предикатов маршрутизации. Каждый из этих предикатов соответствует разным атрибутам HTTP-запроса. Можно использовать несколько фабрик предикатов маршрутов сand
логика объединена.
Укажите предикаты маршрутизации даты и времени
- Соответствие запросам до указанной даты и времени.
- Соответствие запросам после указанной даты и времени.
- Сопоставьте запросы между указанной датой и временем.
Настроенные дата и время должны удовлетворятьZonedDateTime
Формат: год, месяц, день и час, минуты и секунды разделены буквой «T», затем -07:00 — это разница во времени с UTC, а последнее [America/Denver] — это часовой пояс.2017-01-20T17:42:47.789-07:00[America/Denver]
server
port: 9090
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://example.org
predicates:
- Between=2019-05-01T00:00:00+08:00[Asia/Shanghai],2019-05-02T00:00:00+08:00[Asia/Shanghai]
Предикат маршрутизации файлов cookie
CookieRoutePredicateFactory
Вам необходимо указать два параметра: имя файла cookie и регулярное выражение (значение). Только когда имя и значение, соответствующие файлу cookie в запросе, совпадают со значением, настроенным в предикате маршрутизации файла cookie, соответствующее попадание может быть маршрутизировано.
server
port: 9090
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=doge,aaa
Запрос должен содержать файл cookie, имя — doge, а значение должно соответствовать регулярному выражению «aaa», которое будет перенаправлено наhttps://example.org
.
Предикат маршрутизации заголовка
HeaderRoutePredicateFactory
Необходимо указать два параметра: имя заголовка и регулярное выражение (значение). Только когда имя и значение, соответствующие заголовку в запросе, совпадают со значением, настроенным в предикате маршрутизации заголовка, совпадающее попадание можно использовать для маршрутизации.
Предикат маршрутизации хоста
HostRoutePredicateFactory
Просто укажите список имен хостов, каждый элемент в списке поддерживает стиль именования Ant, используйте.
В качестве разделителя, используемого между несколькими элементами,
различать. Предикат маршрутизации хоста фактически предназначен для заголовка HTTP-запроса.Host
Атрибуты.
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://localhost:9091
predicates:
- Host=localhost:9090
предикат маршрутизации метода запроса
MethodRoutePredicateFactory
Требуется только один параметр: метод HTTP-запроса для соответствия.
spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://localhost:9091
predicates:
- Method=GET
предикат маршрутизации пути запроса
PathRoutePredicateFactory
нужноPathMatcher
Список путей шаблонов и необязательный аргумент flagsmatchOptionalTrailingSeparator
. Это наиболее часто используемый предикат маршрутизации.
spring:
cloud:
gateway:
routes:
- id: path_route
uri: http://localhost:9091
predicates:
- Path=/order/path
предикат маршрутизации параметра запроса запроса
QueryRoutePredicateFactory
Требуется обязательный параметр запроса запроса (имя параметра) и необязательное регулярное выражение (регулярное выражение).
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://localhost:9091
predicates:
- Query=doge,aaa.
Предикат маршрутизации удаленного IP-адреса
RemoteAddrRoutePredicateFactory
Правило сопоставления принимает список (минимум 1) строк в нотации CIDR (IPv4 или IPv6), например 192.168.0.1/16 (где 192.168.0.1 — удаленный IP-адрес, а 16 — маска подсети).
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: https://example.org
predicates:
- RemoteAddr=192.168.1.1/24
Объединение нескольких предикатов маршрутизации
потому что конфигурация маршрутизацииpredicates
Атрибут на самом деле представляет собой список, и несколько правил маршрутизации могут быть добавлены напрямую:
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://localhost:9091
predicates:
- RemoteAddr=xxxx
- Path=/yyyy
- Query=zzzz,aaaa
Динамическая маршрутизация шлюза
GateWay поддерживает автоматическое получение списка услуг из реестра и доступ к нему, то есть так называемую динамическую маршрутизацию.
Когда динамическая маршрутизация установлена, uri начинается с lb: // (lb представляет собой получение служб из реестра), за которым следует имя службы, которую необходимо перенаправить на
4. Фильтр шлюза
Фабрика шлюзовых фильтров
фильтр маршрутаGatewayFilter
Позволяет изменять содержимое входящего HTTP-запроса или возвращаемого содержимого HTTP-ответа.Область действия фильтра маршрута — это конкретная конфигурация маршрута..Spring Cloud Gateway
предоставляет множество встроенныхGatewayFilter
Фабрика, вы можете выбрать по мере необходимости.
В настоящее времяGatewayFilter
Встроенная реализация фабрики выглядит следующим образом:
ID | имя класса | Типы | Функции |
---|---|---|---|
StripPrefix | StripPrefixGatewayFilterFactory | pre | Удалите первую часть пути URL-адреса запроса, например, исходный путь запроса — /order/query, а после обработки — /query. |
SetStatus | SetStatusGatewayFilterFactory | post | Установите код состояния ответа на запрос, который будет проанализирован из org.springframework.http.HttpStatus |
SetResponseHeader | SetResponseHeaderGatewayFilterFactory | post | Установить (добавить) заголовок ответа на запрос ответа |
SetRequestHeader | SetRequestHeaderGatewayFilterFactory | pre | Установить (добавить) заголовки запроса |
SetPath | SetPathGatewayFilterFactory | pre | Установить (переопределить) путь запроса |
SecureHeader | SecureHeadersGatewayFilterFactory | pre | Установите заголовки запросов, связанные с безопасностью, см. SecureHeadersProperties |
SaveSession | SaveSessionGatewayFilterFactory | pre | Сохранить веб-сессию |
RewriteResponseHeader | RewriteResponseHeaderGatewayFilterFactory | post | заголовок повторного ответа |
RewritePath | RewritePathGatewayFilterFactory | pre | Переписать путь запроса |
Retry | RetryGatewayFilterFactory | pre | Повторить запросы в зависимости от условий |
RequestSize | RequestSizeGatewayFilterFactory | pre | Ограничьте размер запроса, единица измерения байт, если он превышает установленное значение, он будет возвращен413 Payload Too Large
|
RequestRateLimiter | RequestRateLimiterGatewayFilterFactory | pre | Ограничение |
RequestHeaderToRequestUri | RequestHeaderToRequestUriGatewayFilterFactory | pre | Измените URL-адрес запроса на значение заголовка запроса |
RemoveResponseHeader | RemoveResponseHeaderGatewayFilterFactory | post | Удалить настроенные заголовки ответа |
RemoveRequestHeader | RemoveRequestHeaderGatewayFilterFactory | pre | Удалить настроенные заголовки запроса |
RedirectTo | RedirectToGatewayFilterFactory | pre | Перенаправление, необходимо указать код состояния HTTP и URL-адрес перенаправления |
PreserveHostHeader | PreserveHostHeaderGatewayFilterFactory | pre | Установите для атрибута saveHostHeader, переносимого запросом, значение true. |
PrefixPath | PrefixPathGatewayFilterFactory | pre | добавить предварительный путь к пути запроса |
Hystrix | HystrixGatewayFilterFactory | pre | Интеграция Hystrix |
FallbackHeaders | FallbackHeadersGatewayFilterFactory | pre | Hystrix выполняется, если логика перехода на более раннюю версию позволяет передавать сведения об исключении через заголовки запроса. |
AddResponseHeader | AddResponseHeaderGatewayFilterFactory | post | добавить заголовки ответов |
AddRequestParameter | AddRequestParameterGatewayFilterFactory | pre | Добавьте параметры запроса, ограничиваясь только параметром запроса URL-адреса. |
AddRequestHeader | AddRequestHeaderGatewayFilterFactory | pre | добавить заголовок запроса |
GatewayFilter
При использовании фабрики необходимо знать ее идентификатор и метод настройки, который можно увидеть в публичном статическом внутреннем классе соответствующего класса фабрики.XXXXConfig
.
Завод GlobalFilter
GlobalFilter
Функция на самом деле такая же, какGatewayFilter
то же самое, простоGlobalFilter
Область действия — все конфигурации маршрутизации, не привязанные к указанной конфигурации маршрутизации. несколькоGlobalFilter
в состоянии пройти@Order
илиgetOrder()
способ указать каждыйGlobalFilter
Порядок выполнения , чем меньше значение ордера, темGlobalFilter
Чем выше приоритет выполнения.
В настоящее времяSpring Cloud Gateway
встроенныйGlobalFilter
следующим образом:
имя класса | Функции |
---|---|
ForwardRoutingFilter | перенаправить |
LoadBalancerClientFilter | балансировки нагрузки |
NettyRoutingFilter | Маршрутизация для HTTP-клиента Netty |
NettyWriteResponseFilter | Netty отвечает на операцию записи |
RouteToRequestUrlFilter | Обновить URL-адрес на основе конфигурации маршрута |
WebsocketRoutingFilter | Запросы Websocket перенаправляются вниз по течению |
ВстроенныйGlobalFilter
большинство иServerWebExchangeUtils
связанные свойства.
5. Междоменная конфигурация и конечные точки Actuator
Междоменная конфигурация:
Шлюзы можно настроить для управления глобальным поведением CORS. Класс, соответствующий глобальной конфигурации CORS:CorsConfiguration
, эта конфигурация представляет собой карту шаблонов URL. Напримерapplication.yaml
Файлы следующие:
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "https://docs.spring.io"
allowedMethods:
- GET
Для всех запрошенных путей маршруты изdocs.spring.io
И это запрос CORS с методом GET.
Корреляция конечной точки привода:
представлятьspring-boot-starter-actuator
, вам необходимо выполнить следующую настройку, чтобы включитьgateway
Конечные точки мониторинга:
management.endpoint.gateway.enabled=true
management.endpoints.web.exposure.include=gateway
Список поддерживаемых в настоящее время конечных точек:
ID | путь запроса | HTTP-метод | описывать |
---|---|---|---|
globalfilters | /actuator/gateway/globalfilters | GET | Показать список GlobalFilters в конфигурации маршрутизации |
routefilters | /actuator/gateway/routefilters | GET | Отображает список GatewayFilters, привязанных к соответствующей конфигурации маршрутизации. |
refresh | /actuator/gateway/refresh | POST | Очистить кеш конфигурации маршрута |
routes | /actuator/gateway/routes | GET | Показать список определенных конфигураций маршрутизации |
routes/{id} | /actuator/gateway/routes/{id} | GET | Отображение конфигурации маршрутизации, определенной для соответствующего идентификатора. |
routes/{id} | /actuator/gateway/routes/{id} | POST | Добавить новую конфигурацию маршрута |
routes/{id} | /actuator/gateway/routes/{id} | DELETE | Удалить конфигурацию маршрутизации указанного идентификатора |
в/actuator/gateway/routes/{id}
Формат добавления нового параметра запроса конфигурации маршрута следующий:
{
"id": "first_route",
"predicates": [{
"name": "Path",
"args": {"doge":"/example"}
}],
"filters": [],
"uri": "https://example.org",
"order": 0
}
Ссылаться на
- Spring Cloud Gateway: новое поколение сервисов шлюза API
- Spring Cloud Gateway в яму
- Начало работы с Spring Cloud Gateway