国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Hystrix命令入門使用

Maxiye / 2660人閱讀

摘要:主要介紹各接口和注解的使用方法。創(chuàng)建請(qǐng)求命令命令就是我們之前所說(shuō)的,他用來(lái)封裝具體的依賴服務(wù)調(diào)用邏輯。通過(guò)調(diào)用和可以返回對(duì)象,如下前者返回的是一個(gè),該命令會(huì)在調(diào)用的時(shí)候立即執(zhí)行,當(dāng)每次被訂閱的時(shí)候都會(huì)重放它的行為。表示使用執(zhí)行方式。

主要介紹Hystrix各接口和注解的使用方法。

創(chuàng)建請(qǐng)求命令

Hystrix命令就是我們之前所說(shuō)的HystrixCommand,他用來(lái)封裝具體的依賴服務(wù)調(diào)用邏輯。

繼承方式實(shí)現(xiàn)HystrixCommand

首先通過(guò)代碼實(shí)現(xiàn)HystrixCommand

package cn.sh.ribbon.command;

import cn.sh.common.entity.User;
import com.netflix.hystrix.HystrixCommand;
import org.springframework.web.client.RestTemplate;

/**
 * @author sh
 */
public class UserCommand extends HystrixCommand {

    private RestTemplate restTemplate;

    private Long id;

    public UserCommand(Setter setter, RestTemplate restTemplate, Long id) {
        super(setter);
        this.restTemplate = restTemplate;
        this.id = id;
    }
    
    @Override
    protected User run() throws Exception {
        return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id);
    }

}

通過(guò)上面實(shí)現(xiàn)的UserCommand,我們即可以實(shí)現(xiàn)請(qǐng)求的同步執(zhí)行也可以實(shí)現(xiàn)異步執(zhí)行,相關(guān)代碼如下:

package cn.sh.ribbon.service;

import cn.sh.common.entity.User;
import cn.sh.ribbon.command.UserCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * @author sh
 */
@Service
public class HelloService {

    private static final Logger logger = LoggerFactory.getLogger(HelloService.class);

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 第一種使用命令的方式
     * @param id
     * @return
     */
    public User getUserById(Long id) {
        HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("userKey");
        com.netflix.hystrix.HystrixCommand.Setter setter = com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(groupKey);
        UserCommand userCommand = new UserCommand(setter, restTemplate, id);
        // 同步執(zhí)行獲取結(jié)果
//        return userCommand.execute();
        // 異步執(zhí)行獲取結(jié)果
        Future future = userCommand.queue();
        try {
            return future.get();
        } catch (Exception e) {
            logger.info("獲取結(jié)果發(fā)生異常", e);
        }
        return null;
    }

}
注解方式使用HystrixCommand

通過(guò)HystrixCommand注解可以更優(yōu)雅的實(shí)現(xiàn)Hystrix命令的定義,如下:

package cn.sh.ribbon.service;

import cn.sh.common.entity.User;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @author sh
 */
@Service
public class HelloService {

    private static final Logger logger = LoggerFactory.getLogger(HelloService.class);

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 通過(guò)注解方式獲取User
     * @param id
     * @return
     */
    @HystrixCommand
    public User findUserById(Long id) {
        return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id);
    }
}

上述代碼雖然可以優(yōu)雅的實(shí)現(xiàn)Hystrix命令,但是上述獲取User的方式只是同步執(zhí)行的實(shí)現(xiàn),如果需要實(shí)現(xiàn)異步執(zhí)行則需要進(jìn)行如下改造:

package cn.sh.ribbon.service;

import cn.sh.common.entity.User;
import cn.sh.ribbon.command.UserCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.command.AsyncResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import rx.Observable;
import rx.Subscription;
import rx.functions.Action1;

import java.util.concurrent.Future;

/**
 * @author sh
 */
@Service
public class HelloService {

    private static final Logger logger = LoggerFactory.getLogger(HelloService.class);

    @Autowired
    private RestTemplate restTemplate;
    
    /**
     * 通過(guò)注解方式異步執(zhí)行獲取User
     * @param id
     * @return
     */
    @HystrixCommand
    public Future asyncFindUserFutureById(Long id) {
        return new AsyncResult() {
            @Override
            public User invoke() {
                return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id);
            }
        };
    }
}
響應(yīng)執(zhí)行

除了傳統(tǒng)的同步執(zhí)行與異步執(zhí)行之外,我們還可以將HystrixCommand通過(guò)Observable來(lái)實(shí)現(xiàn)響應(yīng)式執(zhí)行方式。通過(guò)調(diào)用observe()和toObservable()可以返回Observable對(duì)象, 如下:

Observable observe = userCommand.observe();
Observable observe = userCommand.toObservable();

前者返回的是一個(gè)Hot Observable,該命令會(huì)在observe調(diào)用的時(shí)候立即執(zhí)行,當(dāng)Observable每次被訂閱的時(shí)候都會(huì)重放它的行為。

后者返回的是一個(gè)Cold Observable,toObservable()執(zhí)行之后,命令不會(huì)被立即執(zhí)行,只有當(dāng)所有訂閱者都訂閱他之后才會(huì)執(zhí)行。

HystrixCommand具備了observe()和toObservable()的功能,但是它的實(shí)現(xiàn)有一定的局限性,它返回的Observable只能發(fā)射一次數(shù)據(jù),所以Hystrix提供了另外的一個(gè)特殊命令封裝HysrtixObservableCommand,通過(guò)命令可以發(fā)射多次的Observable

響應(yīng)執(zhí)行自定義命令

相關(guān)代碼如下:

package cn.sh.ribbon.command;

import cn.sh.common.entity.User;
import com.netflix.hystrix.HystrixObservableCommand;
import org.springframework.web.client.RestTemplate;
import rx.Observable;

/**
 * @author sh
 */
public class UserObservableCommand extends HystrixObservableCommand {

    private RestTemplate restTemplate;

    private Long id;

    public UserObservableCommand (Setter setter, RestTemplate restTemplate, Long id) {
        super(setter);
        this.restTemplate = restTemplate;
        this.id = id;
    }

    @Override
    protected Observable construct() {
        return Observable.create(subscriber -> {
            if (!subscriber.isUnsubscribed()) {
                User user = restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id);
                subscriber.onNext(user);
                subscriber.onCompleted();
            }
        });
    }
}
響應(yīng)執(zhí)行使用注解@HystrixCommand

相關(guān)代碼如下:

package cn.sh.ribbon.service;

import cn.sh.common.entity.User;
import cn.sh.ribbon.command.UserCommand;
import cn.sh.ribbon.command.UserObservableCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.command.AsyncResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;

/**
 * @author sh
 */
@Service
public class HelloService {

    private static final Logger logger = LoggerFactory.getLogger(HelloService.class);

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 使用注解實(shí)現(xiàn)響應(yīng)式命令
     * @param id
     * @return
     */
    @HystrixCommand
    public Observable observableGetUserId(Long id) {
        return Observable.create(subscriber -> {
            if (!subscriber.isUnsubscribed()) {
                User user = restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id);
                subscriber.onNext(user);
                subscriber.onCompleted();
            }
        });
    }

}

使用@HystrixCommand注解實(shí)現(xiàn)響應(yīng)式命令,可以通過(guò)observableExecutionMode參數(shù)來(lái)控制是使用observe()還是toObservable()的執(zhí)行方式。該參數(shù)有下面兩種設(shè)置方式:

@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER): EAGER是該參數(shù)的模式值,表示使用observe()執(zhí)行方式。

@HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY): 表示使用toObservable()執(zhí)行方式。

代碼地址

spring-cloud-example

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76981.html

相關(guān)文章

  • Spring Cloud Hystrix入門Hystrix命令原理分析

    摘要:系統(tǒng)需要支持命令的撤銷。第步計(jì)算斷路器的健康度會(huì)將成功失敗拒絕超時(shí)等信息報(bào)告給斷路器,斷路器會(huì)維護(hù)一組計(jì)數(shù)器來(lái)統(tǒng)計(jì)這些數(shù)據(jù)。第步,當(dāng)前命令的線程池請(qǐng)求隊(duì)列或者信號(hào)量被占滿的時(shí)候。 斷路由器模式 在分布式架構(gòu)中,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過(guò)斷路由器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)錯(cuò)誤響應(yīng),而不是長(zhǎng)時(shí)間的等待。這樣就不會(huì)使得線程因調(diào)用故障服務(wù)被長(zhǎng)時(shí)間占用不釋放,避免了故障...

    Betta 評(píng)論0 收藏0
  • Hystrix基礎(chǔ)入門和特性講解

    摘要:斷路器本身是一種開(kāi)關(guān)裝置,用于在電路上保護(hù)線路過(guò)載,當(dāng)線路中有電器發(fā)生短路時(shí),斷路器能夠及時(shí)的切斷故障電路,防止發(fā)生過(guò)載發(fā)熱甚至起火等嚴(yán)重后果。具備擁有回退機(jī)制和斷路器功能的線程和信號(hào)隔離,請(qǐng)求緩存和請(qǐng)求打包,以及監(jiān)控和配置等功能。 轉(zhuǎn)載請(qǐng)注明出處 http://www.paraller.com 代碼機(jī)制:熔斷 & Fallback & 資源隔離 熔斷 概念: 在微服務(wù)架構(gòu)中,我們將系...

    dkzwm 評(píng)論0 收藏0
  • 兩年了,我寫了這些干貨!

    摘要:開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請(qǐng)求前后端分離一使用完美處理權(quán)限問(wèn)題前后端分離二使用完美處理權(quán)限問(wèn)題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 評(píng)論0 收藏0
  • Hystrix使用

    1. Hystrix是誰(shuí)? Hystrix源于Netflix API團(tuán)隊(duì)在2011年啟動(dòng)的彈性工程工作,而目前它在Netflix每天處理著數(shù)百億的隔離線程以及數(shù)千億的隔離信號(hào)調(diào)用。該庫(kù)旨在通過(guò)控制那些訪問(wèn)遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫(kù)的節(jié)點(diǎn),從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。Hystrix具備擁有回退機(jī)制和斷路器功能的線程和信號(hào)隔離,請(qǐng)求緩存和請(qǐng)求打包,以及監(jiān)控和配置等功能。目前托管在github上...

    harryhappy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<