SpringCloud>05 - 服务调用Feign

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 文章,关注微信公众号吧:

猜你喜欢

转载自blog.csdn.net/cp026la/article/details/86607062