springboot-cloud-3-Hystrix

Hystrix

    开启 eureka-server 单机版注册中心
    开启eureka-client 注册hello服务
    开启eureka-client-slave 注册hello服务
    改造ribbon-consumer 加入hystrix 容错处理
pom
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>
apllication.properties
spring.application.name=hystric-master
server.port= 8002
eureka.client.serviceUrl.defaultZone=http://pear1:9998/eureka
application
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker  // 开启容错处理
public class HystricMasterApplication {

    @Bean
    @LoadBalanced     //负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(HystricMasterApplication.class, args);
    }
}
controller
@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate ;

    @Autowired
    private ConsumerService consumerService ;

    @RequestMapping("/consumerServer")
    public String consumerServer() {

        return  restTemplate.getForEntity("http://SERVER/helloworld?key=ygy",String.class).getBody();
    }

    @RequestMapping("/consumerClient")
    public String consumerClient() {

        return  consumerService.service();
    }
}
service
@Service("consumerService")
public class ConsumerService {

    @Autowired
    private RestTemplate restTemplate ;

    @HystrixCommand(fallbackMethod = "serviceFallBack")  //错误回调方法
    public String service() {
        return restTemplate.getForEntity("http://client/getClient?key=client", String.class).getBody();
    }

    public String serviceFallBack() {
        return " service is error ";
    }
}

hystix异步获取

eureka client
    //新增方法  睡眠五秒方便测试
    @GetMapping("/getClientDelay")
    public String getClientDelay() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("  this is eureka client asyn server");
        return " hello ,i am eureka client server asyn";
    }
hystrix service
  //异步获取
    @HystrixCommand
    public Future<String> serviceAsyn() {
        return  new AsyncResult<String>() {
            @Override
            public String invoke() {
                return  restTemplate.getForEntity("http://client/getClientDelay?key=client", String.class).getBody();
            }
        };
    }
    @HystrixCommand  //同步获取 用来比较异步获取
    public String serviceSyn() {
        return restTemplate.getForEntity("http://client/getClientDelay?key=client", String.class).getBody();
    }
hystrix controller
 @RequestMapping("/serviceSyn")  //同步调用
    public String serviceSyn() {
        Date date1=new Date();
        String str=consumerService.serviceSyn();
        Date date2=new Date();
        log.info(" data2 - date 1 = " + ConcurrentDateUtil.diffDate(date1, date2, ConcurrentDateUtil.Type.MILL));
        return str;
    }

    @RequestMapping("/serviceAsyn")   //异步调用
    public String serviceAsyn() {
        Date date1=new Date();
        Future<String> stringFuture=consumerService.serviceAsyn();
        Date date2=new Date();
        String key=null;
        try {
            key=stringFuture.get(4000, TimeUnit.MILLISECONDS);
            Date date3=new Date();
            log.info(" data2 - date 1 = " + ConcurrentDateUtil.diffDate(date1, date2, ConcurrentDateUtil.Type.MILL));
            log.info(" data3 - date 2 = " + ConcurrentDateUtil.diffDate(date2, date3, ConcurrentDateUtil.Type.MILL));

        } catch (Exception e) {
            log.error(" error ", e);
        }
        return key;
    }
输出
// 同步获取
2017-08-11 17:15:18.896  INFO 14540 --- [nio-8002-exec-1] test.ygy.ConsumerController              :  data2 - date 1 = 1180
//异步获取
2017-08-11 17:15:21.669  INFO 14540 --- [nio-8002-exec-2] test.ygy.ConsumerController              :  data2 - date 1 = 13
2017-08-11 17:15:21.669  INFO 14540 --- [nio-8002-exec-2] test.ygy.ConsumerController              :  data3 - date 2 = 515

继承实现

子类
/**
 * Created by guoyao on 2017/8/12.
 */
public class CustomerCommand extends HystrixCommand<String> {

    private RestTemplate restTemplate ;

    private String key ;

    private String url ;

    public CustomerCommand(RestTemplate restTemplate ,String url, String key) {
        this(HystrixCommandGroupKey.Factory.asKey("stringGroup"),restTemplate,url,key);
    }

    public CustomerCommand(HystrixCommandGroupKey groupKey , RestTemplate restTemplate,String url, String key) {
        super(groupKey);
        this.restTemplate = restTemplate ;
        this.url=url;
        this.key=key;
    }

    @Override    // 命令模式中真正的业务实现方法
    protected String run() throws Exception {
        return restTemplate.getForEntity(url + key, String.class).getBody();
    }

    @Override    //非注解的方法回调
    protected String getFallback() {
        return  null ;
    }
}
service
//自定义customerCommand 来实现容错机制  同步模式
    public String customerSyn(String key) {
        // return customerASyn(key).get();  
        CustomerCommand customerCommand=new CustomerCommand(restTemplate,"http://client/getClientDelay?key=", key);
        return  customerCommand.execute();
    }

    //自定义customerCommand 来实现容错机制   future模式
    public Future<String> customerASyn(String key) {
        CustomerCommand customerCommand=new CustomerCommand(restTemplate,"http://client/getClientDelay?key=", key);
        return  customerCommand.queue();
    }
controller
 @RequestMapping("/serviceSyn")  //同步调用
    public String serviceSyn(@RequestParam String key) {
        Date date1=new Date();
        //String str=consumerService.serviceSyn(key);
        String str=consumerService.customerSyn(key);
        Date date2=new Date();
        log.info(" data2 - date 1 = " + ConcurrentDateUtil.diffDate(date1, date2, ConcurrentDateUtil.Type.MILL));
        return str;
    }

    @RequestMapping("/serviceAsyn")   //异步调用
    public String serviceAsyn(@RequestParam String key) {
        Date date1=new Date();
        //Future<String> stringFuture=consumerService.serviceAsyn(key);
        Future<String> stringFuture=consumerService.customerASyn(key);
        Date date2=new Date();
        String value=null;
        try {
            value=stringFuture.get(4000, TimeUnit.MILLISECONDS);
            Date date3=new Date();
            log.info(" data2 - date 1 = " + ConcurrentDateUtil.diffDate(date1, date2, ConcurrentDateUtil.Type.MILL));
            log.info(" data3 - date 2 = " + ConcurrentDateUtil.diffDate(date2, date3, ConcurrentDateUtil.Type.MILL));

        } catch (Exception e) {
            log.error(" error ", e);
        }
        return value;
    }

observer订阅

自定义
// 事件命令
public class CustomerObserverCommand extends HystrixObservableCommand<String> {

    private RestTemplate restTemplate;

    private String key;

    private String url;

    public CustomerObserverCommand(RestTemplate restTemplate, String url, String key) {
        this(HystrixCommandGroupKey.Factory.asKey("stringGroup"), restTemplate, url, key);
    }

    public CustomerObserverCommand(HystrixCommandGroupKey groupKey, RestTemplate restTemplate, String url, String key) {
        super(groupKey);
        this.restTemplate=restTemplate;
        this.url=url;
        this.key=key;
    }

    @Override
    protected Observable<String> construct() {

        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    if(!subscriber.isUnsubscribed()){
                        String value =  restTemplate.getForEntity(url + key, String.class).getBody();
                        subscriber.onNext(value);   //订阅两次此事件
                        subscriber.onNext(value);
                        subscriber.onCompleted();
                    }
                } catch (Exception e) {
                    subscriber.onError(e);
                }

            }
        });

    }
}

// 事件订阅
public String observer(String key) {
        StringBuilder result=new StringBuilder();
        CustomerObserverCommand observerCommand = new CustomerObserverCommand(restTemplate,"http://client/getClient?key=", key);
        Observable<String> observer=observerCommand.observe();
        observer.subscribe(new Observer<String>(){
            @Override
            public void onCompleted() {
                log.info(" on completed");
            }

            @Override
            public void onError(Throwable e) {
                log.info(" on error ");
                e.printStackTrace();
            }

            @Override
            public void onNext(String s) {
                result.append(s);
                log.info(" on next :" + s );
            }
        });
        return result.toString();
    }

// 输出
2017-08-12 22:12:51.427  INFO 3268 --- [nio-8002-exec-3] test.ygy.ConsumerService                 :  on next : hello ,i am eureka client观察
2017-08-12 22:12:51.427  INFO 3268 --- [nio-8002-exec-3] test.ygy.ConsumerService                 :  on next : hello ,i am eureka client观察
2017-08-12 22:12:51.427  INFO 3268 --- [nio-8002-exec-3] test.ygy.ConsumerService                 :  on completed
基于注解
  public String observer(String key) {
        StringBuilder result=new StringBuilder();
        //CustomerObserverCommand observerCommand = new CustomerObserverCommand(restTemplate,"http://client/getClientDelay?key=", key);
        //return observerDo(observerCommand.observe(),result);
        return observerDo(observerAnnotion(key),result);

    }

    @HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER)
    public Observable<String> observerAnnotion(String key) {
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    if(!subscriber.isUnsubscribed()){
                        String value =  restTemplate.getForEntity( "http://client/getClientDelay?key="+ key, String.class).getBody();
                        subscriber.onNext(value);   //订阅两次此事件
                        subscriber.onNext(value);
                        subscriber.onCompleted();
                    }
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        });
    }

    public String observerDo(Observable<String> observer,StringBuilder result) {
        observer.subscribe(new Observer<String>(){
            @Override
            public void onCompleted() {
                log.info(" on completed");
            }

            @Override
            public void onError(Throwable e) {
                log.info(" on error ");
                e.printStackTrace();
            }

            @Override
            public void onNext(String s) {
                result.append(s);
                log.info(" on next :" + s );
            }
        });
        return result.toString();
    }

请求缓存(只有当前上下文环境)

service
 //使用request cache
    @CacheResult (cacheKeyMethod = "serviceSynCacheKey")
    @HystrixCommand (groupKey = "group",threadPoolKey = "poolKey")//同步获取 用来比较异步获取
    public String serviceSyn( String key) {
        log.info(Thread.currentThread().getName());
        return restTemplate.getForEntity("http://client/getClientDelay?key="+ key, String.class).getBody();
    }

    public String serviceSynCacheKey(String key) {
        return key ;
    }
controller
 @RequestMapping("/serviceSyn")  //同步调用
    public String serviceSyn(@RequestParam String key) {
        Date date1=new Date();
        String str=consumerService.serviceSyn(key);
        //String str=consumerService.customerSyn(key);
        Date date2=new Date();
        consumerService.serviceSyn(key);   //第二次调用检测cache
        Date date3=new Date();
        log.info(" data2 - date 1 = " + ConcurrentDateUtil.diffDate(date1, date2, ConcurrentDateUtil.Type.MILL));
        log.info(" data3 - date 2 = " + ConcurrentDateUtil.diffDate(date2, date3, ConcurrentDateUtil.Type.MILL));
        return str;
    }
webFilter
@WebFilter(filterName = "hystrixContextFilter",urlPatterns = "/*",asyncSupported = true)
public class HystrixFilter  implements Filter {

        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HystrixRequestContext context = HystrixRequestContext.initializeContext();
            try {
                chain.doFilter(request, response);
            } finally {
                context.shutdown();
            }
        }

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {

        }

        @Override
        public void destroy() {

        }
    }
输出
2017-08-13 16:05:51.486  INFO 10524 --- [strix-poolKey-1] test.ygy.ConsumerService                 : hystrix-poolKey-1
2017-08-13 16:05:51.994  INFO 10524 --- [nio-8002-exec-3] test.ygy.ConsumerController              :  data2 - date 1 = 522
2017-08-13 16:05:51.994  INFO 10524 --- [nio-8002-exec-3] test.ygy.ConsumerController              :  data3 - date 2 = 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值