小編給大家分享一下Spring Cloud中Hystrix緩存與合并請求的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
10年積累的成都網(wǎng)站制作、網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有磁縣免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
在6.3章節(jié)中,講述了Hystrix的緩存功能,在Spring Cloud中,同樣支持使用緩存,并且可以通過注解來實現(xiàn)。根據(jù)前面章節(jié)可知,緩存與合并請求功能,需要先初始化請求上下文才能實現(xiàn)。新建一個javax.servlet.Filter,用于創(chuàng)建與銷毀Hystrix的請求上下文,請見代碼清單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注解進行修飾,請見代碼清單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)用一次就會進行一次控制臺輸出。在控制器的方法中,調(diào)用多次getPerson方法,控制器代碼請見代碼清單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ā)送請求后,會執(zhí)行多次服務(wù)方法,啟動“服務(wù)調(diào)用者”,訪問以下地址:http://localhost:9000/cache1/1,控制臺輸出如下:
執(zhí)行 getPerson 方法 控制器調(diào)用服務(wù) 0 控制器調(diào)用服務(wù) 1 控制器調(diào)用服務(wù) 2
根據(jù)輸出結(jié)果可知,在一次用戶請求的過程中,服務(wù)方法只執(zhí)行了一次,緩存生效。緩存的注解主要有以下3個:
@CacheResult:該注解修飾方法,表示被修飾的方法返回結(jié)果將會被緩存,需要與@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)用后,將會刪除key為“updateMethod”的緩存。關(guān)于3個緩存注解更深入的使用,本小節(jié)不再贅述,讀者可以自行測試。
在Spring Cloud中,同樣支持合并請求,在一次HTTP請求的過程中,收集一段時間內(nèi)的相同請求,放到一個批處理命令中執(zhí)行。實現(xiàn)合并請求,同樣需要先初始化請求上下文,具體請參見6.4.4中的Filter。接下來,編寫服務(wù)類,請見代碼清單6-22。
代碼清單6-22:CollapseService.java
public class CollapseService { // 配置收集1秒內(nèi)的請求 @HystrixCollapser(batchMethod = "getPersons", collapserProperties = { @HystrixProperty(name = "timerDelayInMilliseconds", value = "1000") } ) public Future<Person> getSinglePerson(Integer id) { System.out.println("執(zhí)行單個獲取的方法"); return null; } @HystrixCommand public List<Person> getPersons(List<Integer> ids) { System.out.println("收集請求,參數(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; } }
代碼清單中,最后真實執(zhí)行的方法為“getPersons”,getSinglePerson方法使用了@HystrixCollapser注解來修飾,會收集1秒內(nèi)調(diào)用getSinglePerson的請求,放到getPersons方法中進行批處理。控制器中調(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次請求 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方法,啟動“服務(wù)調(diào)用者”,訪問以下地址:http://localhost:9000/collapse,控制臺輸出如下:
收集請求,參數(shù)數(shù)量:3 1---crazyit 2---crazyit 3---crazyit
根據(jù)輸出結(jié)果可知,最終只執(zhí)行了getPersons方法。相對于直接使用Hystrix,Spring Cloud中合并請求較為簡單,合并處理器已經(jīng)由@HystrixCollapser注解幫我們實現(xiàn),我們僅關(guān)心真正命令的執(zhí)行即可。
以上是“Spring Cloud中Hystrix緩存與合并請求的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章題目:SpringCloud中Hystrix緩存與合并請求的示例分析
分享路徑:http://vcdvsql.cn/article4/iigooe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、企業(yè)網(wǎng)站制作、面包屑導(dǎo)航、響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)