本文小编为大家详细介绍“微服务Springcloud之Feign如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“微服务Springcloud之Feign如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
Feign是Spring Cloud提供的声明式、模板化的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解;Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果。
注意:以下所有步骤实现的前提是需要在启动类上加入注解 @EnableFeignClients 主要是为开启feign接口扫描
导入依赖:
<!--Spring Cloud OpenFeign Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
代码如下(示例):
在服务提供者中调用servic层获取数据
//创建服务提供者 @RestController @RequestMapping("/provider") public class ProviderController { @Autowired private UserService userService; @RequestMapping("/getUserById/{id}") public User getUserById(@PathVariable Integer id){ return userService.getUserById(id); } }
代码如下(示例):
解释都放在了代码中,可以直接复制粘贴
/** * @FeignClient 一般采用服务名进行命名 * name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现 * url: url一般用于调试,可以手动指定@FeignClient调用的地址 * * @RequestMapping 主要用于feign框架拼接传递url,弥补了Ribbon的url需要手动拼接的缺陷 * @PathVariable("id") 当路径为restful风格时路径传参方式 * @RequestParam("id") 当路径为?id=250 时传参方式 * @RequestBody User user 当路径为对象时采用的传参方式,(集合、数组等都属于对象) */ @FeignClient("feign-provider") @RequestMapping("/provider") public interface UserFeign { @RequestMapping("/getUserById/{id}") User getUserById(@PathVariable("id") Integer id); @RequestMapping("/deleteUserById") User deleteUserById(@RequestParam("id") Integer id);//?形式拼接参数,?id=250 @RequestMapping("/addUser") User addUser(@RequestBody User user);//pojo--->json }
//服务消费者 @RestController @RequestMapping("/consumer") public class ConsumerController { @Autowired private UserFeign userFeign; @RequestMapping("/getUserById/{id}") public User getUserById(@PathVariable Integer id){ return userFeign.getUserById(id); } }
application.yml文件
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.209.129:8848
application:
name: feign-consumer
1、将feign接口的代理类扫描到Spring容器中:
@EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,并把接口和代理类交给Spring的容器管理。
2、为接口的方法创建RequestTemplate
当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数)
3、发出请求
代理类会通过RequestTemplate创建Request,然后client(URLConnetct、HttpClient、OkHttp)使用Request发送请求
feign日志级别
在consumer的yml文件中加入以下代码
feign: client: config: feign-provider: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置 loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger #在application.yml中使用 logging.level.<Feign客户端对应的接口的全限定名> 的参数配置格式来开启指定客户端日志 logging: level: com.bjpowernode.feign: debug
随后启动测试:
出现以下结果表示日志输出成功
首先、Feign的负载均衡底层用的就是Ribbon,所以这里的请求超时配置其实就是配置Ribbon,当出现请求超时会出现以下报错。
注意 :当开启日志配置之后,feign超时问题不会出现报错情况。
针对超时问题我们需要在之前的日志配置中加入以下内容
ConnectTimeout: 5000 #请求连接的超时时间
ReadTimeout: 5000 #请求处理的超时时间
首先,我们知道HTTP连接需要经过三次握手,四次挥手的过程,这是很耗费性能的;所以HTTP连接池帮助我们节省了这一步。
同时Feign的HTTP客户端支持三种框架:
HttpURLConnection、HttpClient、OkHttp;默认是HttpURLConnection
先引入依赖到公共接口工厂interfac,如果没有做公共接口就放入consumer
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
讲真的,其实这已经完成了,但是,我们还是要知道一下它的原理,否则显得太片面了
在配置文件中我们看到,连接池引入之后默认是开启的,所以我们就不用再写了
压缩能力:
当 Gzip 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少 70%以上的文件大小。·
这个开启也是比较简单,只需要在consumer中yml文件中写入以下代码即可
此时在浏览器中就可以看到我们提供的压缩方式,和浏览器支持的压缩方式
读到这里,这篇“微服务Springcloud之Feign如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。