1. 程式人生 > >spring cloud (hystrix)請求斷網處理機制

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上面註冊,且不需要定時器完成此任務