SpringCloud 入门(二)Ribbon

1Ribbon简介

1.1 Ribbon概述


◆Ribbon是客户端负载均衡器
◆Ribbon核心功能:服务发现
◆Ribbon核心功能:服务选择规则
◆Ribbon核心功能:服务监听

1.2Ribbon与Eureka整合

◆Ribbon天然与Eureka无缝整合 
◆通过@LoadBalanced提供负载均衡支持
◆通过ribbon.eureka.enabled =false禁用Eureka

 

1.3配置负载均衡算法


Ribbon核心之IRule
◆IRule通过特定算法选取要访问的服务
◆lRule常 使用BestAvailableRule和WeightedResponse TimeRule

lRule算法

算法描述

RoundRobinRule       

轮询规则

RandomRule

随机规则

AvailabilityFilteringRule

可用过滤规则

WeightedResponseTimeRule    

 根据平均响应时间计算所有服务的权重

RetryRule

遵循RoundRobin规则处理,但是会对失败的服务进行重试

BestAvailableRule

结合了可用过滤规则和响应时长规则

ZoneAvoidanceRule

复合判断server所在区域性能和可用性选择服务器

SpringCloud 入门(二)Ribbon_第1张图片

 

2demo

2.1准备工作, 在一个被请求的服务(provider)上添加三个配置文件(yml) ,然后去Edit Configuration新增两个启动项

SpringCloud 入门(二)Ribbon_第2张图片

SpringCloud 入门(二)Ribbon_第3张图片

2.2配置主服务

2.2.1 yml服务

#全局配置
ribbon:
  ConnectTimeout: 250 # Ribbon的连接超时时间
  ReadTimeout: 1000 # Ribbon的数据读取超时时间
  OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
  MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
  MaxAutoRetries: 1 # 对当前实例的重试次数
#指定客户端配置 ; 全局配置 和 指定客户端配置  两个同时配置   指定客户端配置生效
backend-show-provider:
  ribbon:
    ConnectTimeout: 250 # Ribbon的连接超时时间
    ReadTimeout: 1000 # Ribbon的数据读取超时时间
    OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
    MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
    MaxAutoRetries: 1 # 对当前实例的重试次数

SpringCloud 入门(二)Ribbon_第4张图片

2.2.2配置 RestConfig文件


import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author :
 * @program :  
 * @description :
 **/
@Configuration
public class RestConfig {

    @Bean
    @LoadBalanced  //让 RestTemplate 有负载均衡的能力
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    /**
     * 配置ribbon规则
     * @return
     */
    @Bean
    public IRule iRule(){
        return  new RandomRule();
    }
}

SpringCloud 入门(二)Ribbon_第5张图片

2.2.3代码片段

package com.item.backed.consumer.service;

import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;


@Service
public class ConsumerServiceImpl implements ConsumerServiceAPI {

    @Resource
    private RestTemplate restTemplate;

    @Resource
    private LoadBalancerClient loadBalancerClient;

    @Override
    public String sayHello(String message) {
        
//      1   LoadBalancerClient( LoadBalancerClient 自带负载均衡)
//        ServiceInstance choose = loadBalancerClient.choose("backend-show-provider");
//        String hostname = choose.getHost();
//        int port = choose.getPort();
//        String uri = "/provider/sayhello?message=" + message;
//        String url = "http://" + hostname + ":" + port + uri;
        // invoker provider test
//        String result = null;
//        try {
//            result = restTemplate.getForObject(url, String.class);
//        } catch (RestClientException e) {
//            e.printStackTrace();
//        }



        //2 ribbon 实现负载均衡
        String uri = "/provider/sayhello?message=" + message;
        String url = "http://backend-show-provider"+ uri; 
        String result = null;
        try {
            result = restTemplate.getForObject(url, String.class);
        } catch (RestClientException e) {
            e.printStackTrace();
        }

        return result;
    }

}

最后请求 发现数据

SpringCloud 入门(二)Ribbon_第6张图片SpringCloud 入门(二)Ribbon_第7张图片

你可能感兴趣的:(springcloud,java,ribbon,spring,cloud)