Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
## 代码示例
1. 我们以blade-demo
中的服务为例,让我们的blade-desk
可以调用到blade-demo
的API
2. 在blade-demo-api
工程中创建一个新的package
, feign

3. 在package
,feign
下创建一个接口类,命名为BlogClient
4. 增加如下代码
~~~java
package org.springblade.demo.feign;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.tool.api.R;
import org.springblade.demo.entity.Blog;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(
//定义Feign指向的service-id
value = CommonConstant.APPLICATION_DEMO_NAME
)
public interface BlogClient{
/**
* 接口前缀
*/
String API_PREFIX = "/api/blog";
/**
* 获取详情
*
* @param id 主键
* @return
*/
@GetMapping(API_PREFIX + "/detail")
R detail(@RequestParam("id") Integer id);
}
5. 返回`blade-demo`,增加feign的实现类`BlogClientImpl`

6. 增加代码如下,因为Feign本质上是HTTP客户端,所以我们创建的`BlogClientImpl`其实就是`SpringMVC`的`Controller`,所以需要加上`@RestController`注解。
package org.springblade.demo.feign;
import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springblade.demo.entity.Blog;
import org.springblade.demo.service.BlogService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
public class BlogClientImpl implements BlogClient {
private BlogService service;
@Override
@GetMapping(API_PREFIX + "/detail")
public R detail(Integer id) {
return R.data(service.getById(id));
}
}
7. 在`blade-desk`模块的`pom.xml`文件引入`blade-demo`的API包

8. 找到`DashboardController`,新增如下代码
private BlogClient client;
@GetMapping("/blog-detail")
public R blogDetail(Integer id) {
R result = client.detail(id);
return result;
}
~~~
9. 启动blade-desk
并使用Postman调用查看API远程调用成功

10. 我们再来看下控制台日志,请求先到了/dashboard/blog-detail
,由于调用了Feign
,程序又根据Feign
的配置去查找名为blade-demo
的服务,并调用对应方法,最后返回了所需数据,整个流程非常清晰

Hystrix 熔断机制