1.Controller添加timeout方法
package com.imooc.springcloud;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Controller {
@Autowired
private MyService myService;
@GetMapping("/fallback")
public String fallback(){
return myService.error();
}
@GetMapping("/timeout")
public String timeout(Integer timeout){
return myService.error();
myService.retry(timeout);
}
}
2.Fallback实现retry方法
package com.imooc.springcloud.hystrix;
import com.imooc.springcloud.Friend;
import com.imooc.springcloud.MyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Fallback implements MyService {
@Override
public String error() {
log.info("Fallback:I am not a back sheep any more");
return "Fallback:I am not a back sheep any more";
}
@Override
public String sayHi() {
return null;
}
@Override
public Friend sayHiPost(Friend friend) {
return null;
}
@Override
public String retry(int timeout) {
return "You are late !";
}
}
3.retry的服务提供者
package com.imooc.springcloud;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by 半仙.
*/
@RestController
@Slf4j
public class Controller implements IService {
@Value("${server.port}")
private String port;
@GetMapping("/sayHi2")
public String sayHi2() {
return "This is " + port;
}
@Override
public String sayHi() {
return "This is " + port;
}
@Override
public Friend sayHiPost(@RequestBody Friend friend) {
log.info("You are " + friend.getName());
friend.setPort(port);
return friend;
}
@Override
public String retry(@RequestParam(name = "timeout") int timeout) {
while (--timeout >= 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
log.info("retry " + port);
return port;
}
@Override
public String error() {
throw new RuntimeException("black sheep");
}
}
3.配置文件超时的配置
spring.application.name=hystrix-consumer
server.port=50000
spring.main.allow-bean-definition-overriding=true
eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/
# 开启Feign下面的Hystrix功能
feign.hystrix.enabled=true
# 是否开启服务降级
hystrix.command.default.fallback.enabled=true
#########################################超时配置##########################################################
# 全局超时
hystrix.command.default.execution.timeout.enabled=true
# 超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000
# 超时以后终止线程
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
# 取消的时候终止线程
hystrix.command.default.execution.isolation.thread.interruptOnFutureCancel=true
# hystrix.command.MyService#retry(int).execution.isolation.thread.timeoutInMilliseconds=3000
# 每台机器最大重试次数
feign-client.ribbon.MaxAutoRetries=0
# 可以再重试几台机器
feign-client.ribbon.MaxAutoRetriesNextServer=0
# 连接超时
feign-client.ribbon.ConnectTimeout=1000
# 业务处理超时
feign-client.ribbon.ReadTimeout=2000
# 在所有HTTP Method进行重试
feign-client.ribbon.OkToRetryOnAllOperations=false
4.在具体方法上配置配置hystrix 超时变量
配置文件里
MyService#retry(int):方法的签名
hystrix.command.MyService#retry(int).execution.isolation.thread.timeoutInMilliseconds=3000
5.方法的前面很复杂怎么办?
通过Feign.configKey工具来获取,通过反射方式?
System.out.println(Feign.configKey(MyService.class,
MyService.class.getMethod("retry", int.class)));
网友评论