溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Cloud中Hystrix緩存與合并請(qǐng)求的示例分析

發(fā)布時(shí)間:2021-12-24 10:26:29 來源:億速云 閱讀:164 作者:小新 欄目:云計(jì)算

小編給大家分享一下Spring Cloud中Hystrix緩存與合并請(qǐng)求的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

緩存與合并請(qǐng)求

緩存注解

        在6.3章節(jié)中,講述了Hystrix的緩存功能,在Spring Cloud中,同樣支持使用緩存,并且可以通過注解來實(shí)現(xiàn)。根據(jù)前面章節(jié)可知,緩存與合并請(qǐng)求功能,需要先初始化請(qǐng)求上下文才能實(shí)現(xiàn)。新建一個(gè)javax.servlet.Filter,用于創(chuàng)建與銷毀Hystrix的請(qǐng)求上下文,請(qǐng)見代碼清單6-9。

        代碼清單6-19:

        codes\06\6.4\spring-hystrix-invoker\src\main\java\org\crazyit\cloud\HystrixFilter.java

@WebFilter(urlPatterns = "/*", filterName = "hystrixFilter")
public class HystrixFilter implements Filter {

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

        編寫服務(wù)方法,使用@CacheResult注解進(jìn)行修飾,請(qǐng)見代碼清單6-20。

        代碼清單6-20:CacheService.java

@Component
public class CacheService {

    @CacheResult
    @HystrixCommand
    public Person getPerson(Integer id) {
        System.out.println("執(zhí)行 getPerson 方法");
        Person p = new Person();
        p.setId(id);
        p.setName("angus");
        return p;
    }
}

        注意服務(wù)方法中,被調(diào)用一次就會(huì)進(jìn)行一次控制臺(tái)輸出。在控制器的方法中,調(diào)用多次getPerson方法,控制器代碼請(qǐng)見代碼清單6-21。

        代碼清單6-21:

        codes\06\6.4\spring-hystrix-invoker\src\main\java\org\crazyit\cloud\InvokerController.java

    @RequestMapping(value = "/cache1/{personId}", method = RequestMethod.GET, 
            produces = MediaType.APPLICATION_JSON_VALUE)
    public Person testCacheResult(@PathVariable Integer personId) {
        // 調(diào)用多次服務(wù)
        for(int i = 0; i < 3; i++) {
            Person p = cacheService.getPerson(personId);
            System.out.println("控制器調(diào)用服務(wù) " + i);
        }
        return new Person();
    }

        控制器中調(diào)用了多次服務(wù)方法,也就是用戶發(fā)送請(qǐng)求后,會(huì)執(zhí)行多次服務(wù)方法,啟動(dòng)“服務(wù)調(diào)用者”,訪問以下地址:http://localhost:9000/cache1/1,控制臺(tái)輸出如下:

執(zhí)行 getPerson 方法
控制器調(diào)用服務(wù) 0
控制器調(diào)用服務(wù) 1
控制器調(diào)用服務(wù) 2

        根據(jù)輸出結(jié)果可知,在一次用戶請(qǐng)求的過程中,服務(wù)方法只執(zhí)行了一次,緩存生效。緩存的注解主要有以下3個(gè):

  • @CacheResult:該注解修飾方法,表示被修飾的方法返回結(jié)果將會(huì)被緩存,需要與@HystrixCommand一起使用。

  • @CacheRemove:用于修飾方法讓緩存失效,需要與@CacheResult的緩存key關(guān)聯(lián)。

  • @CacheKey:用于修飾方法參數(shù),表示該參數(shù)作為緩存的key。

        前面的例子使用了@CacheResult注解,下面的代碼片斷,結(jié)合@CacheResult與@CacheRemove一起使用:

    @CacheResult()
    @HystrixCommand(commandKey = "removeKey")
    public String cacheMethod(String name) {
        return "hello";
    }

    @CacheRemove(commandKey = "removeKey")
    @HystrixCommand
    public String updateMethod(String name) {
        return "update";
    }

        以上代碼片斷中的cacheMethod方法,使用的緩存key為“removeKey”,方法updateMethod被調(diào)用后,將會(huì)刪除key為“updateMethod”的緩存。關(guān)于3個(gè)緩存注解更深入的使用,本小節(jié)不再贅述,讀者可以自行測試。

合并請(qǐng)求注解

        在Spring Cloud中,同樣支持合并請(qǐng)求,在一次HTTP請(qǐng)求的過程中,收集一段時(shí)間內(nèi)的相同請(qǐng)求,放到一個(gè)批處理命令中執(zhí)行。實(shí)現(xiàn)合并請(qǐng)求,同樣需要先初始化請(qǐng)求上下文,具體請(qǐng)參見6.4.4中的Filter。接下來,編寫服務(wù)類,請(qǐng)見代碼清單6-22。

        代碼清單6-22:CollapseService.java

public class CollapseService {

    // 配置收集1秒內(nèi)的請(qǐng)求
    @HystrixCollapser(batchMethod = "getPersons", collapserProperties = 
        { 
            @HystrixProperty(name = "timerDelayInMilliseconds", value = "1000") 
        }
    )
    public Future<Person> getSinglePerson(Integer id) {
        System.out.println("執(zhí)行單個(gè)獲取的方法");
        return null;
    }

    @HystrixCommand
    public List<Person> getPersons(List<Integer> ids) {
        System.out.println("收集請(qǐng)求,參數(shù)數(shù)量:" + ids.size());
        List<Person> ps = new ArrayList<Person>();
        for (Integer id : ids) {
            Person p = new Person();
            p.setId(id);
            p.setName("crazyit");
            ps.add(p);
        }
        return ps;
    }
}

        代碼清單中,最后真實(shí)執(zhí)行的方法為“getPersons”,getSinglePerson方法使用了@HystrixCollapser注解來修飾,會(huì)收集1秒內(nèi)調(diào)用getSinglePerson的請(qǐng)求,放到getPersons方法中進(jìn)行批處理??刂破髦姓{(diào)用多次getSinglePerson方法,如代碼清單6-23所示。

        代碼清單6-23:

        codes\06\6.4\spring-hystrix-invoker\src\main\java\org\crazyit\cloud\InvokerController.java

    @RequestMapping(value = "/collapse", method = RequestMethod.GET, 
            produces = MediaType.APPLICATION_JSON_VALUE)
    public String testCollapse() throws Exception {
        // 連續(xù)執(zhí)行3次請(qǐng)求
        Future<Person> f1 = collapseService.getSinglePerson(1);
        Future<Person> f2 = collapseService.getSinglePerson(2);
        Future<Person> f3 = collapseService.getSinglePerson(3);
        Person p1 = f1.get();
        Person p2 = f2.get();
        Person p3 = f3.get();
        System.out.println(p1.getId() + "---" + p1.getName());
        System.out.println(p2.getId() + "---" + p2.getName());
        System.out.println(p3.getId() + "---" + p3.getName());        
        return "";
    }

        異步執(zhí)行了3次getSinglePerson方法,啟動(dòng)“服務(wù)調(diào)用者”,訪問以下地址:http://localhost:9000/collapse,控制臺(tái)輸出如下:

收集請(qǐng)求,參數(shù)數(shù)量:3
1---crazyit
2---crazyit
3---crazyit

        根據(jù)輸出結(jié)果可知,最終只執(zhí)行了getPersons方法。相對(duì)于直接使用Hystrix,Spring Cloud中合并請(qǐng)求較為簡單,合并處理器已經(jīng)由@HystrixCollapser注解幫我們實(shí)現(xiàn),我們僅關(guān)心真正命令的執(zhí)行即可。

以上是“Spring Cloud中Hystrix緩存與合并請(qǐng)求的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI