1. 程式人生 > 其它 >springboot與resilience4j整合

springboot與resilience4j整合

原創轉載請註明出處:https://www.cnblogs.com/agilestyle/p/15166657.html

package com.test.resilience4j.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

/**
* springboot與resilience4j整合
*
* <dependency>
* <groupId>io.github.resilience4j</groupId>
* <artifactId>resilience4j-spring-boot2</artifactId>
* <version>1.7.1</version>
* </dependency>
*
*
* 需注意的地方:
* 1、name = "cp-auth-web" 和resilience4j.circuitbreaker.instances.cp-auth-web.base-confi須一致
* 2、@RequestMapping請求方法和fallbackMethod方法的引數須一致
* 3、不能try...catch...捕獲異常
* @author nanfengxiangbei
* @date 2021-11-12
*/
@RequestMapping("/content")
@RestController
public class OttContentFallBackController {
private static final Logger logger = LoggerFactory.getLogger(OttContentFallBackController.class);
private static final Logger mockLog = LoggerFactory.getLogger("OttContentMockController");

@Reference
private IServiceProduct productService;

@Reference(check = false, mock = "true")
private IUnityAuthService unityAuthService;


@RequestMapping(value = "/fallback")
@CrossOrigin(origins = "*")
@CircuitBreaker(name = "cp-auth-web", fallbackMethod = "fallbackTest")
public String fallBack(@RequestBody OttProductContentReqVo reqVo, HttpServletRequest request, HttpServletResponse response) {

OttContentRespVo respVo = new OttContentRespVo("cp同步內容到hd成功", "000");
logger.debug("fallbackTest請求開始" + JSON.toJSONString(reqVo));

ServiceProduct serviceProduct = productService.getServiceProductByProductCode(reqVo.getProductID());
logger.debug("獲取產品資訊:" + JSON.toJSONString(serviceProduct));

UnityAuth dorisDemo = new UnityAuth();
dorisDemo.setContentId(reqVo.getContentID());
dorisDemo.setProductCode(serviceProduct.getProductCode());
dorisDemo.setCreateTime(new Date());
dorisDemo.setRouteId(System.currentTimeMillis());
dorisDemo.setAccount("136870000000");
dorisDemo.setAllPass(0);
dorisDemo.setResult(0);
dorisDemo.setRouteEnd(System.currentTimeMillis());
dorisDemo.setRequestBody(JSON.toJSONString(dorisDemo));

// 呼叫服務降級dubbo
String message = unityAuthService.add(dorisDemo);
if (!StringUtils.isEmpty(message)) {
mockLog.error(message);
}
return JSONObject.toJSONString(respVo);
}

/**
* 當請求發生異常時,fallbackMethod裡指定呼叫此方法
*
* @param reqVo 請求引數
* @param request 請求引數
* @param response 響應引數
* @param e 異常
* @return 響應訊息
*/
private String fallbackTest(@RequestBody OttProductContentReqVo reqVo,
HttpServletRequest request,
HttpServletResponse response,
RuntimeException e) {
mockLog.error("resilience4j invoked with operation: " + reqVo.getAction() + ", \nexception:" + e);
OttContentRespVo respVo = new OttContentRespVo("cp同步內容到hd成功", "000");
return JSONObject.toJSONString(respVo);
}
}
知人者智,自知者明,勝人者有力,自勝者強。