摘自:蚂蚁课堂学习视频:http://www.mayikt.com/course/video/2390
1、SpringCloud中支持两种客户端调用工具:
RestTemplate基本上不用的,
Feign客户端工具应用比较多,它是一个声明式的http客户端调用工具,采用接口 + 注解方式实现,易读性比较强。
最大的优势:
2、代码实现(基于Eureka注册中心)
代码1: pom.xml添加feign依赖,
<!-- feign客户端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
代码2:在消费者中建立feign接口
/**
* Feign书写方式以springmvc接口形式书写,
* FeignClient调用服务接口,name就是服务名称
* @author gh
*
*/
@FeignClient(name="app-member")
public interface ApiFeign {
@RequestMapping("/getMember")
public String getMember();
/**
* 实现原理:通过反射机制,获取接口上的服务名称,然后去注册中心获取对应的实际地址,
* 再获取接口的调用方法,通过@RequestMapping获取到具体的url地址,
* 然后在底层转化为rpc远程调用。
*/
}
代码3:建立消费者调用controller
@RestController
public class FeignController {
@Autowired
private ApiFeign apiFeign;
@RequestMapping("/feignGetMember")
public String feignGetMember(){
return apiFeign.getMember();
}
}
代码4:启动类中加入注解
(注意:如果@EnableFeignClients注解不加basePackages时,可能会导致启动时找不到feign接口,加或不加根据自己的包的位置来定。)
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages={"com.gonghua"})
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class, args);
}
}
效果如下:
3、创建Feign客户端依赖聚合项目
(1)建立父项目时,maven的packaging需选择成war类型
(2)父项目中建立子项目,这时候选择maven module
4、服务雪崩效应
默认情况下tomcat只有一个线程池去处理的客户端发送的所有服务请求,这样的话,在高并发情况下,如果客户端所有的请求堆积到同一个服务接口上,就会产生tomcat的所有的线程去处理该服务接口,可能会导致其他服务接口无法访问。就会导致其他服务接口访问的时候,产生延迟和等待。
5、Feign客户端超时时间配置
springcloud的feign客户端默认超时时间为1秒,为了解决这个问题,我们可以进行以下配置:
application.properties里面配置:(springcloud feign客户端默认开启支持ribbon)
##设置feign客户端超时时间:
##指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ribbon.ReadTimeout: 5000
##指的是建立连接后从服务器读取到可用资源所用的时间
ribbon.ConnectTimeout=5000