微服务架构实战学习(十):服务消费之 feign

上一篇分享了使用 Ribbon 进行服务的消费(调用),这一篇中我们分享一下使用 feign 的服务消费。

一、什么是 feign

首先,当然是要说说什么是 feign,为什么要用 feign 呢?

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign.

以上这段话来自 Spring Cloud 官网,http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_spring_cloud_openfeign

这段话里已经说明了 feign 是一个声明式的 web 服务客户端,它简化了我们编写 web 服务客户端的操作。并且它使用注解,具有可插拔、负载均衡、服务熔断等一系列便捷功能。

有人可能会问了,前一篇中我们使用 Ribbon 不也是能够进行服务的调用,并且也具备负载均衡功能嘛,为什么还要用 feign,是多此一举吗?答案当然是不,要不然谁会没事儿多搞个 feign 来浪费大家时间呢?

Ribbon 与 Feign 的关系?

简单地理解为 Ribbon 是个更通用的 http 客户端工具,而 Feign 则是基于 Ribbon 开发出的更自定义化以供 Spring Cloud 便捷使用的 http 客户端工具。

而且 Feign 的使用比 Ribbon 更简单,只需要通过注解便可简单实现服务的消费。

总结
1 Feign 是一个 Http 客户端
2 支持 Feign 注解和 JAX-RS 注解
3 Feign 基于 Ribbon 实现,具有 Ribbon 的功能,包括负载均衡
4 Feign 具备 Hystrix 的服务熔断功能(服务熔断:防止由于服务调用时的网络问题或服务掉线而引发的一系列问题)

二、Feign 使用示例

2.1 创建项目

这里使用之前创建的 logistics-service 项目作为示例

2.2 添加依赖

在 pom.xml 中添加 feign 的依赖,并使用 maven 导入依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.3 添加 Feign 注解

在项目的启动类上添加 @EnableFeignClients 的注解

package com.jiangzhuolin.logisticsservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class LogisticsServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(LogisticsServiceApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

2.4 定义 Feign 接口

在 logistics-service 项目中定义一个接口来进行 feign 的服务消费定制。

package com.jiangzhuolin.logisticsservice.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(value = "user-service")
public interface ILogisticsService {
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    String getUserInfo(@PathVariable(value = "id") long id);
}
  • @FeignClient() 声明了这是一个 Feign 客户端,里面的 value = "user-service" 表示要调用的是 user-service 这个服务(在 application.yml 配置的 application.name)。
  • @RequestMapping 注意区分此处的 RequestMapping 用于指定要调用的对方服务的 URI,而不是对外提供的 URI。上面的代码表示要调用的是 user-service 服务的 /user/{id} 这个接口,其中 id 为 路径参数。
  • getUserInfo() 方法里的参数表示传递给调用服务的接口(user service 服务)的参数,如此处表示调用 getUserInfo 方法传递的 id 将作为 user-service 服务的 /user/{id} 接口的一个路径参数被传递

2.5 修改 logistics 服务的 controller

将 LogisticsController 中的接口调用由原来的 Restemplate + Ribbon 改为 Feign。

package com.jiangzhuolin.logisticsservice.controller;

import com.jiangzhuolin.logisticsservice.service.ILogisticsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/logistics/")
public class LogisticsController {

    @Autowired
    private ILogisticsService logisticsService;

    @RequestMapping(value = "/message")
    public String message(long userId) {
        String response = logisticsService.getUserInfo(userId);
        return response;
    }
}
  • @Autowired 注入 ILogisticsService
  • 在 Controller 方法中直接调用 ILogisticsService 中定义的 Feign 的调用方法。

2.6 启动项目并验证

直接在本地启动 logistics-service 项目,并验证接口调用。

调用 logistics-service 的接口

调用 logistics-service 的接口,可以看到通过 logistics-service 服务的接口,我们拿到了 user-service 服务的数据,而这个过程中,我们只是加了几个注解,配置了几个参数即可。

总结

从上面的示例我们可以明显地看出,Feign 的作用就是为了极大的简化我们在微服务架构下的不同服务间调用。并且贴心地为我们解决了负载均衡与服务熔断的两个难点。

Feign 的使用还有更多的自定义,官方地址如下:
http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_spring_cloud_openfeign

本文的 github 源码地址如下:
https://github.com/jiangzhuolin/logistics-service

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容