spring cloud feign
阅读数:271 评论数:0
跳转到新版页面分类
python/Java
正文
一、JAVA项目中网络接口调用工具
1、HttpClient
它是Apache Jakarta Common下的子项目,用来提供高效、最新的、功能丰富的支持Http协议的客户端编程工具包。
HttpClient相比传统JDK自带的URLConnection,提升了易用性和灵活性。
2、OkHttp
一个处理网络请求的开源项目,是Android中常用的框架,由Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient。OkHttp拥有简洁的API。
3、HttpURLConnection
是Java的标准类,继承自URLConnection,使用复杂。
4、RestTemplate
是Spring提供的用于访问Rest服务的客户端。
而Feign是一个声明式的REST客户端,我们只需要像调用本地方法一样调用它就可以完成请求。
Feign是Netfix公司写的,OpenFeign是SpringCloud自己研发的,在Feign的基础上支持Spring MVC的注解,它可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式实现负载均衡并调用远程服务。
二、在Spring Cloud中集成Feign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类上加@EnableFeignClients注解,如果你的Feign接口定义跟你的启动类不在同一个包名下,还需要制定扫描的包名。@EnableFeignClients(basePackages="com.cuihs.api.client")
如果报错误
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
原因是因为Spring Cloud Feign在Hoxton.M2 版本之后,不再使用ribbon,而使用spring-cloud-loadbalancer,所以我们还需要引入spring-cloud-loadbalancer。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
// 同时naocs也要的排除ribbon
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
@FeignClient(value = "eureka-client-user-service")
public interface UserRemoteClient {
@GetMapping("/user/hello")
String hello();
}
@FeignClient这个注解标识当前是一个Feign的客户端,value属性是对应的服务名称,也就是你需要调用如个服务的接口。
@Autowired
private UserRemoteClient userRemoteClient;
@GetMapping("/callHello")
public String callHello() {
String result = userRemoteClient.hello();
System.out.println("调用结果:" + result);
return result;
}
三、feign client超时时间配置
影响到feign接口超时时间的主要有三类配置:feign\ribbon、hystrix和OkHttp(若配置)。
默认情况下,连接超时为10秒,读取超时为60秒。
(1)全局配置,配置在application.yml
feign:
client:
config:
default: // 所有服务级别设置,default为任意服务
connectTimeout: 毫秒时间,建立连接的超时时间,一般只在发现服务时用到
readTimeout: 毫秒时间 ,接口请求的超时时间
remote-server-name: // contextId属性,指定调用remote-server-name服务时的超时时间
connectTimeout: 200
readTimeout: 3000
(2)针对客户端设置
feign:
client:
config:
FooClient:
connectTimeout: 10000
readTimeout: 20000
(3)针对单个方法
@PostMapping("/test")
void test(@RequestParam Long id, Request.Options options);
// 调用时设置
Request.Options options = new Request.Options(5L,TimeUnit.SECONDS, 60L, TimeUnit.SECONDS, true);
feignClient.test(1L, options);
ribbon:
ReadTimeout: 毫秒时间, 同feign的
ConnectTimeout:毫秒时间 , 同feign的
feign和ribbon的配置二选一即可,不同点在于feign的配置在ribbon的基础上做了扩展。
ribbon和feign都有全局配置和局部配置,优先级为:
feign局部配置》feign全局配置》ribbon局部配置》ribbon全局配置.
hystrix:
command:
default: #这个代表接口,default为任意接口, 可以配置为指定接口
execution:
isolation:
thread:
timeoutInMilliseconds: 毫秒时间
hystrix配置也分为全局和局部,只需要替换default为指定服务名即为局部配置。
hystrix配置的超时时间正常应该比feign和ribbon的要大,因为feign和ribbon可以配置失败重试。最终的超时时间是以feign(或ribbon)和hystrix中最小时间为准。
四、@FeignClient注解
该注解常用属性如下:
(1)value/name
指定提供者的微服务名称。
(2)url
直接指定请求的路径地址。
(3)fallback
指定发送异常调用或者超时应该调用哪个类来执行备方法。
(4)path
当服务提供者使用了server.context.path时。
(5)contextId
用于唯一标识当一个微服中存在多个FeignClient接口调用同一个服务提供者的场景。
五、spring通过@Autowired找不到feign接口
1、没有使用@EnableFeignClients进行扫描。
2、默认扫描路径扫描不到feign接口。
通过@EnableFeignClients进行扫描时,如果没有添加basePackages属性,默认扫描的是当前启动类所在的包及其子包路径,而使用的feign接口可能不在此路径下。
3、feign接口编写存在问题
可能feign接口定义的方法中,没有添加@RequestMapping等注解。
六、hystrix熔断问题
1、load balancer does not have available server
当服务的全部实例都不可用时,如果持续异常,会出发熔断,断路器开始工作,报
java.lang.RuntimeException: Hystrix circuit short-circuited and is OPEN
需要注意的是,熔断期间,即使服务恢复了健康状态也不会立即被调用,断路器每隔一段时间会放行一个请求,如果成功,才会停止熔断,恢复正常调用。
2、禁用hystrix
(1)完全禁用hystrix
//配置yml文件
feign.hystrix.enabled=false
(2)部分禁用hystrix
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import feign.Feign;
import feign.Retryer;
//此配置类为了关闭特定Feign客户端的Hystrix支持
//注意:不要和服务启动类放在同一目录或子级目录下
@Configuration
public class FeignNoHystrixConfigure {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder(Retryer retryer) {
return Feign.builder();
}
}
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.mimaxueyuan.config.FeignNoHystrixConfigure;
//关闭Hystrix(会导致所有的mima-cloud-producer都关闭,不管其它配置是否开启也会关闭,这是个坑要注意下)
@FeignClient(value="mima-cloud-producer",configuration=FeignNoHystrixConfigure.class)
public interface TestClient4 {
@RequestMapping(value="/get/{id}",method=RequestMethod.GET)
public String get(@PathVariable("id") String id);
}