spring cloud 之 Feign 使用HTTP请求远程服务的实现方法
一、feign 简介
在spring cloud netflix栈中,各个微服务都是以http接口的形式暴露自身服务的,因此在调用远程服务时就必须使用http客户端。我们可以使用jdk原生的urlconnection、apache的http client、netty的异步http client, spring的resttemplate。但是,用起来最方便、最优雅的还是要属feign了。
feign是一种声明式、模板化的http客户端。在spring cloud中使用feign, 我们可以做到使用http请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个http请求。
二、feign的使用在spring cloud中的使用
1、添加依赖
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-feign</artifactid> </dependency>
2、创建feignclient
@feignclient(name="spring-producer-server/spring") public interface feignuserclient { @requestmapping( value = "/findall/{name}",method = requestmethod.get) public list<springuser> findall(@pathvariable("name") string name); @requestmapping( value = "/finduserpost",method = requestmethod.post) public springuser finduserpost(@requestbody springuser springuser);//复合类型好像默认是post请求 }
@feignclient(name="spring-producer-server/spring"):用于通知feign组件对该接口进行代理(不需要编写接口实现),name属性指定我们要调用哪个服务。使用者可直接通过@autowired注入。
@requestmapping表示在调用该方法时需要向/group/{groupid}发送get请求。
@pathvariable与springmvc中对应注解含义相同。
原理:spring cloud应用在启动时,feign会扫描标有@feignclient注解的接口,生成代理,并注册到spring容器中。生成代理时feign会为每个接口方法创建一个requettemplate对象,该对象封装了http请求需要的全部信息,请求参数名、请求方法等信息都是在这个过程中确定的,feign的模板化就体现在这里。
3、启动类上添加注解
@configuration @componentscan @enableautoconfiguration @enableeurekaclient @enablefeignclients public class springconsumerserverfeignapplication { public static void main(string[] args) { springapplication.run(springconsumerserverfeignapplication.class, args); } }
4、配置文件 application.yml
spring: application: name: spring-consumer-server-feign server: port: 8084 context-path: /spring #服务注册中心的配置内容,指定服务注册中心的位置 eureka: client: serviceurl: defaultzone: http://user:password@localhost:8761/eureka/
三、自定义feign的 配置
1、自定义configuration
@configuration public class fooconfiguration { @bean public contract feigncontract() { //这将springmvc contract 替换为feign.contract.default return new feign.contract.default(); } }
2、使用自定义的configuration
@feignclient(name="spring-producer-server/spring",configuration=fooconfiguration.class) public interface feignuserclient { @requestline("get /findall/{name}") public list<springuser> findall(@param("name") string name); /* @requestmapping( value = "/findall/{name}",method = requestmethod.get) public list<springuser> findall(@pathvariable("name") string name); @requestmapping( value = "/finduserpost",method = requestmethod.post) public springuser finduserpost(@requestbody springuser springuser);*/ }
@requestline:是feign的注解
四、feign日志的配置
为每个创建的feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建feign客户端的接口的完整类名。feign日志记录仅响应debug级别。logging.level.project.user.userclient: debug
在配置文件application.yml 中加入:
logging: level: com.jalja.org.spring.simple.dao.feignuserclient: debug
在自定义的configuration的类中添加日志级别
@configuration public class fooconfiguration { /* @bean public contract feigncontract() { //这将springmvc contract 替换为feign.contract.default return new feign.contract.default(); }*/ @bean logger.level feignloggerlevel() { //设置日志 return logger.level.full; } }
ps:feign请求超时问题
hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。而首次请求往往会比较慢(因为spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了
解决方案有三种,以feign为例。
方法一
hystrix.command.default.execution.isolation.thread.timeoutinmilliseconds: 5000
该配置是让hystrix的超时时间改为5秒
方法二
hystrix.command.default.execution.timeout.enabled: false
该配置,用于禁用hystrix的超时时间
方法三
feign.hystrix.enabled: false
该配置,用于索性禁用feign的hystrix。该做法除非一些特殊场景,不推荐使用。
以上这篇spring cloud 之 feign 使用http请求远程服务的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
spring cloud 之 Feign 使用HTTP请求远程服务的实现方法
-
spring cloud 之 Feign 使用HTTP请求远程服务的实现方法
-
spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法
-
使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)
-
spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法
-
使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)
-
Spring Cloud下使用Feign Form实现微服务之间的文件上传
-
Spring Cloud下使用Feign Form实现微服务之间的文件上传
-
Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的使用
-
spring cloud 之 Feign 使用HTTP请求远程服务