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
上一篇下一篇

猜你喜欢

热点阅读