一、首先我们来实现一个HystrixCommand,示例代码如下:
package com.example.demo.hystrix.command;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.example.demo.utils.ObjectMapperInstance;
import com.example.demo.vo.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixThreadPoolKey;
import lombok.Getter;
/**
* 只需要集成HystrixCommand即可,并覆写父类中的相应方法即可
* @author Administrator
*
*/
public class UserHystrixCommond extends HystrixCommand<User>{
@lombok.Setter @ Getter private String id;
public UserHystrixCommond(String id) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("UserCommandGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("userCommand"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("userGroup")));
this.id = id;
}
/**
* 覆写run方法,此处写业务逻辑
*/
@Override
protected User run() throws Exception {
System.out.println("command user: "+Thread.currentThread().getName()+" is running......");
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet("http://localhost:7901/user/"+id);
CloseableHttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity);
ObjectMapper mapper = ObjectMapperInstance.getInstance();
return mapper.readValue(body, User.class);
}
/**
* 服务降级方法,当调用服务发生异常时,会调用该降级方法
*/
@Override
protected User getFallback() {
System.out.println("进入fallback方法!");
User u = new User();
u.setUsername("刘先生");
u.setId(1l);
return u;
}
}
下面,我们通过代码来看下,如何在代码中进行Hystrix的配置。
Hystrix是用Setter静态类来实现配置的,Setter类源码如下:
final public static class Setter {