SpringCloud教程(Finchley版本)-06:断路器(Hystrix-Feign)

举报
IT云清 发表于 2019/01/23 19:57:34 2019/01/23
【摘要】 本文介绍如何结合上一文SpringCloud教程(Finchley版本)-05:负载均衡(Feign),使用Hystrix来实现熔断功能。

##### 在微服务系统中,我们把系统拆分成了很多小的服务,各个服务之间通过不同的方式进行依赖和调用,为了保证服务的高可用性,单个服务通常会集群部署,此时,许多服务由于各种问题可能会调用失败,比如超时、异常等。如何能够保证在一个依赖出问题的情况下,不会出现故障传播,导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。


##### 本文介绍如何结合上一文[SpringCloud教程(Finchley版本)-05:负载均衡(Feign)](https://blog.csdn.net/weixin_39800144/article/details/84960372),使用Hystrix来实现熔断功能。主要分为以下几个步骤:


- 1.创建项目

- 2.引入依赖

- 3.修改配置文件

- 4.添加启动注解

- 5.跨服务调用

- 6.熔断实现

- 7.启动项目,测试 

 

### 1.创建项目

新建一个Springboot项目feign_server1。

### 2.引入依赖


```

<!--eureka-client-->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>


<!--feign-->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-openfeign</artifactId>

</dependency>

```


```

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>${spring-cloud.version}</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

```


```

<spring-cloud.version>Finchley.SR2</spring-cloud.version>

```


### 3.修改配置文件


```

server:

  port: 8015

spring:

  application:

    name: feign-server1

eureka:

  client:

    service-url:

      default: http://localhost:8761/eureka/

feign:

  hystrix:

    enabled: true


```


### 4.添加启动注解

启动类添加@EnableFeignClients,开启Feign的负载均衡功能

```

//开启Feign的负载均衡功能

@EnableFeignClients

@EnableEurekaClient

@SpringBootApplication

public class FeignServer1Application {


public static void main(String[] args) {

SpringApplication.run(FeignServer1Application.class, args);

}

}

```


### 5.跨服务调用

写个简单的接口方法来调用。

#### 5.1controller


```

@RestController

//@RequestMapping(value = "feign")

public class FeignController {


  //编译报错,可以不用管,程序启动时才会注入此bean

  @Autowired

  FeignService feignService;


  @GetMapping("getCompany")

  public String getCompany(String id){

    String company = feignService.getCompany(id);

    System.out.println(company);

    return company;

  }

}

```


#### 5.2service

通过@FeignClient来指定我们调用哪个服务,前面启动了两个服务,都为company-server,feign会通过服务名来调用服务。

```

//通过此注解,来指定调用哪个服务

@FeignClient(value = "company-server")

public interface FeignService {


  /**调用company-server服务中的company/get接口*/

  @GetMapping(value = "/company/get")

  String getCompany(@RequestParam(value = "id")String id);

}

```

### 6.熔断实现

Feign中实现熔断功能非常简单,只需要在上面的@FeignClient中指定fallback的实现即可,然后在接口的实现类中添加熔断逻辑。

#### 6.1service 

只是在上面5.2中做了简单的修改


```

//通过此注解,来指定调用哪个服务

//如果开启了断路器,只需要添加fallback,在此接口实现类中添加熔断方法即可

@FeignClient(value = "company-server",fallback = FeignServiceImpl.class)

public interface FeignService {


  /**调用company-server服务中的company/get接口*/

  @GetMapping(value = "/company/get")

  String getCompany(@RequestParam(value = "id")String id);

}


```

#### 6.2serviceImpl

添加断路器的实现逻辑,实现熔断方法。


```

@Component

public class FeignServiceImpl implements FeignService{


  //熔断方法

  @Override

  public String getCompany(String id) {

    return "服务出错,返回指定企业信息:华为"+id;

  }

}

```


### 7.启动项目,测试 


启动项目,然后访问接口http://localhost:8015/getCompany?id=36,可以看到服务会自动负载到两台服务上。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195801510.png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195814614.png)


如果挂掉8011服务,可以看到访问结果如下:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195825748.png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195837421.png)


下一篇:[SpringCloud教程(Finchley版本)-07:网关(zuul)](https://blog.csdn.net/weixin_39800144/article/details/85012374)

完整源码参考:https://github.com/myJava4all/springcloudfinchley


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。