Feign 入门篇
1、简介
Feign 是一个 REST 客户端库,它通过接口驱动的方式来定义 REST 客户端。Spring Cloud Netflix 体系中的 Eureka 服务注册中心客户端支持 Ribbon 客户端负载均衡器,而 Feign 本质上是 Ribbon 的包装,其内部是通过 Ribbon 来进行服务查找和负载均衡。在 Spring Cloud Netflix 体系中,我们通常会通过以下两种方式进行服务通信:
支持负载均衡的 RestTemplate
Feign 生成的客户端接口
两种方式都是通过 Ribbon 进行服务查找,然后更加负载均衡策略选择服务进行服务通信,具体使用那种方式看个人爱好(小捌觉得 Feign 客户端接口这种方式,在代码上稍显复杂,但是更好管理)。
关于 Feign 的一点小知识:大家经常听到有人说 OpenFeign,有人说 Feign,给人一种好像是两个东西的错觉。其实是因为 Feign 本身也是 Netflix 的开源项目,后面独立出来单独做了开源项目,改名为 OpenFeign。这种情况其实很常见,比如鸿蒙-HarmonyOS 就有 Open HarmonyOS。
2、正文
正式开始 Feign 的学习之前,大家需要对微服务有一定的认识,关于这些知识点可以查看本专栏的往期文章,入门微服务、Eureka 相关知识,并且搭建一个 Eureka 服务和客户端之后在来学习 Feign。
2.1 服务搭建
搭建一个 Eureka Server 用于服务注册发现,此外准备两个相同的服务提供者 SERVER 和一个服务消费者 CONSUMER,整体的服务如下所示:
2.2 RestTemplate
由于 Feign 和 RestTemplate 一样如果需要进行查找服务,都是通过集成 Ribbon 来实现的,所以这里向看在上面这种微服务架构中,如何通过 RestTemplate 来消费服务。这里贴出的服务端代码,在后面的 Feign 中是相同的,后面将不会再贴出。
1、服务提供者 Server-01 暴露 REST 端点:
2、服务提供者 Server-02 暴露 REST 端点:
3、声明 RestTemplate bean,并且添加注解 @LoadBalanced,这个注解会告诉 Spring Boot 这个 RestTemplate 需要具有通过 Ribbon 查找服务的能力,我这里因为演示所以在启动类中声明。
4、服务消费者 Consumer 通过 RestTemplate 消费服务代码:这里服务提供者有两个,我们借助 Ribbon 和 Eureka 客户端可以实现服务的发现和负载均衡,注意服务地址不再硬编码,而是编写成服务提供者注册在 Eureka 上的服务名称 server(不区分大小写)。
5、通过任意 Http 客户端请求 Consumer 提供的/consumer 端点,不断刷新请求,可以看到 RestTemplate 会依次轮训 Server-01 和 Server-02
2.3 Feign Client
1、导入依赖
2、添加配置类启动 Feign Client,可以直接在启动类上配置
3、定义 Feign 接口
这个接口定义完成,不需要实现类。在 Spring boot 运行时,当 Feign 发现了这个接口,Feign 会自动创建一个实现类并将其暴露为 Spring 应用上下文中的 bean
4、通过 Feign 客户端接口发送请求注入 Feign 接口,可以直接调用接口中的方法(具体实现由 Feign 完成)即可发起请求。
5、通过任意 Http 客户端请求 Consumer 提供的/consumer 端点,不断刷新请求,可以看到 Feign Client 会依次轮训 Server-01 和 Server-02
2.4 总结
这篇文章入门了 Feign,也顺带讲了下 RestTemplate 的简单使用。需要注意的是 Fegin 它并不负责解析服务名、负载均衡,这些都是其集成的 Ribbon 实现的。Feign 可以替代 RestTemplate,相比之下代码的可读性确实增强了,但是整体性能是有些许下降的。
版权声明: 本文为 InfoQ 作者【李子捌】的原创文章。
原文链接:【http://xie.infoq.cn/article/7418672dca499e4e72e842c47】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论