1.优先配置Openfeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
去启动类开启功能
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
声明本地的远程调用
package example.fegin;
import com.example.Product.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "service-product")//声明一个feign客户端
public interface ProductFeginClient {
@GetMapping("/product/{id}")
Product getProductById(@PathVariable("id") Long id);
}
对墨迹天气的远程调用
@FeignClient(value = "weather-client",url = "http://aliv18.data.moji.com")
public interface WeatherFeginClient {
@PostMapping("/whapi/json/alicityweather/condition")
String getWeather(@RequestHeader("Authorization") String auth,
@RequestParam("token") String token,
@RequestParam("cityId") String cityId);
}
测试类写法
@SpringBootTest
public class Weather {
@Autowired
WeatherFeginClient weatherFeginClient;
@Test
void test(){
String weather = weatherFeginClient.getWeather("APPCODE 93b7e19861a24c519a7548b17dc16d75",
"50b53ff8dd7d9fa320d3d3ca32cf8ed1",
"2182");
System.out.println(weather);
}
}
开启日志
logging:
level:
com.atguigu.order.feign: debug
配置类写入
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
超时控制
spring:
cloud:
openfeign:
client:
config:
default:
logger-level: full
connect-timeout: 1000
read-timeout: 2000
service-product:
logger-level: full
connect-timeout: 3000
read-timeout: 5000
重试机制
@Bean
Retryer retryer(){
return new Retryer.Default();
}
拦截器
请求拦截器
@Component
public class XTokenRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
System.out.println("启动拦截器");
template.header("X-Token", UUID.randomUUID().toString());
}
}
fallback - 兜底返回
- 引入 sentinel
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
- 开启熔断
feign: sentinel: enabled: true
- 编写 fallback 函数
@FeignClient(value = "service-product",fallback = ProductFeignClientFallback.class) // feign客户端 public interface ProductFeignClient { //mvc注解的两套使用逻辑 //1、标注在Controller上,是接受这样的请求 //2、标注在FeignClient上,是发送这样的请求 @GetMapping("/product/{id}") Product getProductById(@PathVariable("id") Long id); }
@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; } }