SpringCloud之Hystrix(五)

Hystrix

​ hystrix简单来说就是服务器错,服务器不会应为出错而消耗性能,而是调用预备的方法。也就是说服务器出错会掉用备案方法,不直接把错误放回客户端。

服务断融(服务提供者)

​ 简单来说就是服务提供者出现错误,我们就在服务提供者端处理。也就是说需要在服务提供者者端配置Hystrix

服务提供(7003)配置如下:

依赖
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-hystrix</artifactId>
       <version>1.4.6.RELEASE</version>
  </dependency>

记得eureka配置,这里就不写了。

主启动类

开启hystrix

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@EnableCircuitBreaker //添加对熔断的支持
public class SpringcxloudProvide7003Application {

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

}
contrllor
@RestController
public class TagController {
    @RequestMapping("getname")
    @HystrixCommand(fallbackMethod = "getNamee")
    public String  getName(@RequestParam("name")String name) {
        System.out.println("springcloud_provide_7003 ----getName---被调用了 name is" + name);
        if (!name.equals("admin")) {
            int i = 1 / 0;
            throw new RuntimeException("出差从");
        }
        return name;
    }
    public String  getNamee(@RequestParam("name")String name) {
        return name+"出错了";
    }
}

配置一个服务提供者(7004),我们不是用hystrix,就一个很普通的提供者,主要用于分别hystrix是怎么回事!!!!

@RestController
public class TagController {
    @RequestMapping("getname")
    public String getName(@RequestParam("name")String name){
        System.out.println("springcloud_provide_7004 ----getName---被调用了 name is"+name);
        return name;
    }
}
服务消费者

我们使用了feig方式来远程调用服务提供者。

@RestController
public class TagController {
    @Autowired
    TagService tagService=null;
    @RequestMapping("getname")
    public String getName(@RequestParam("name")String name){
        System.out.println(name);
        return tagService.getName(name);
    }
}

测试:

开一个eureka服务端,开两服务提供者(7003有hystrix、7004)、一个服务消费者。

走了7003服务提供者(有Hystrix),我们子在7003中设置了放回方法

在这里插入图片描述

走了7004服务消费

在这里插入图片描述

在这里插入图片描述

服务降级(服务消费者)

​ 服务降级在我们生活中有许多的实例,比如在每年的双十一的时候,淘宝会把退款业务关闭。淘宝关闭退款业务这个操作就是服务降级,当然啦我们也可以做这样的操作,而且特别简单。

​ 简单来说服务降级是服务消费者找不到服务提供者,服务消费者告诉用户服务不可用,而不会把报错信息直接返回用户。

1、搭建服务降级

​ 服务降级是在Feign的基础上实现的,所以我们的客户端必须支持feign。

2、公共模块

我们之前在搭建feign项目是已经创建了一个公共的模块接口,我们在原来是基础添加fallbackFactory属性,指定返回方法的类

@Component
@FeignClient(value = "springcloudeprovides",fallbackFactory=TagFallbackFactory.class)
public interface TagService {
    @RequestMapping("getname")
    public String getName(@RequestParam("name")String name);
}

编写子类并实现FallbackFactory接口及其create方法,这个方法返回我们的自定义接口的实现类(这里用了匿名内部类)

@Component
public class TagFallbackFactory implements FallbackFactory {
    @Override
    public TagService create(Throwable throwable) {
        return new TagService() {
            @Override
            public String getName(@RequestParam("name")String name){;
                return "服务器当前不可用,请重试";
            }

        };
    }
}

依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3、服务消费

依赖(只要eureka与feign的依赖及其公共模块)

<!--公共模块依赖--> 
<dependency>
    <groupId>com.example</groupId>
    <artifactId>springcloud-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
<!--eureka-client模块依赖--> 
<dependency>
    <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--openfeign模块依赖--> 
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

配置文件

server:
  port: 8003
eureka:
  client:
    service-url:
      defaultZone: http://localhost:6998/eureka/,http://localhost:6999/eureka/
    register-with-eureka: false
# 开启服务降级
feign:
  hystrix:
    enabled: true

主启动类

下面注解缺一不可。

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.example.springcloudapi"})//公共模块的包,没有这个注解找不到公共模块的类
@ComponentScan("com.example")//这个最好是项目与公共模块目录相同的包,没有这个报No fallbackFactory这个错误
public class SpringcloudConsumeHystrix8003Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringcloudConsumeHystrix8003Application.class, args);
    }

}
4、controller
@RestController
public class TagControllerhystrix {
        @Autowired
        TagService tagService=null;
        @RequestMapping("getname")
        public String getName(@RequestParam("name")String name){
            System.out.println(name);
            return tagService.getName(name);
        }
}
5、测试

我们之启动我们这个服务,其他的都不启动。故意自造服务器关闭效果。根据结果可看到页面没有报错信心,而是执行了备用的方法。
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值