美文网首页
SpringCloud 2.0 之 Ribbon, Feign

SpringCloud 2.0 之 Ribbon, Feign

作者: rommy020 | 来源:发表于2018-08-30 12:41 被阅读0次

    官网: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
    

    相关文章

      网友评论

          本文标题:SpringCloud 2.0 之 Ribbon, Feign

          本文链接:https://www.haomeiwen.com/subject/dhvrwftx.html