springcloud容错服务保护springcloud hystrix

springcloud hystrix断路器的作用:

springcloud的一套远程调用的微服务架构,当架构中某个模块发生故障或是网络延迟的时候,有可能倒是系统发生异常。这时候,sprongcloud hystrix的作用就显示出来了,它会想调用方返回一个错误的相应,而不是长时间的等待,这样就不会是的线程因调用故障被长时间的等待,不释放。倒是异常。

代码:

1、首先引入hystrix的jar包。

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

ps:我是用的springboot的版本是2.0.6。springcloud的版本是Finchley.SR3。这两种可以兼容。有时候由于springboot与spring丑陋的版本兼容问题,可能导致运行报错。具体的springboot与springcloud的版本兼容问题,可以看我另一篇文章《springcloud项目jar包引用报错

2、在启动类上加上注解@EnableDiscoveryClient 和@EnableCircuitBreaker

@EnableDiscoveryClient :表示将本服务注册到服务中心eureka中,需配合application.properties或者yml文件。

@EnableCircuitBreaker:表示启动断路器功能。在远程调用的时候可以指定。

(ps:此时,启动类的注解已经有三个。@SpringBootApplication,@EnableDiscoveryClient ,@EnableCircuitBreaker。

他们可以用一个注解替换,@SpringCloudApplication,使用工具看@springcloud源码,他就是这几个注解组合而成)

3、配置文件application.properties

spring.application.name=ribbon-consumer
server.port=1113

eureka.client.service-url.defaultZone=http://peer1:8761/eureka/ 

4、编写代码。调用方ribbon-consummer。

控制器:

package com.springcloud.ribbonconsumer.controller;

import com.springcloud.ribbonconsumer.entity.User;
import com.springcloud.ribbonconsumer.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.net.InetAddress;

/**
 * @Author:sgchen
 * @Date:2019/8/7 14:22
 * @Description:
 */
@RestController
public class ConsumerController {
    @Autowired
    private HelloService helloService;

    @RequestMapping(value = "/ribbon-consummer",method = RequestMethod.GET)
    public String consummerHello(){
        return helloService.hello();
    }
}

service类的方法

package com.springcloud.ribbonconsumer.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.springcloud.ribbonconsumer.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

/**
 * @Author:sgchen
 * @Date:2019/8/8 15:48
 * @Description:
 */
@Service
public class HelloService {
    @Autowired
    private RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "error")//熔断机制,如果此方法发生错误,则调用error方法
    public String hello(){
        String str = restTemplate.getForObject("http://HELLO-SERVICE/hello", String.class);
        return str;
    }
    public String error(){
        return "error";
    }

}

5、启动服务

首先起送eureka服务器,(代码可查看文章《springcloud服务治理Eureka》)

然后启动eureka-client服务。(代码可查看文章《springcloud服务治理Eureka》)

最后启动调用方,ribbon-consummer,也就是上方编写的代码。

访问url:localhost:1113/ribbon-consummer,返回结果helll springcloud

然后,关闭eureka-client的服务,再访问url:localhost:1113/ribbon-consummer返回结果error

此时说明,断路器功能正常。当调用失败时,执行@HystrixCommand注解中配置的方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值