Режим выключателя куркуйта
В распределенных средах, особенно в распределенных системах со структурами микросервиса, одна программная система очень часто вызывает другую удаленную систему. Каллея этого удаленного вызова может быть другим процессом или другим хостом по всей сети. Самая большая разница между этим удаленным вызовом и внутренним вызовом процесса состоит в том, что удаленный вызов может не сработать или вешать без какого -либо ответа до тайм -аута. Хуже того, если несколько абонентов называют одну и ту же ожидающую услугу, очень вероятно, что ожидание тайм -аута услуги быстро распространится на всю распределенную систему, вызывая цепную реакцию и, таким образом, потребляет большое количество ресурсов всей распределенной системы. Это может в конечном итоге привести к параличу системы.
Режим автоматического выключателя заключается в предотвращении бедствий, вызванных такой цепной реакцией, похожей на водопад в распределенных системах.
После того, как у определенного электрического прибора возникают проблемы, предохранитель схемы будет взрываться для предотвращения катастрофы. Выключатели схемы аналогичны схемам предохранителей. Идея реализации очень проста. Они могут инкапсулировать удаленные услуги, которые нуждаются в защите, и контролировать количество сбоев внутри. Как только количество сбоев достигнет определенного порога, все последующие вызовы в службу напрямую возвращают ошибку вызывающему после перехвата цепного выключателя и не будут продолжать вызывать службу, которая уже имела проблемы, тем самым достигая цели защиты вызывающего абонента. Вся система не будет испытывать цепную реакцию водопада, вызванную тайм -аутом.
1. Основной режим
Приведенный выше рисунок представляет собой структуру автоматического выключателя (выключатель curcuit), который имеет два основных состояния (близко и открыто) и основное действие поездки:
В состоянии закрытия клиент запрашивает услугу поставщику непосредственно через выключатель с цепи без каких -либо препятствий. Возвращаемое значение поставщика напрямую возвращается клиенту выключателем цепи.
В открытом состоянии, после того, как клиент инициирует запрос на обслуживание поставщику, автоматический выключатель не будет передавать запрос поставщику, но напрямую вернет клиента, а путь между клиентом и поставщиком сломается.
Поездка: в состоянии закрытия, если поставщик продолжает время от времени и ошибки, после достижения указанного порога, в схеме выключатель будет происходить отключение, а затем состояние выключателя схемы будет входить от закрытия.
2. Расширенный режим
В режиме выключателя основного цепи, он гарантирует, что автоматический выключатель не будет вызван, когда автоматический выключатель находится в открытом состоянии, но нам также нужны дополнительные меры для сброса выключателя цепи после того, как снабжающий восстановит услугу. Одним из возможных способов является регулярное обнаружение, восстанавливается ли услуга поставщика, и как только она восстановлена, статус будет закрыт. Состояние повторного перерыва автоматического выключателя наполовину открыто.
3. Используйте случаи для автоматических выключателей:
Поставщик, как правило, очень стабилен. Если произойдет сбой, время проверки и восстановления занимает много времени и не может быть быстро отремонтировано за короткое время, то эта услуга более подходит для использования режима выключателя схемы. В противном случае, это может привести к эффекту пинг-понга.
3. Выключатель цепи не подходит для случаев:
Чтобы предотвратить попытку применения привлечь удаленный сервис или получить доступ к общему ресурсу, этот шаблон может не подходить, если операция с очень вероятной потерпит неудачу.
Для обработки приложений доступа к местным выделенным ресурсам, таким как структуры данных в памяти. В этой среде это обычно не подходит, и использование автоматического выключателя будет только увеличивать накладные расходы системы.
Ниже приводится прямое введение в то, как использовать выключатель схемы Spring Cloud.
Springcloud Netflix реализует имя библиотеки автоматических выключателей под названием Hystrix. Под архитектурой микросервиса обычно существует несколько уровней сервисных вызовов. Ниже приведена схематическая схема браузера, доступа к бэкэнд -микросервисам через API под архитектурой микросервиса:
Отказ от тайм -аута микросервиса может привести к цепной реакции водопада. На рисунке ниже Hystrix предотвращает это через автоматическое выключатель схемы обратной связи.
Сервис B на рисунке по какой -то причине терпит неудачу и становится недоступной. Все звонки в службу B пройдут. Когда призыв к B не может достичь определенного порога (20 сбоев происходят в течение 5 секунд, это значение по умолчанию, определенное Hystrix), ссылка будет находиться в открытом состоянии, и тогда все вызовы в службу B не будут выполнены, вместо этого резервное сообщение, указывающее на разомкнутую ссылку, предоставленную цепным выключателем. Hystrix предоставляет соответствующий механизм, который позволяет разработчикам определить это сообщение Fallbak.
Ссылка Open блокирует ошибку водопада, позволяя затопленным или неправильным службам иметь время для исправления. Этот запасной удар может быть еще одним защищенным вызовом, статическими данными или юридическим нулевым значением. Запавшие могут сформировать структуру цепочки, поэтому первый запасной удар, который называет другие бизнес -сервисы внизу, чтобы вернуть статические данные.
Далее, давайте доберемся до сути, добавив автоматический выключатель к двум предыдущим кластерам Hello World Service, чтобы предотвратить ослабление одного из мира Hello, в результате чего система не сможет цепорить тайм -аут.
1. Добавьте библиотеку Hystrix, чтобы поддержать выключатели схемы в Pom.xml проекта Maven (лента или проект Feign, представленный в предыдущей главе)
<Depective> <groupid> org.springframework.cloud </GroupId> <ArtifactId> Spring-Cloud-Starter-Hystrix </artifactId> </depervice>
2. Используйте выключатели с цепи в приложениях ленты
1). Добавить аннотацию @enablecircuitbreaker в класс запуска Spring Boot
@SpringBootApplication@enabledIscoveryClient@eNableCircuitBreakerPublic Class ServiceribbonApplication {public static void main (string [] args) {SpringApplication.run (Serviceribbonapplication.class, args); }2). Аннотировать метод доступа к службам с помощью аннотации @hystrixcommand
@Servicepublic class helloservice {@autowired resttemplate resttemplate; @Hystrixcommand (sharkbackmethod = "servicefailure") public String gethellocontent () {return resttemplate.getforobject ("http: // service-helloworld/", string.class); } public String serviceFailure () {return "Hello World Service недоступен!"; }}Аннотация @hystrixcommand определяет автоматический выключатель, который инкапсулирует метод Gethellocontant (). Когда доступ к службе, который он обращается, не может достичь порогового значения, сервис-helloworld больше не будет вызван. Вместо этого он возвращает метод ServiceFailure (), определяемый SharkbackMethod. Есть два момента, на которые необходимо уделить особое внимание при определении метода SwarkbackMethod, определяемого аннотацией @hystrixcommand:
Во -первых, возвращаемое значение и тип параметров SwarkbackMethod должны быть точно такими же, как метод, аннотированный @HystrixCommand. В противном случае исключение будет брошено во время выполнения. Например, в этом примере возвращаемое значение ServiceFailure () и возвращаемого значения метода gethelloContant () оба являются строками.
Во -вторых, когда базовая служба выходит из строя, SharkbackMethod не заменяет весь метод, аннотированный @HystrixCommand (GethelloContant в этом примере), а только конкретная служба, доступную через RestTemplate. Вы можете видеть из вывода системы, что даже если она не удастся, на выходе консоли все еще будет «сервис-сервис-сервис».
Начните сервис Eureka, запустите только две службы HelloWorld, а затем прервите одну из них (моделируйте один из приостановленных микросервисов), посетите http: // localhost: 8901/, а затем обновите, из -за балансировки нагрузки вы можете видеть, что следующие две страницы появляются попеременно. Вы можете видеть, что вторая ожидаемая служба заменяется методом обработки ошибок, определенным в ленте.
4. Используйте автоматические выключатели в приложениях Feign.
1). Файн уже поддерживает автоматические выключатели, поэтому вам не нужно думать о методе ленты, добавьте дополнительные аннотации в класс запуска Spring Boot.
2). Добавьте запасной класс с помощью аннотации @FeignClient, который должен реализовать интерфейс, измененный @FeignClient.
@Feignclient (name = "service-helloworld", bandback = helloworldservicefailure.class) открытый интерфейс helloworldservice {@requestmapping (value = "/", method = requestMethod.get) public String sayshello (); }3). Чтобы создать класс HelloworldServiceFailure, вы должны реализовать интерфейс HelloworLdService, измененный @FeignClient. Обратите внимание, что вы добавляете аннотацию @component или @service, чтобы генерировать боб в пружинном контейнере.
@Componentpublic class helloworldservicefailure реализует helloworldservice {@override public String sayshello () {System.out.println («Hello World Service недоступен!»); Вернуть "Hello World Service недоступен!"; }}4). В версиях Brixton перед Spring Cloud Feign по умолчанию автоматически активировал выключатель схемы, но недавняя версия Dalston изменила конфигурацию по умолчанию, чтобы запретить.
По причинам, пожалуйста, см. Обратите внимание на этот момент. Поэтому, чтобы использовать выключатели с цепи в Feign, вы должны добавить следующую конфигурацию в Application.yml:
Файн: Hystrix: включено: true
5). Запустите приложение Feign и посетите http: // localhost: 8902/Привет, чтобы увидеть тот же эффект, что и лента.
Ссылка: http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-hystrix
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.