SpringCloud主要框架介绍:
- 服务发现——Netflix Eureka 连接
- 服务调用——Netflix Feign
- 熔断器——Netflix Hystrix 连接
- 服务网关——Netflix Zuul 连接
- 分布式配置——Spring Cloud Config 连接
- 消息总线 —— Spring Cloud Bus 连接连接Feign介绍:
Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用.
1.搭建步骤
假设要从A微服务调用B微服务(比如根据ID查询标签)
(1)在A添加依赖(A调B,只需在A添加)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)修改A的启动类,添加注解
@EnableDiscoveryClient //发现服务
@EnableFeignClients //采用Fegin的方式发现服务
(3)在A创建 A.client包,包下创建接口
@FeignClient("B")
public interface LabelClient {
//findById这个方法是要调用的B的控制层的接口方法,但是路径得改全(因为B的该方法全路径要加上根目录的比如label路径)
@RequestMapping(value="/label/{id}", method = RequestMethod.GET)
public Result findById(@PathVariable("id") String id);
}
@FeignClient注解用于指定从哪个服务中调用功能 ,注意 里面的名称与被调用的服务
名保持一致,并且不能包含下划线。
@RequestMapping注解用于对被调用的微服务进行地址映射。注意 @PathVariable注
解一定要指定参数名称,否则出错
(4)修改A的控制层Controller
@Autowired
private LabelClient labelClient;
@RequestMapping(value = "/label/{labelid}")
public Result findLabelById(@PathVariable String labelid){
Result result = labelClient.findById(labelid);
return result;
}
(5)测试:http://localhost:A端口号/problem/label/1 能看到标签的信息
(6)注意点:
feign继承特性:
在使用声明式feign客户端工具的时候,因为书写的方式代码可能会产生重复,可以使用feign客户端继承方式减少代码。
Feign客户端超时问题:
配置Feign客户端超时时间(默认1s,没配置延迟1s以上会报错)
###设置feign客户端超时时间
ribbon:
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
ReadTimeout: 5000
###指的是建立连接后从服务器读取到可用资源所用的时间。
ConnectTimeout: 5000
Ribbon配置:
SpringCloud Feign客户端Http调用工具,默认已经整合了Ribbon负载均衡客户端
2.负载均衡
测试(根据1的案例):同时开启多个B微服务,把端口号改成不一样的启动。启动微服务A后访问Fegin调用的该方法,看是否是轮流调用某个方法
@LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
在启动类用@Bean加入RestTemplate 到容器,然后使用时依赖注入RestTemplate 即可使用rest方式调用服务
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}