使用
一. pom.xml 依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
二. yaml 配置
feign:
sentinel:
enabled: true # 激活 sentinel 对 feign 的支持
client:
config:
default:
loggerLevel: FULL # 日志级别
connectTimeout: 5000
readTimeout: 10000
三. java 类
- NacosProviderApplication
/**
* @author: lvvsx
* @date: 2022/6/20
* @description: Nacos 主启动类
*/
@SpringBootApplication
//@EnableDiscoveryClient // nacos注册 与OpenFeign 无关
@EnableFeignClients
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
- BillFeignService
/**
* @author:
* @date: 2022/7/11
* @description:
*/
@FeignClient(
value = "bill", // 对应的微服务名称
path = "/bills/daily", // 微服务路径
fallback = BillFallbackService.class // 异常兜底服务(主要用于微服务之间调用失败或者超时的时候的一个兜底策略)
)
public interface BillFeignService {
@PostMapping("/find")
public BasicResultVO<BillsDaily> selectBillsDailyByIdOrCode(@RequestBody BillsDailyAndUserVO billsDailyAndUser);
}
- BillFallbackService
/**
* @author: lvvsx
* @date: 2022/7/11
* @description:
*/
@Component
public class BillFallbackService implements BillFeignService {
@Override
public BasicResultVO<BillsDaily> selectBillsDailyByIdOrCode(BillsDailyAndUserVO billsDailyAndUser) {
//服务降级访问 兜底策略, 访问微服务失败才会访问这个service
return new BasicResultVO<>(BasicResponseEnum.INVALID_PARAM);
}
}
- TestController
/**
* @author: lvvsx
* @date: 2022/6/20
* @description:
*/
@RequestMapping("/config")
@RefreshScope
@RestController
public class TestController {
//OpenFeign
@Resource
private BillFeignService billFeignService;
@RequestMapping("/get2")
public BasicResultVO<BillsDaily> get2() {
BillsDailyAndUserVO billsDailyAndUserVO = new BillsDailyAndUserVO();
billsDailyAndUserVO.setBillsDailyId(243624017394315264L);
billsDailyAndUserVO.setUserId(1001001L);
return billFeignService.selectBillsDailyByIdOrCode(billsDailyAndUserVO);
}
}
四. 正常的访问结果
启动微服务并访问接口: http://localhost:9001/config/get2
- 响应成功:
- 异常兜底(访问微服务失败, 执行 BillFeignService 的兜底方法)
- 注: 这里的异常是我自己随便响应的结果.
五. 注意事项
- 一般情况下, 对于微服务, 都是会对各个微服务设置一个统一的响应类(比如: BasicResultVO), 方便一个统一的响应格式.
- OpenFeign 在使用的时候, 如果 BasicResultVO 这个类不存在无参构造(有参构造覆盖了无参构造). 那么, A服务调用 B服务的时候, 会报 ** cannot deserialize from Object value (no delegate- or property-based Creator**无法序列化异常.
- 导致的一个现象是, A服务调用了B服务, B服务也被请求了, 但是A服务一直 响应的是兜底的异常结果.