【SpringCloud】第四篇:断路器(Hystrix)

前言:

必需学会SpringBoot基础知识

简介:

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。

工具:

JDK8

apache-maven-3.5.2

IntelliJ IDEA 2017.3 x64

 

一、断路器简介

Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的; 参考图片: http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients

简单来说: 在架构里面那个服务器挂了, 就会返回报错.

 

二、准备工作

本篇是基于第一篇为基础, 首先, 启动 eureka-server:8761 和 eureka-client 项目的dev:8762

 

三、在ribbon使用断路器

3.1 pom.xml 添加依赖

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

 

3.2 启动类追加@EnableHystrix注解开启Hystrix

package com.lwc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

/**
 * @author Eddie
 */
@EnableHystrix
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaRibbonApplication.class, args);
    }
}

 

3.3 Service改造, 追加功能

package com.lwc.service;

/**
 * @author eddie.lee
 * @Package com.lwc.service
 * @ClassName RibbonService
 * @description
 * @date created in 2018-03-26 19:55
 * @modified by
 */
public interface RibbonService {

    String ribbonService(String name);

    /**
     * Hystrix 熔断 返回错误信息
     */
    String hystrixError(String name);
}

 

package com.lwc.service.impl;

import com.lwc.service.RibbonService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @author eddie.lee
 * @Package com.lwc.service.impl
 * @ClassName RibbonServiceImpl
 * @description
 * @date created in 2018-03-26 19:57
 * @modified by
 */
@Service
public class RibbonServiceImpl implements RibbonService {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hystrixError")
    @Override
    public String ribbonService(String name) {
        final String url = "http://eureka-client/eureka/client?name=" + name;
        return restTemplate.getForObject(url, String.class);
    }

    @Override
    public String hystrixError(String name) {
        return "hi, " + name + " ,sorry, hystrix error!";
    }
}

3.4 浏览器查看 A:成功, B:失败  (先是启动相关服务, 请求一次地址, 然后在关闭client服务器, 在请求一次地址)

A:  http://localhost:8764/eureka/ribbon?name=eddie

hi eddie, i am from port:8762

 

B: http://localhost:8764/eureka/ribbon?name=eddie

hi, eddie ,sorry, hystrix error!

 

 

四、Feign中使用断路器

4.1 pom.xml添加依赖

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

 

4.2 *.yml添加开启断路器

如果是properties文件,请在文件中加入:

feign.hystrix.enabled=true

 

如果是yml文件,请在文件中加入:

feign:

   hystrix:   

       enabled: true

 

 

4.3 FeignClientService 改造, 添加 fallback 错误返回

package com.lwc.service;

import com.lwc.config.FeignClientServiceHystric;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author eddie.lee
 * @Package com.lwc.service
 * @ClassName FeignClientService
 * @description
 * @date created in 2018-03-27 10:43
 * @modified by
 */
@FeignClient(value = "eureka-client", fallback = FeignClientServiceHystric.class)
public interface FeignClientService {

    @GetMapping("/eureka/client")
    String feignToClientByName(@RequestParam("name") String name);

}

 

package com.lwc.config;

import com.lwc.service.FeignClientService;
import org.springframework.stereotype.Component;

/**
 * @author eddie.lee
 * @Package com.lwc.config
 * @ClassName FeignClientServiceHystric
 * @description
 * @date created in 2018-03-27 15:21
 * @modified by
 */
@Component
public class FeignClientServiceHystric implements FeignClientService {

    @Override
    public String feignToClientByName(String name) {
        return "Hystric Error, Sorry " + name;
    }

}

 

4.4 浏览器查看 A:成功, B:失败  (先是启动相关服务, 请求一次地址, 然后在关闭client服务器, 在请求一次地址)

A:  http://localhost:8765/eureka/feign?name=eddie

hi eddie, i am from port:8762

 

B: http://localhost:8765/eureka/feign?name=eddie

Hystric Error, Sorry eddie

 

 

 

五、Hystrix Dashboard (断路器:Hystrix 仪表盘)

eureka-ribbon 或者 eureka-feign 改造, 添加仪表盘

5.1 pom.xml添加依赖

<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>

 

5.2 启动类添加注解

@EnableHystrix
@EnableHystrixDashboard

 

5.3 浏览器查看

地址: http://localhost:8765/hystrix.stream

输入: http://localhost:8765/hystrix.stream

Title:{name}

测试: 请求 http://localhost:8765/eureka/feign?name=eddie 就会在仪表盘出现对应数据, 比如次数

 

5.4 错误

提示: Unable to connect to Command Metric Stream.

解决: 查看是否缺少依赖,或者注解

 

六、参考资料

eureka-feign
http://localhost:8765/eureka/feign?name=eddie

eureka-ribbon
http://localhost:8764/eureka/ribbon?name=eddie


标签

4-1, 4-2

源码下载
https://github.com/eddie-code/SpringCloudDemo#springclouddemo

posted @ 2018-03-27 15:04  Eddie.Lee  阅读(680)  评论(0编辑  收藏  举报