目录:

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.测试

 

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