SpringCloud 2.0 之 Ribbon, Feign
2018-08-30 本文已影响0人
rommy020
官网:http://cloud.spring.io/spring-cloud-static/Finchley.SR1/multi/multi_spring-cloud-ribbon.html
****Ribbon 介绍****
客户端负载均衡(主要服务组件: 服务发现ServerList, 服务选择规则IRule, 服务监听).
过程:
1: ServerList 获取所有可用服务列表
2: ServerListFilter: 过滤掉一些地址
3: IRule: 选择实例
负载均衡的主要规则
a: 轮询(Round), 常用
b: 自定义, 参见(http://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_customizing_the_ribbon_client)
代码:
PRODUCER: ##Application的名字
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
RestTemplate 进行通信
方式a: 利用 RestTemplate 调用
RestTemplate rt = new RestTemplate();
String result = rs.getObject("{url}", "{返回值类型}");
方式b: 利用LoadBalancerClient, 可以在 RestTemplate 中使用应用的名字
RestTemplate rt = new RestTemplate();
ServiceInstance producerInstance = loadBalancerClient.choose("PRODUCER"); //注册的instance
String result = rs.getForObject(producerInstance.getUri.toString() + "/msg", String.class);
方式c: 利用@LoadBalanced
1: 先写一个Component, 这样就可以通过注解的方式得到RestTemplate
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2: 注入 restTemplate
@Autowired
private RestTemplate restTemplate;
restTemplate.getForObject("http://PRODUCER/msg", String.class);
****Feign 介绍****
简化了RestTemplate, 声明式REST客户端, 并不是RPC, 采用了基于接口的注解, 内部使用了Ribbon做负载均衡.
调用方法
1: 增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2: 启动主类加注解
@EnableFeignClients//如果启动不了, 就需要加上(basePackages="xxxx")
3: 定义interface, 想调用其他application的方法
@FeignClient(name = "producer") //大小写不敏感, 服务端的applicationname
public interface ProduceClient {
@GetMapping("/msg") //这个是producer里面的controller里面的方法
String productMsg(); //这个名字随便写
}
4: 在需要的地方直接调用
@Autowired
private ProduceClient produceClient;
produceClient.productMsg();
5: 如果报错, connection timeout则在yml上增加
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000