spring cloud (hystrix)请求断网处理机制

配置步骤:配备环境:

        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath />

        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.SR3</spring-cloud.version>

一、hystrix (feign)

1、配置pom文件:

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

注意这里feign所在服务必须要在eureka注册,才能监控断网生效

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

主要需要这些配置,具体更具需要再做配置添加;

2、application.yml 文件配置

feign:
  hystrix:
    enabled: true

eureka: 

client:
    serviceUrl:
      defaultZone: http://localhost:xxxx/eureka/

server:
  port: xxxx
  context-path: /
spring:
  application:
    name: hystrix-feign-server

主要需要这些配置,具体更具需要再做配置添加;

3、java文件:

启动类:

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class HystrixFeignServerApp {

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

}

//feign接口:

@FeignClient(value="hystrix-feign-server",fallback=HiHystrix.class)
public interface UserApi {

    @GetMapping("/hi")
    public String hi();
}

//断网处理类:

@Component
public class HiHystrix implements UserApi{

    @Override
    public String hi() {
        return "sorry Error!";
    }
}

//访问层

@RestController
public class FeignControll {    

    @Autowired
    private UserApi userApi;
    @GetMapping("/hi")
    public String sayHi() {
        return userApi.sayHi();
    }
}

二、hystrix(ribbon)

1、配置pom文件:
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>

2、application.yml 文件配置

server:
  port: xxxx
  context-path: /
spring:
  application:
    name: hystrix-ribbon-server

这里可以不用配置eurek

3、java文件:

启动类:

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ZipkinGetAwayServerApp {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinGetAwayServerApp.class, args);
    }
    
    @Bean
    public RestTemplate restTemplate() {
        
        return new RestTemplate();
    }

}

//访问层

@RestController
public class RibbonControll {

    @Autowired
    RestTemplate resttemplate;
    
    @HystrixCommand(fallbackMethod="hiError")
    @GetMapping("/sayHi")
    public String sayHi() {
        
        return resttemplate.getForObject("http://localhost:xxxx/hi", String.class);
    }
    //断网处理方法
    public String hiError() {
        
        return "HI_ERROR";
    }
}

UserServer服务

//访问层

@RestController
public class UserControll {    
    @GetMapping("/hi")
    public String sayHi() {
        return "Hi Joy!";
    }
}

个人总结:

feign和ribbon我们都知道是可以处理负载均衡机制,而且feign本身包含了ribbon,属于声明式http协议请求,因此一般都用feign,但是在一定条件下推荐用ribbon,比如说,服务A、B,A在启动时就请求B,但B此时还没启动,因此在A启动时就报错,因为A使用的是feign调用B,但此时B未启动,由于我用的是A的调用层实现了接口

ApplicationRunner,并且需要实现run方法,还有一种方式是
@PostConstruct注解在需要启动是调用B服务上面的方法,

因此,以上两种方式,均要保证方法不能跑出异常,如果有,则服务启动不了

为了,服务间的独立、健壮,使用ribbon,它可以独立启动不需要注册eureka上面单独启动项目,远程调用对应的服务,当被调用方断网或者是不能被正常调用时,则启动异常处理机制(熔断机制)

==============需要请求支援问题:(希望看到的大牛可以解惑,谢谢!)===============

http协议,或者说是spingcloud 有没有一种机制可以判断:

1、请求时判断网络异常(上面的博客方案可以解决)

2、不用定时器,实现网络正常时的监控(可以用eureka监听事件解决,但该功能服务不需要注册到eureka上)

3、满足以上两个条件,且不需要在eureka上面注册,且不需要定时器完成此任务

猜你喜欢

转载自blog.csdn.net/yang1076180972/article/details/82253751