springcloud学习(五)之hystrix

来源:互联网 发布:免费销售记账软件 编辑:程序博客网 时间:2024/06/11 04:27

一、介绍

1.断路器机制
断路器很好理解, 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.
2.Fallback
Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.
3.资源隔离
在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源.

二、开发

1、新建项目hjduan.spring.cloud.hystrix pom如下

<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">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>com.hjduan.spring.cloud</groupId>        <artifactId>hjduan.spring.cloud</artifactId>        <version>0.0.1-SNAPSHOT</version>    </parent>    <artifactId>hjduan.spring.cloud.hystrix</artifactId>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-hystrix</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-ribbon</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>            </plugin>        </plugins>    </build></project>

2、application.yml配置

server:  port: 8766eureka:  client:    serviceUrl:      defaultZone: http://admin:admin@localhost:8761/eureka/  instance:    prefer-ip-address: true    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}spring:  application:    name: hjduan-spring-cloud-ribbon

3、编写RibbonHelloWordService

package com.hjduan.spring.cloud.hystrix.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.web.client.RestTemplate;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;/** * hystrix断路器  * 作者: 段浩杰 2017年7月25日 */@Servicepublic class RibbonHelloWordService {    @Autowired    RestTemplate restTemplate;    /**     * 注解中 如果出现错误就会访问 hiError方法 。     *      * 测试步骤:     * 1.当启动注册中心后     * 2.启动本服务,直接访问即可验证断路器     *      * @param name     * @return     */    @HystrixCommand(fallbackMethod = "hiError")    public String ribbonHelloWordService(String name) {        return restTemplate.getForObject("http://HJDUAN-SPRING-CLOUD-CONSUMER/hi/{name}", String.class, name);    }    public String hiError(String name) {        return "hi!  " + name + "  error!";    }}

4、编写controller

package com.hjduan.spring.cloud.hystrix.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import com.hjduan.spring.cloud.hystrix.service.RibbonHelloWordService;/** *  *     作者:     段浩杰              2017年7月25日 */@RestControllerpublic class RibbonHelloWordController {    @Autowired    private RibbonHelloWordService ribbonHelloWordService;    @GetMapping(value = "/hi/{name}")    public String ribbonHelloWord(@PathVariable String name) {        return ribbonHelloWordService.ribbonHelloWordService(name);    }}

5、编写启动类

package com.hjduan.spring.cloud.hystrix;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.hystrix.EnableHystrix;import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;/** * Ribbon 做负载客户端负载均衡 * Hystrix做断路器 */@EnableEurekaClient@SpringBootApplication@EnableHystrix//次注解是用来访问hystrix的。@EnableHystrixDashboardpublic class HystrixApplicationConfiguration {    public static void main(String[] args) {        new SpringApplication(HystrixApplicationConfiguration.class).run(args);    }    /**     * @ LoadBalanced注册表明,这个restRemplate是负载均衡的。     * @return     */    @Bean    @LoadBalanced    public RestTemplate restTemplate(){        return  new  RestTemplate();    }}

6、然后运行hjduan.spring.cloud.eureka,hjduan.spring.cloud.consumer修改hjduan.spring.cloud.consumer端口再次运行一下,运行hjduan.spring.cloud.hystrix,然后访问http://localhost:8766/hi/123

7、验证断路器是否起作用
关闭hjduan.spring.cloud.consumer这两个服务,在访问会出现,断路器指定的方法。
8、上述说的是ribbon方式采用的断路器,fegin采用的断路器在上一节就有描述,可以查看上一节进行编写