1、OpenFeign实现远程调用
1.1 services.pom引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2 在service-order微服务中新建feign.ProductFeignClient.java
package com.zhenbang.feign;
import com.zhenbang.product.bean.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("service-product") // feign客户端
public interface ProductFeignClient {
// MVC注解的两套使用逻辑
// 1、标注在Controller ,是接受这样的请求
// 2、标注在FeignClient,是发送这样的请求
@GetMapping("/product/{id}")
Product getProductById(@PathVariable("id") Long id);
}
- 这里需要说明
@FeignClient
注解的Value值是要调用的微服务名字 @GetMapping
请求,要调用的product-service
微服务的controller
函数,此处在controller中复制
1.3 注入以及调用
@Resource
ProductFeignClient productFeignClient;
Product productFromRemote = productFeignClient.getProductById(productId);
2、OpenFeign调用详细日志实现
3、OpenFeign超时控制
- 连接超时和读取超时
- 默认时间分别是 10s 和 60s
- 超时配置
4、OpenFeign重试机制
- 默认没有重试
- 可以设置重试(100ms,1s,5)
最大重复次数5次、如果相隔时间超过1s,不再重试,第2次是100ms,第三次是100ms*1.5
增加一个重试配置类
package com.zhenbang.config;
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RetryerConfig {
@Bean
Retryer retryer(){
return new Retryer.Default();// 这个放那三个参数
}
}
5、OepenFeign配置拦截器
以请求拦截器为例
5.1 请求拦截器java文件
java文件
package com.zhenbang.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import java.util.UUID;
/*拦截器使用的第二种方式*/
@Component
public class TokenRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
System.out.println("拦截器启动");
/*为这次请求头种添加token信息*/
// 主要是
requestTemplate.header("X-Token", UUID.randomUUID().toString());
}
}
5.2 拦截器配置使用
方法一:在yml文件中
方法二:拦截器加Component
组件
这里使用第2种方式
6、OpenFeign兜底返回Fallback
6.1 编写回调函数
6.2 ProductFeignClientFallback.java
package com.zhenbang.feign.fallback;
import java.math.BigDecimal;
import com.zhenbang.feign.ProductFeignClient;
import com.zhenbang.product.bean.Product;
@Component
public class ProductFeignClientFallback implements ProductFeignClient {
@Override
public Product getProductById(Long id) {
System.out.println("回调兜底");
Product product = new Product();
product.setId(id);
product.setPrice(new BigDecimal("0"));
product.setProductName("");
product.setNum(0);
return product; // 如果调用失败,就走回调这个逻辑,返回空值
}
}
6.3 service.pom引入Sentinel依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
6.4 yml开启Sentinel功能
- feign用Sentinel开启熔断功能