介绍
- Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。
- Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。
配置
pom.xml
<!--fegin组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类
- 在启动类上添加此注解: @EnableFeignClients
application.yml
- 超时配置 , 默认是请求接口一秒未有响应则超时失效,这里演示改为5秒
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
- 重试次数配置,配置在调用者服务上,这里配置要写被调用者服务的名
- MaxAutoRetrie 代表请求若超时失效后,重试的次数
- MaxAutoRetriesNextServer 代表请求超时失效后,重试次数完了后,则请求其他的节点的最大值节点数量
product-service: # 调用的提供者的名称
ribbon:
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 0
定义接口
- 被调用方(端口8081,名为
product-service
演示)的控制器
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9a1e9d78504e298a5c3f41df3479e20f.png)
- 在调用方(端口8091演示)新建包存放feign远程调用api的接口
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/74a103cf4d3ee432aa2870dd18cb7d72.png)
@FeignClient(name = "product-service")
public interface ProductFeignApi {
@RequestMapping("/product/{pid}")
public Product findByPid(@PathVariable("pid") Long pid);
}
- feign调用远程服务接口原理:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c90bbbc31d696f46120794956c827b4e.png)
案例演示
业务方法演示
- 直接注入fegin远程调用的接口
ProductFeignApi
即可使用其服务的接口
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private ProductFeignApi productFeignApi;
@Override
public Order createOrder(Long productId, Long userId) {
Product product = productFeignApi.get(productId);
Order order = new Order();
order.setUid(userId);
order.setUsername("edt");
order.setPid(productId);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
order.setNumber(1);
return order;
}
}
控制器演示
- 调用方的控制器接口,业务层方法调用了另一个服务的接口
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/537c704da2876b65bf40e833fd4ee601.png)