• springcloud费话之断路器(hystrix in feign)


    目录:

    springcloud费话之Eureka基础

    springcloud费话之Eureka集群

    springcloud费话之Eureka服务访问(restTemplate)

    springcloud费话之Eureka接口调用(feign)

    springcloud费话之断路器(hystrix in feign)

    springcloud费话之配置中心基础(SVN)

    springcloud费话之配置中心客户端(SVN)

    使用eureka服务发现实现服务器之间的http访问(feign)并添加断路器hystrix

    断路器,是springcloud中的一种熔断机制的实现方式

    熔断机制,是达到了某个异常以后,后续判断不进行,直接否定的一种方式,类似于&&或者||的熔断的感觉

    因为服务器之间的调用,判断错误链,以及出现问题以后的回调,时间可能会很长,如果不尽快阻止,

    很可能导致很多请求都等待几十秒的超时而造成服务器阻塞,进而造成服务器崩溃

    因此熔断机制十分重要

    在springcloud的熔断机制,叫做Spring Cloud Circuit Breaker

    具体使用的是hystrix断路器

    具体使用方式和流程如下

    1.依赖

    在springcloud官方网站中找到断路器()的依赖,如下图,并导入pom

    2.在启动类添加注解

    在启动类添加注解@EnableHystrix,添加后代码如下:

    package com.lyh.lyh_eureka_server;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    @EnableHystrix
    public class EurekaClientRun {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaClientRun.class, args);
        }
    
    }

    3.在请求方法上添加熔断注解,并指定熔断的方法,具体代码如下:

    熔断注解@HystrixCommand(fallbackMethod = "errorBreak"),其中的fallbackMethod为要调用的熔断的方法

    package com.lyh.lyh_eureka_server.controller;
    
    import java.net.URI;
    import java.net.URISyntaxException;
    
    import javax.annotation.Resource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import com.lyh.lyh_eureka_server.Interface.FeignService;
    import com.netflix.appinfo.InstanceInfo;
    import com.netflix.discovery.EurekaClient;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import com.netflix.ribbon.proxy.annotation.Hystrix;
    
    @RestController
    @EnableEurekaClient
    public class TestController {
    
        @Autowired
        private EurekaClient eurekaClient;
    
        @Resource
        private FeignService feignService;
    
        @RequestMapping("/getServerInfo")
        public Object getServerInfo() {
            // 通过eurekaClient访问服务器获取某个命名的集群。
            // getNextServerFromEureka的第一个参数是服务器名称,可重复
            // 因为获得的是下一个,所以是负载均衡的
            InstanceInfo nextServerFromEureka = eurekaClient.getNextServerFromEureka("eureka-client", false);
            System.out.println("name:" + nextServerFromEureka.getAppName() + " port:" + nextServerFromEureka.getPort());
            return nextServerFromEureka;
        }
    
        // 触发的接口
        @RequestMapping("/getInfoFromClient")
        @HystrixCommand(fallbackMethod = "errorBreak")
        public Object getInfoFromClient() throws URISyntaxException {
            InstanceInfo nextServerFromEureka = eurekaClient.getNextServerFromEureka("eureka-client", false);
            System.out.println("name:" + nextServerFromEureka.getAppName() + " port:" + nextServerFromEureka.getPort());
            RestTemplate restTemplate = new RestTemplate();
            String u = "http://" + nextServerFromEureka.getIPAddr() + ":" + nextServerFromEureka.getPort() + "/getInfo";
            URI uri = new URI(u);
            String obj = restTemplate.getForObject(uri, String.class);
            System.out.println(obj.toString());
            return obj;
        }
    
        // 接口访问的服务 添加熔断方法errorBreak
        @RequestMapping("/getInfo")
        @HystrixCommand(fallbackMethod = "errorBreak")
        public Object getInfo() {
            return "I am info from client 9020";
        }
    
        // 触发的接口 by feign 添加熔断方法errorBreak
        @RequestMapping("/getInfoFromClientByFeign")
        @HystrixCommand(fallbackMethod = "errorBreak")
        public Object getInfoFromClientByFeign() throws Exception {
            // 测试熔断效果
            // System.out.println(1/0);
            String obj = feignService.getInfo();
            System.out.println(obj.toString());
            return obj;
        }
    
        //hystrix熔断调用的方法
        public String errorBreak() {
            return "this is error break by hystrix";
        }
    
    }

    4.测试

    后端并没有报错,前端返回了该熔断效果

  • 相关阅读:
    B1001 害死人不偿命的(3n+1)猜想 (15 分)
    A1050 String Subtraction (20 分)
    A1041 Be Unique (20 分)
    B1047 编程团体赛 (20 分)
    B1043 输出PATest (20 分)
    B1042 字符统计 (20 分)
    B1038 统计同成绩学生 (20 分)
    VB计算符号
    vs2008写代码的时候不能输入中文,sogou和google输入法都没有用
    如何彻底关闭Windows7自动更新
  • 原文地址:https://www.cnblogs.com/liuyuhangCastle/p/11397265.html
Copyright © 2020-2023  润新知