В микросервисах мы разделили систему на многие услуги, и каждая единица взаимозависимо от регистрации обслуживания и потребления подписки. Но что произойдет, если у некоторых услуг есть проблемы?
Например, существует три службы (ABC), вызовы B и B. C. Из -за задержки сети или проблем с кодом C, B не получит ответа в течение длительного времени, поэтому запрос B вызовы C будут приостановлены и ожидают.
В случае высокого параллельного доступа эти приостановленные потоки не могут быть опубликованы, в результате чего последующие запросы блокируют, и в конечном итоге B также будет повесить трубку. По аналогии, а также может повесить трубку, в результате чего вся система сбой.
Чтобы решить всю проблему, Spring Cloud использует Hystrix для защиты отказа от сбоя обслуживания, включая серию функций защиты, таких как выключатели схемы и изоляцию потока. Сегодня мы рассмотрим, как реализовать выключатели цепи через Hystrix.
1. Что такое Spring Cloud Hystrix? Что такое автоматический выключатель?
Spring Cloud Hystrix реализована на основе фреймворта Netflix с открытым исходным кодом, Hystrix, и его цель - обеспечить сильную достойку неисправности для задержки и сбоя, контролируя те узлы, которые получают доступ к удаленным системам, услугам и третьим сторонам.
Выключатель схемы похож на выключатель схемы утечки, используемый в сильной электрической коробке в нашем доме. Когда сервисная единица сбоя (аналогично короткому замыканию электрического устройства), ответчик возвращается на вызывающего абонента через функцию мониторинга неисправности автоматического выключателя (аналогично предохранителю), избегая долгосрочного ожидания, тем самым предотвращая распространение неисправности на всю систему.
2. Если нет выключателя схемы, отображение страницы
Вы все еще помните три службы в серии Весенний Облако, серия 2: Использование Eureka для управления услугами (Eureka/Hello-Service/Hello-Consumer), которую мы писали ранее? Мы проводим эксперименты на основе этого.
1. Запустите центр регистрации услуг Eureka с номером порта 1111
2. Начните поставщика услуг Hello-Service. Здесь мы начинаем две услуги, с номерами портов 9090,9091 соответственно.
3. Начните Hello-Consumer, чтобы обслуживать потребителей, с номером порта 9999; В настоящее время у нас нет проблем с посещением http: // localhost: 9999/hello-consumer несколько раз.
4. Выключите сервис с номером порта 9091, а затем посетите http: // localhost: 9999/hello-consumer несколько раз, и сообщалась об ошибке.
PS: Здесь мы объясняем, почему нам нужно получить доступ несколько раз, потому что мы достигли балансировки нагрузки через ленту. Когда мы получаем доступ к http: // localhost: 9999/hello-consumer, мы будем опросить две услуги, которые получают доступ к Hello-Service. Ошибка будет сообщена при доступе к службе с номером порта 9091. Не будет проблем с доступом к службе с 9090.
3. Реализация кода выключателя цепного выключателя
Затем давайте посмотрим, как реализовать код. Мы не изменяем центр регистрации услуг и поставщика услуг, нам нужно только изменить услуги потребителя Hello-Consumer.
1. Изменить файлы POM и ввести зависимости Hystrix
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <dolidyversion> 4.0.0 </modelversion> <groupid> com.sam </GroupId> <Artifactid> hello-consumer </artifactid> <serse> 0.0.1-snapshot </версия> <parent> <groupId> org.springframework.boot </GroupId> <StrifactId> Spring-Boot-Starter-parent </artifactid> <sersive> 1.5.1.Release </version> </parent> <свойства> <javaversion> 1.8 </javaversion> </operties> <зависимость> <зависимости> <зависимость> <зависимости> <зависимость> <зависимости> <зависимость> <зависимости> <зависимость> <зависимости> <зависимости> <зависимость> <зависимости> <зависимость> <groupId> org.springframework.cloud </GroupId> <artifactid> spring-cloud-зависимости </artifactid> <sersion> camden.sr6 </version> <sype> pom </type> <crappope> import </scope> </vehyse> </resemendy> </resemendingmanagement> <sope> <!-ВВЕДЕНИЕ eureka> </degulity> </dependencymanagement> <!-ВВЕДЕНИЯ eureka> </deguestulity> </зависимость> <зависимости> <!-ВВЕДЕНИЕ eureka> </зависимость> </зависимость> <зависимости> <! <groupId> org.springframework.cloud </GroupId> <ratifactId> Spring-Cloud-Starter-eureka </artifactid> </depervice> <!-Введение ленточной зависимости используется для реализации балансировки нагрузки. Мы просто используем его здесь и не введем его в другом месте-> <Depected> <groupId> org.springframework.cloud </GroupId> <straCactId> Spring-Cloud-Starter-Ribbon </artifactId> </зависимость> <!-Введение Hystrix для реализации. <ArtifactId> Spring-Cloud-Starter-Hystrix </artifactid> </dependency> </dependencies> </project>
2. Измените класс запуска, добавьте аннотацию @enablecircuitbreaker и включите выключатель цепи
@EnabledIscoveryClient@SpringBootApplication@onableCircuitBreakerPublic Class ConsumerApp {//@Bean применяется на методе и используется для установки возвращаемого значения метода @bean @loadbalanced //@Loadbalanced для достижения балансировки нагрузки Publictemptate Resttemptate () {return resttemplate (); } public static void main (string [] args) {SpringApplication.run (consumerApp.class, args); }}В настоящее время вы обнаружите, что в этом классе стартапа есть три аннотации. Разве это не очень хлопотно? Это не имеет значения, мы можем использовать аннотацию @springcloudapplication
@SpringCloudApplicationPublic Class ConsumerApp {// @Bean применяется на методе и используется для установки возвращаемого значения метода в Bean @bean @loadbalanced // @Loadbalanced для достижения балансировки нагрузки Public Resttemplate Resttemplate () {return resttemplate (); } public static void main (string [] args) {SpringApplication.run (consumerApp.class, args); }}@Springcloudapplication = @enablediscoveryclient +@springbootapplication +@enablecircuitbreaker, вы можете увидеть из исходного кода:
@Target (elementType.type) @retention (armentpolicy.runtime)@документирован@enhorited@springbootapplication@enablediscoveryclient@enableCircuitBreakerPublic @Interface SpringCloudApplication {}3. Добавить сервис
@Servicepublic class consumerservice {@autowired resttemplate resttemplate; @Hystrixcommand (sharkbackmethod = "errormsg") public String Consumer () {// звонить в службу Hello-Service, обратите внимание, что здесь используется имя службы, а не конкретный ip+port resttemplate.getForObject ("http: // hello-service/hello", string.class); вернуть "Привет потребительский финиш !!!"; } public String errorrrmsg () {return "ошибка !!!"; "; }}Мы поместили реализацию исходного контроллера вызова Resttemplate в службу и указываем метод обратного вызова через @HystrixCommand и вызовываем этот метод, когда возникает ошибка.
4. Измените контроллер
/** *Resttemplate больше не называется непосредственно здесь, *, но реализуется вызовом Service * */ @restcontrollerpublic class consumercontroller { @autowvired // resttemplate resttemplate; Потребительский сервис; @Requestmapping ("/hello-consumer") public String helloConsumer () {// // позвонить в службу Hello-Service, обратите внимание, что здесь используется имя службы, а не конкретный ip+port // resttemplate.getForObject ("http: // hello-service/hello", string.class); return service.consumer (); }}5. Проверьте, несколько посещений, и когда сообщается об ошибке, будет отображаться следующее содержимое.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.