Feign 简介:
Feign是一个声明式的客户端,让调用web服务更加简单,只需要创建接口和添加注解就可以使用它。支持可插拔的注解、Feign的注解、JAX-RS注解、可插拔的编码器、解码器。SpringCloud 添加了Spring MVC 的注解支持和 HttpMessageConverters, 同时也整合了Eureka、Ribbon。
个人学习总结:
链接:【springboot、springcloud、docker 等,学习目录】
需求:在用户微服务中调用文章微服务。
Feign 的使用:
1、新建springcloud_user_feign 模块:
此处我复制 springcloud_user 模块改名、然后更改相关父子 pom,导入工程。
2、pom 依赖:
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3、启动类(添加@EnableFeignClients):
/**
* @Auther: xf
* @Date: 2018/12/23 10:24
* @Description: feign
*/
// 开启 feign支持
@EnableFeignClients
@EnableDiscoveryClient
@MapperScan("com.coolron.user.dao")
@SpringBootApplication
public class FeignUserApplication {
public static void main(String[] args) {
SpringApplication.run(FeignUserApplication.class);
}
}
4、创建接口(其中的接口为文章微服务controller方法):
/**
* @Auther: xf
* @Date: 2018/12/23 10:58
* @Description: 文章微服务接口
* FeignClient:指定从哪个服务中调用 api 服务名称不可以包含下划线
*/
@FeignClient(value = "springcloud-article")
public interface FeignArticleClient {
// 文章列表
@GetMapping("/article/list")
public ApiResult list();
/**
* 根据id查询文章信息
* @PathVariable(value = "id") 必须指定value参数,不然报错
*/
@GetMapping("/article/{id}")
public ApiResult getInfo(@PathVariable(value = "id") String id);
}
注意:此处 @PathVariable 注解必须指定参数,不然报如下错:
5、新建 FeignController 调用文章微服务:
/**
* @Auther: xf
* @Date: 2018/12/23 11:20
* @Description: 使用Feign 调用文章微服务
*/
@RestController
@RequestMapping(value = "/feign")
public class FeignController {
// 引入Feign client文章微服务接口
@Autowired
private FeignArticleClient feignArticleClient;
// 获取文章列表
@GetMapping(value = "findArticleList")
public ApiResult findArticleList(){
ApiResult apiResult = feignArticleClient.list();
return apiResult;
}
// 通过 id 获取文章信息
@GetMapping(value = "/findArticleById/{id}")
public ApiResult findArticleById(@PathVariable(value = "id") String id){
ApiResult apiResult = feignArticleClient.getInfo(id);
return apiResult;
}
}
6、测试:
启动 Eureka、springcloud_article(8082、8083两个服务)、user_feign。
为了测试效果,在springcloud_article 中获取文章信息的方法中加入被调用标记代码。
@GetMapping("/{id}")
public ApiResult getInfo(@PathVariable(value = "id") String id){
Article article = articleService.getInfo(id);
System.out.println(">>>>文章微服务>>>被调用>>>");
return ApiResult.ok(article);
}
6.1、文章列表:
http://127.0.0.1:8081/feign/findArticleList
6.2、根据文章id获取文章信息:
http://127.0.0.1:8081/feign/findArticleById/5 这里请求6次此接口。
8083服务日志:
8082服务日志:
由此验证了 Feign 集成Ribbon,亦具备了 Ribbon 负载均衡的能力,默认为轮询。
建议:如果是一个团队开发,微服务的controller也可实现接口,其中接口为一个单独的模块,服务调用方引入依赖,实现需要调用的接口即可,减少了代码量。
总结:
1、引入依赖、添加Feign的支持注解。
2、创建接口指定服务名称、引入服务相关 controller 方法及api地址。
3、使用自定义的接口调用服务。
4、Feign 集成了Ribbon,拥有Ribbon负载均衡的特性,默认轮询。
5、参看官网:http://spring.io/projects/spring-cloud 每个版本会有不同。
代码地址:
https://gitee.com/cpla026/springcloud/tree/master/springcloud_parent/springcloud_user_feign
个人学习分享
更多 springboot、springcloud、docker 文章,关注微信公众号吧: