持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
作者平台:
-
GitHub:github.com/JiangXia-10…
-
微信公众号:1024笔记
本文一共2408字,预计阅读13分钟
前言
前面的文章SpringCloud系列:微服务间如何通信介绍了微服务之间如何通信,主要使用的是resttemplate对象。微服务之间的通信方式常见的方式有两种:一种是RPC,比如dubbo使用的就是rpc,这个后续介绍。还有就是Http,在SpringCloud中,默认是使用http来进行微服务的通信,其最常用的实现形式有两种:一种是之前介绍的RestTemplate,还有一种是Feign。
今天就一起学习Feign如何使用。
什么是Feign
Feign是Netflix开发的声明式、模板化的HTTP客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法也比较简单只需要定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。
Feign Client也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装(OpenFeign),使得它也支持了Spring MVC标准注解和HttpMessageConverters。Feign Client还可以与Eureka或者Consul组合使用,从而实现负载均衡。
Feign和OpenFeign的区别
Feign是Netflix开发的一个轻量级的restful的http web service client。Feign内置了ribbon,可以支持客户端的负载均衡。它的使用也简单,只需要使用feign的注解定义接口,然后调用这个接口就可以调用服务注册中心的服务。它的依赖是:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
而OpenFeign是Spring cloud在netflix feign基础之上进行了封装和增强,使得它也支持了Spring MVC标准注解和HttpMessageConverters。OpenFeign的@OpenFeignClien注解可以解析@requestMapping注解标注的接口,并通过动态代理的方式生成其实现类,然后在实现类中实现负载均衡和服务调用。它的依赖是:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Feign目前是维护状态,今天主要学习的就是Spring Cloud的OpenFeign组件,OpenFeign也是目前使用的主流。
OpenFeign的简单使用
首先需要创建两个基本的springboot项目,源码地址放在最后。项目结构如下:
首先需要在两个项目中都引入consul相关的依赖,并且设置配置文件:
<!--引入consul依赖,用于服务注册发现-->
<!--Consul Discovery-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--引入健康检查的依赖,用于健康检查监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
server.port=8085
spring.application.name=customer
#向consul server 服务注册地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
server.port=8086
spring.application.name=product
#向consul server 服务注册地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
接着就是两个项目的入口类都需要使用@EnableDiscoveryClient注解:
两个项目分别创建controller接口:
分别启动两个项目:
至此,基本项目环境创建成功了,下面就是正式的OpenFeign相关的开发,即通过OpenFeign使得customer项目直接调用product项目的接口,让两个项目能够进行通信。
首先需要在服务调用方即Customer中引入Openfeign相关的依赖:
然后在服务调用方的入口类上和开启服务注册一样加入@EnableFeignClients注解,开启Feign调用的支持。
接着需要在服务调用方的项目中创建一个接口,主要用于实际的去调用服务方的接口:
@FeignClient注解的源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
@AliasFor("name")
String value() default "";
/** @deprecated */
@Deprecated
String serviceId() default "";
String contextId() default "";
@AliasFor("value")
String name() default "";
String qualifier() default "";
String url() default "";
boolean decode404() default false;
Class<?>[] configuration() default {};
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
String path() default "";
boolean primary() default true;
}
可以发现其具有以下几个属性:
name/value:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
url: url一般用于调试,可以手动指定@FeignClient调用的地址
decode404:当发生http 404错误时,如果该字段的值为true,则会调用decoder进行解码,否则抛出FeignException
configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性可以实现每个接口通用的容错逻辑,减少重复的代码
path: 定义当前FeignClient的统一前缀,当项目中配置了server.context-path,server.servlet-path时使用
最后只需要在服务调用方的接口中注入刚刚的接口,并且调用具体方法即可:
接着重新启动customer项目:
可以在调用customer接口的时候,调用了product服务。
新增一个product服务的实例:
浏览器不断刷新服务调用方接口的地址,则每次调用服务提供方的节点都不相同,则表明OpenFeign也能够实现负载均衡。
OpenFeign与RestTemplate的区别
根据上述对于openfeign的使用和之前resttemplate的使用,可以总结它们之间的区别如下:
1、请求方式不一样
RestTemplate的使用需要对每个请求都拼接url+参数+类文件,所以它的灵活性高但是消息封装臃肿。而feign可以伪装成类似SpringMVC的controller一样,将rest的请求进行隐藏,不用再自己拼接url和参数,可以便捷优雅地调用HTTP API。
2、底层实现方式不一样
通过前面文章SpringCloud系列:微服务间如何通信我们可以知道RestTemplate进行服务通信,需要拼接url,可以写死具体的url,也可以通过服务名去服务注册中心先获取服务的url,再进行调用,需要添加@LoadBalanced注解,才能进行负载均衡。
而Feign底层的实现是基于动态代理,所以如果对某个接口上添加了@FeignClient注解,那么Feign就会针对这个接口创建一个动态代理的对象,所以在调用这个接口的时候,其实就是调用这个接口的代理对象,代理对象根据@FeignClient注解中name的值在服务注册中心找到对应的服务,然后再根据@RequestMapping等其他注解的映射路径构造出请求的地址,然后再从本地实现HTTP的远程调用。
总结
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。OpenFeign组件能够解决resttemplate所实现的服务间通信的所有问题,并且使用比resttemplate简单高效,所以这也是Spring Cloud推荐使用的服务调用方式。
如果有任何问题或者不正确的地方,欢迎指出交流讨论!
更多的openfeign的内容,可以参考官网:
本文项目地址在:
相关推荐
本文使用 文章同步助手 同步