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