spring cloud 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 ribbonspring cloud hystrix的介绍,我们已经掌握了开发微服务应用时的两个重磅武器,学会了如何在微服务架构中实现客户端负载均衡的服务调用以及如何通过断路器来保护我们的微服务应用。这二个组件都被广泛地应用在各个微服务实现中,不仅包括我们自身的业务类微服务,也包括一些基础设施类微服务(比如网关)。此外,在实践中,我们发现几乎对这二个框架的使用几乎都是同时出现的。既然如此,那么是否有更高层次的封装来整合这二个基础工具以简化开发呢?spring cloud feign就是一个这样的工具。它基于Netfix Feign实现,整合了spring cloud Ribbonspring cloud Hystrix,除了提供这二者的强大功能之外,它还提供了一种生命式的web服务客户端定义方式。

我们在使用spring cloud ribbon时,通常会利用它对rersttemplate的请求拦截来实现对依赖服务的接口调用,而RestTemplate已经实现了对http请求的封装处理,形成了一套模版花的调用方法。之前已经介绍了RestTemplate调用的实现,但是在实际开发中,由于对服务依赖的调用可能不止于一处,往往一个接口会被多处调用,所以我们通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。这个时候我们发现,由于RestTemplate的封装,几乎每一个调用都是简单的模版化内容。

综合上述所说,spring cloud feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在spring cloud feign的实现下,我们只需创建一个接口并调用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用spring cloud ribbon时自动封装服务调用客户端的开发量。spring cloud feign具备可插拔的注解支持,包括feign注解和JAX-RS注解。同时,为了适应Spring的广大用户,它在Netfix Feign的基础上扩展了spring mvc的注解支持,这对于习惯spring mvc的开发者来说,无疑是个好消息,因为这样可以大大减少学习使用它的成本。另外,对于feign自身的一些主要组件,比如说编码器和解码器等,它也以可插拔的方式提高,在有需要的时候我们可以方便地扩展和替换它们。

快速入门

  • 创建pay-service服务,加入依赖,与之前的模块不一样的就是加入了spring-cloud-starter-feign依赖,
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
    </dependencies>
  • 创建主体应用类,并在主体应用类上加上注解@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class PayApplication {

    public static void main(String[] args) {
        SpringApplication.run(PayApplication.class,args);
    }
}
  • 定义UserService接口,通过@FeignClient("user-service")注解指定服务名来绑定服务,然后在使用Spring mvc的注解绑定具体的user-service服务中提供的rest接口。
@FeignClient("user-service")
public interface UserService {

    @RequestMapping(value = "/user/index",method = RequestMethod.GET)
    String index();

    @RequestMapping(value = "/user/hello",method = RequestMethod.GET)
    String hello();
}

这里,这里的服务名不区分大小写,所以user-serviceUSER_SERVICE都可以的。另外,在Camden.SR7版本中,原本的serviceId属性已经被废弃了,若要写属性名,可以使用namevalue

  • 接着,创建一个PayController来实现对feign客户端的调用,使用@Autowired注解直接注入上面定义的UserService实例,并在相应的方法中调用这个绑定了user-service服务接口的客户端来向改服务发起接口的定义。
@RestController
@RequestMapping("/pay")
public class PayController {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    UserService userService;

    @RequestMapping("/index")
    public String index(){
        return userService.index();
    }

    @RequestMapping("/hello")
    public String hello(){
        return userService.hello();
    }
}
  • 最后,同ribbon实现的服务消费一样,需要在application.yml中指定服务注册中心,
spring:
  application:
    name: pay-service
eureka:
  client:
    service-url:
     defaultZone: http://localhost:8761/eureka
  instance:
    instance-id:  ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
server:
  port: 7070
  • 测试验证Ribbon客户端负载均衡,同时启动服务注册和user-servceiuser-service启动了二个实例,然后启动pay-service
Eureka控制面板

发送多个请求http://192.168.5.3:7070/pay/index,发现二个user-service都能在控制台打印日志,我们看到了feign实现的消费者,依然是利用了Ribbon维护了user-service的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign我们只需要定义服务绑定接口,以声明式的方法,优雅而简单的实现了服务调用。

注意
我们知道为了适应Spring的广大用户,它在Netfix Feign的基础上扩展了spring mvc的注解支持,但是springmvc4.0出现的一系列注解比如@GetMapping,@PostMapping,@PutMapping等等是Feign是不支持的,比如在pay项目中定义的UserService接口,如果在

@FeignClient(value = "user-service")
public interface UserService {

//    @RequestMapping(value = "/user/index",method = RequestMethod.GET)
    @GetMapping("/user/index")
    String index();
...

在启动的时候就会抛出如下的异常


当然这些所谓的坑在开发阶段便会发现。

参考资料
Declarative REST Client: Feign

代码地址
代码地址

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

推荐阅读更多精彩内容