一. 什么是Feign?
-
Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。
-
伪RPC客户端(本质还是用http)
-
具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。
-
Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。
二. 使用Fegin
-
在pom.xml中添加依赖(新旧版本依赖名称不一样)下面是dalston版本
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
-
创建应用启动类
-
-
启动类增加@EnableFeignClients
-
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
-
增加一个接口 并在接口类上加上注解:@FeignClient(name="product-service")
/**
* 商品服务客户端
*/
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/api/v1/product/find")
String findById(@RequestParam(value = "id") int id);
}
//对比product-service中的Controller
//@RestController
//@RequestMapping("/api/v1/product")
//public class ProductController {
//
// @Value("${server.port}")
// private String port;
//
// @Autowired
// private ProductService productService;
//
// /**
// * 根据id查找商品详情
// * @param id
// * @return
// */
// @RequestMapping("find")
// public Object findById(int id){
//
// Product product = productService.findById(id);
//
// Product result = new Product();
// BeanUtils.copyProperties(product,result);
// result.setName( result.getName() + " data from port="+port );
// return result;
// }
//
//}
-
注意点:
-
路径
-
Http方法必须对应
-
使用requestBody,应该使用@PostMapping
-
多个参数的时候,通过@RequestParam("id") int id)方式调用
-
三. ribbon和Feign选择
-
选择feign的原因:
-
默认集成了ribbon
-
写起来更加思路清晰和方便
-
采用注解方式进行配置,配置熔断等方式方便
-
-
超时配置:
-
默认optons readtimeout是60,但是由于hystrix默认是1秒超时
-
application.yml中配置超时时间:
#修改调用超时时间
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
另:模拟接口响应慢,线程睡眠新的方式
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}