Введение
Spring Cloud предоставляет библиотеку Hystrix Faillant для реализации стратегии понижения для методов, настроенных с выключателями схемы, когда служба недоступна, и временно вызовут альтернативные методы. Эта статья создаст микросервис продукта, зарегистрируется в Центре регистрации услуг Eureka, а затем мы используем API доступа к веб -клиентам/продуктам для получения списка продуктов, а когда служба продуктов не сбои, локальный метод резервного режима вызывается для понижения, но предоставление услуги нормально.
Основная среда
Git: исходный код проекта
Добавить услуги продукта
Создайте новый проект Maven в IntelliJ, используя следующую конфигурацию
Затем добавьте следующий код в pom.xml:
<? xml version = "1.0" Encoding = "utf-8"?> <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"> <doliderversion> 4.0.0 </modelversion> <groupid> cn.zxuqian </GroupD> </artbactId> <groupCACTID> <GroupCACTID> <GroupCACTID> <GroupCACTID> <GroupCACTID> <GroupCACTID> <BrightVact> <britever> <briteR> <beryversion> <groupId> art. <sersion> 1.0-snapshot </version> <parent> <groupid> org.springframework.boot </GroupId> <ratifactid> Spring-boot-starter-parent </artifactid> <sersion> 2.0.1.release </version> <venustarypath/> </parent> <properties>. <project.build.sourceEncoding> utf-8 </project.build.sourceencoding> <java.version> 1.8 </java.version> </свойства> <Depertiencies> <dehyedies <ArtifactId> Spring-Cloud-Starter-Netflix-eureka-client </artifactid> </deperency> <depertive> <groupid> org.springframework.cloud </GroupId> <artifactid> Spring-cloud-starter-config </artifactid> </repertice> <periation> <groupid> org.springpring framepring framebilpring> artifactid> </repertive> <grepence> <groupd> org.springpringpringpringpring fromid> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependency> </dependency> <dependencyManagement> <dependency> <dependency> <groupId> org.springframework.cloud </GroupId> <artifactId> spring-cloud-lependencies </artifactid> <sersion> finchley.m9 </version> <sype> pom </type> <crappope> import </scope> </зависимость> </repect> </repect> </repertaincom <groupId> org.springframework.boot </groupid> <artifactid> Spring-boot-maven-plugin </artifactid> </plugin> </plugins> </build> <prositories> <mepository> <id> Spring-milestones </id> <mame> Spring Wilestones </name> <URL> https://repo.spring.io/libs-milestone </url> <sonposhots> <Nabled> false </inabled> </snapshots> </Repository> </Repository> </Repositories> </project>
Мы продолжали использовать Spring-Cloud-Starter-Netflix-Eureka-Client, чтобы позволить автоматически зарегистрироваться продукты и услуги в Eureka Services. Затем для чтения файла конфигурации Сервисного центра конфигурации также используется Spring-Cloud-Starter-Config. Этот проект - просто простой весенний веб -проект.
Создайте файл bootstrap.yml в рамках SRC/Main/Resources и добавьте следующий контент:
Весна: Приложение: Имя: Продукт-Сервис Облако: Конфигурация: URI: http: // localhost: 8888
Создайте файл продукта-service.yml в репозитории GIT в центре конфигурации и добавьте следующую конфигурацию и отправьте:
Сервер: порт: 8081
Эта конфигурация указывает, что порт обслуживания продуктов составляет 8081. Затем создайте класс приложения и добавьте следующий код:
Пакет cn.zxuqian; import org.springframework.boot.springApplication; импорт org.springframework.boot.autoconfigure.springbootapplication; импорт org.springframework.cloud.client.discovery.enbabledIscOvericLient;@endabledIsclient@springbootppliceplic@spensapplic@spensapublic@springbootpplicaticom void main (string [] args) {springapplication.run (application.class, args); }}Аннотация @enabledIscOveryClient будет обучать Spring Cloud автоматически регистрировать эту службу в Eureka. Наконец, создайте контроллер cn.zxuqian.controllers.
Пакет cn.zxuqian.controllers; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.RestController; @RestControllerPublic Class ProductController {@Requestmapping ("/product string string string string string string string string () Футболка "; }}Настройка веб -клиента
Откройте веб -проект, который мы создали ранее, и добавьте новую зависимость Hystrix в pom.xml:
<Depective> <groupid> org.springframework.cloud </GroupId> <ArtifactId> Spring-Cloud-Starter-Netflix-hystrix </artifactid> </depertion>
Затем обновите код класса приложений:
Пакет cn.zxuqian; импорт org.springframework.boot.springapplication; импорт org.springframework.boot.autoconfigure.springbootapplication; импорт org.springframework.boot.web.client.resttemplatebuilder; org.springframework.cloud.client.circuitbreaker.enableCircuitBreaker; Import org.springframework.cloud.client.discovery.enablediscoveryclient; импорт org.springframework.context.annotation.bean; импорт org.springframework.web.client.resttemplate;@enableCircuitBreaker@enabledIscoveryClient@SpringBootApplicationPublic Class Application {public static void main (string [] args) {springApplication.run (application.class, args); } @Bean public resttemplate rest (ResttemplateBuilder Builder) {return Builder.build (); }}Здесь @enablecircuitbreaker используется для включения функции выключателя цепи, а затем добавляется метод отдыха и используется аннотация @bean. Эта часть принадлежит к функции впрыска в зависимости от пружины. Метод с использованием тега @Bean расскажет вам, как инициализировать такие объекты. Например, в этом примере использование ResttemplateBuilder для создания объекта RestTemplate, который будет использоваться позже в службе с использованием автоматического выключателя.
Создайте класс cn.zxuqian.service.productservice и добавьте следующий код:
Пакет cn.zxuqian.services; import com.netflix.hystrix.contrib.javanica.annotation.hystrixcommand; импорт org.springframework.beans.factory.annotation.autowired; import.springframework.cloud.serviceins org.springframework.cloud.client.discovery.discoveryclient; import org.springframework.stereotype.service; import org.springframework.web.client.resttemplate; import java.util.list; @servicepublic productservice {private final restteplate. @Autowired Private DiscoveryClient DiscoveryClient; public productservice (Resttemplate Resttemplate) {this.RestTemplate = RestTemplate; } @Hystrixcommand (sharkbackmethod = "backupproductlist") public String productlist () {list <serviceInsant> emestans = this.discoveryclient.getInstances ("service продукта"); if (экземпляры! = null && emestances.size ()> 0) {return this.resttemplate.getforobject (emances.get (0) .geturi () + "/products", string.class); } возвращаться ""; } public String backupproductlist () {return "jack, sweater"; }} Причина создания класса обслуживания заключается в том, что Hystrix может использоваться только в классах, помеченных @Service или @Component, так что API, предоставленный контекстом Spring, можно использовать нормально. Это будет объяснено позже, когда вы углубитесь в весну.
После использования аннотации @hystrixcommand, Hystrix будет отслеживать аннотированный метод, а именно ProductList (базовый уровень завершает этот метод для достижения мониторинга). Как только ошибки этого метода накапливаются до определенного порога, выключатель схемы будет запущен. Все последующие запросы по вызову метода ProductList не будут выполнены, а метод, указанный SparkbackMethod, будет временно вызван Backupproductlist (), а затем, когда служба вернется к нормальной жизни, автоматический выключатель будет закрыт.
В этом классе мы также используем DiscoveryClient, чтобы найти адрес URI Службы продукта, используя значение Spring.Application.Name Configuration of Configuration Service Service, то есть в методе DiscoveryClient.getInStances () в качестве ServiceID, а затем будет возвращен список. Поскольку у нас есть только одна услуга продуктов, нам нужно только взять адрес URI первого экземпляра.
Затем мы используем Resttemplate для доступа к API службы продукции. Обратите внимание, что здесь используется инъекция конструктора Spring, то есть метод, который мы аннотировали с помощью @Bean, будет использоваться для инициализации переменной RestTemplate без инициализации нас вручную. Класс Resttemplate предоставляет метод GetForObject () для доступа к другим API REST и обертывания результатов в форму объекта. Первый параметр - это адрес API для API, а второй параметр - это тип полученного результата. Здесь мы возвращаем строку, поэтому мы передаем ее string.class.
Метод Backupproductlist () возвращает информацию о пониженном списке продуктов.
Наконец, создайте контроллер cn.zxuqian.controllers.productController и добавьте следующий код:
Пакет cn.zxuqian.controllers; import cn.zxuqian.services.productservice; import org.springframework.beans.factory.annotation.autowired; импорт org.springframework.web.bind.annotation.requestmapping; импорт org.springframework.web.bind.annotation.requestmapping; org.springframework.web.bind.annotation.RestController; @RestControllerPublic Class ProductController {@Autowired ProductService Productservice; @Requestmapping ("/products") public String productList () {return productservice.productlist (); }} Здесь используйте ProductService для предоставления данных для /продуктов.
тест
Сначала мы используем плагин с пружиной: запустить службу центра конфигурации, конфигурации, а затем запустить Eureka-Server, затем запустить услуги продукта и, наконец, запустить веб-клиент. Подождите некоторое время, прежде чем служба Eureka будет успешно зарегистрирована и посетите http: // localhost: 8080/продукты. При нормальных обстоятельствах мы получим результат куртки, куртки, свитер и футболку. Затем мы закрываем обслуживание продуктов, а затем получают доступ к одному и тому же пути, и мы получим результат понижения: куртка, свитер
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.