spring cloud微服務(wù)架構(gòu)(五):spring cloud整合Hystrix

1 spring cloud整合Hystrix

Hystrix主要用來保護(hù)調(diào)用者這一方的服務(wù),所以Eureka服務(wù)器和服務(wù)提供的代碼和第一篇文章中相同,只需要修改服務(wù)調(diào)用者的代碼即可。

創(chuàng)建一個spring boot項目用于服務(wù)調(diào)用,pom文件中增加Hystrix依賴如下:

<dependency
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

在啟動類上,加入熔斷器的注解@EnableCircuitBreaker

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class ConSumerApp {
    
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
    
    public static void main(String[] args) {
        new SpringApplicationBuilder(ConSumerApp.class)
        .web(true).run(args);
    }

}

創(chuàng)建一個服務(wù)類,用于編寫Hystrix命令。使用注解@HystrixCommand表明getMember方法是一個Hystrix命令

  1. fallbackMethod參數(shù)指名回退方法;
  2. commandProperties參數(shù)用來配置命令,本例中配置超時時間為1秒;
  3. threadPoolProperties參數(shù)用來配置線程池,本例中配置線程池并發(fā)數(shù)為2。
@Service
//@DefaultProperties(defaultFallback = "getMemberFallback")
public class MemberService {

    @Autowired
    private RestTemplate restTpl;

    @HystrixCommand(fallbackMethod = "getMemberFallback", 
            commandProperties = {
            @HystrixProperty(name = "execution.isolation
            .thread.timeoutInMilliseconds", value = "1000")
    }, threadPoolProperties = {
            @HystrixProperty(name = "coreSize", value = "2")
    })
    public Member getMember(Integer id) {
        try {
            Thread.sleep(2000);
        } catch (Exception e) {
            
        }
        
        Member member = restTpl.getForObject(
                "http://spring-hy-member/member/{id}", Member.class, id);
        return member;
    }

    public Member getMemberFallback(Integer id) {
        Member m = new Member();
        m.setId(1);
        m.setName("error member");
        return m;
    }
}

下面編寫測試類,由于設(shè)置超時時間為1秒,故會執(zhí)行回退方法。

@RestController
public class TestController {

    @Autowired
    private MemberService memberService;

    @RequestMapping(value = "/router", method = RequestMethod.GET, 
            produces = MediaType.APPLICATION_JSON_VALUE)
    public Member router() {
        return memberService.getMember(1);
    }

}

2 Hystrix 監(jiān)控

為服務(wù)調(diào)用者加入Actuator依賴,可以對服務(wù)調(diào)用者的健康情況進(jìn)行實時監(jiān)控。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>

然后新建一個監(jiān)控spring boot項目,pom文件內(nèi)容如下:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>
    </dependencies>

啟動類代碼如下:

@SpringBootApplication
@EnableHystrixDashboard
public class DashboardApp {

    public static void main(String[] args) {
        new SpringApplicationBuilder(DashboardApp.class).properties("server.port=8082").run(args);
    }

}

訪問項目地址:http://localhost:8082/hystrix,顯示監(jiān)控頁面

image.png

輸入要監(jiān)控的項目地址:http://localhost:8081/hystrix.stream,能夠看到該項目的命令調(diào)用情況。

image.png

第一排Circuit為熔斷器使用情況;第二排為線程池使用情況。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容