一、首先,项目中需要引入Feign需要的jar包
<!-- feigin http rpc -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
二、Feign对外的接口,也就是客户端
其中,configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
contextId 是因为多个Feign的情况下,用来区分服务的,比如value一直,通过contextId区分
@FeignClient(value = "fang-order",contextId = "orderUser",path = "/orderFeign",configuration = FeignExceptionConfig.class)
public interface OrderFeginClient {
@PostMapping("/order/getOrderInfo")
OrderUserDto getOrderInfo(@RequestBody OrderInfoParm parm);
}
-
首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。
-
@FeignClient
,声明这是一个Feign客户端,通过value
属性指定服务名称,path指定路径 -
•接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果
三、Feign接口的容错处理,在这个里面处理如果feign调用失败,需要返回的结果
@Component
@Slf4j
public class OrderFeginFallback implements OrderFeginClient{
@Override
public OrderUserDto getOrderInfo(OrderInfoParm parm) {
OrderUserDto orderUserDto = new OrderUserDto();
log.info("feign调用 order 出错了 返回 null ");
return orderUserDto;
}
}
FeignClient注解的一些属性
四、调用Feign的接口入口
五、controller的调用
1、Feign报错:Consider defining a bean of type 'com.order.orderApiFeign' in your configuration.
这个是因为在启动类上面没有添加 @EnableFeignClients 注解导致的,加上这个注解就可以解决问题了。开启Feign功能
2、springcloud服务间的feign调用报错exception is feign.RetryableException: Read timed out executing POST http://。。。。
明显可以看到是http请求报错超时,feign的调用分两层,ribbon的调用和hystrix的调用,高版本的hystrix默认是关闭的,所以在bootstrap.yml配置文件中设置相关的配置即可
ribbon:
ServerListRefreshInterval: 10 #刷新服务列表源的间隔时间
OkToRetryOnAllOperations: true
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 1
ReadTimeout: 16000
ConnectTimeout: 16000