ribbon客户端负载均衡

一、三种配置方式 集成eureka、注解、配置文件

1、集成erueka

在application.yml中配置(其实会默认配置好,但是最好显示配置出来)

ribbon:
  # 开启eureka与ribbon的集成
  eureka:
    enabled: true

2、注解

在启动类中添加注解

// 通过注解的方式定义了一个针对service-by-annotation服务的负载均衡器(service-by-annotation是服务的名称也是负载均衡器的名称)
@RibbonClients(value = {
        @RibbonClient(name = "service-by-annotation", configuration = ServiceByAnnontationConfiguration.class) })
@SpringBootApplication
@EnableFeignClients
// 通过注解的方式定义了一个针对service-by-annotation服务的负载均衡器(service-by-annotation是服务的名称也是负载均衡器的名称)
@RibbonClients(value = {
        @RibbonClient(name = "service-by-annotation", configuration = ServiceByAnnontationConfiguration.class) })
public class RibbonSampleApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(RibbonSampleApplication.class).web(true).run(args);
    }

    // 这里定义 可以覆盖所有的
    // @Bean
    // public IRule ribbonRule() {
    // return new RandomRule();
    // }

}

ServiceByAnnontationConfiguration:

package com.dongnaoedu.springcloud.examples.javaconfig;

import org.springframework.cloud.netflix.ribbon.StaticServerList;
import org.springframework.context.annotation.Bean;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;

// 注解的方式,对应RibbonSampleApplication中@RibbonClients
public class ServiceByAnnontationConfiguration {
    // 实例源
    @Bean
    public ServerList<Server> ribbonServerList() {
        // 实例列表
        String listOfServers = "http://www.csdn.net,http://www.baidu.com,http://www.dongnaoedu.com";
        String[] splits = listOfServers.split(",");
        int len = splits.length;
        if (len == 0) {
            return new StaticServerList<Server>();
        }

        Server[] servers = new Server[len];
        for (int i = 0; i < len; i++) {
            servers[i] = new Server(splits[i].trim());
        }
        // 返回这个...静态的
        return new StaticServerList<Server>(servers);
    }

    // 负载策略
    @Bean
    public IRule iniRule() {
        // 轮询
         return new RoundRobinRule();

        // 随机
//      return new RandomRule();
    }

}

3、配置文件

在application.yml文件中配置

# 定义一个针对service-by-properties服务的负载均衡器。服务实例信息来自配置文件
# 服务名
service-by-properties:
  # 服务实例列表
  listOfServers: http://www.csdn.net,http://www.baidu.com,http://www.dongnaoedu.com
  ribbon:
    # 负载策略
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
    # 设置它的服务实例信息来自配置文件, 如果不设置NIWSServerListClassName就会去euereka里面找
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList

二、三种使用方式 feign,LoadBalancerClient,resttemplate

1、LoadBalancerClient的方式

package com.dongnaoedu.springcloud.examples.way;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// LoadBalancerClient的方式
@RestController
@RequestMapping("/loadbalance")
public class TestLoadBalancerClientController {
    static Logger logger = LoggerFactory.getLogger(TestLoadBalancerClientController.class);
    @Autowired
    LoadBalancerClient loadbalancerClient; // spring cloud 封装的 关于负载均衡组件 ribbon的工具类

    //下面三个方法对应三种配置方式

    // properties
    @RequestMapping("/properties")
    public void properties() {
        ServiceInstance serviceInstance = loadbalancerClient.choose("service-by-properties");
        logger.warn("TestLoadBalancerClientController.properties执行结果:{}", serviceInstance.getUri());
    }

    // annotation
    @RequestMapping("/annotation")
    public void annotation() {
        ServiceInstance serviceInstance = loadbalancerClient.choose("service-by-annotation");
        logger.warn("TestLoadBalancerClientController.annotation执行结果:{}", serviceInstance.getUri());
    }

    // eureka
    @RequestMapping("/eureka")
    public void eureka() {
        ServiceInstance serviceInstance = loadbalancerClient.choose("lession-4-sms-interface");
        logger.warn("TestLoadBalancerClientController.eureka执行结果:{}", serviceInstance.getUri());
    }
}

2、resttemplate的方式

/**
 *
 */
package com.dongnaoedu.springcloud.examples.way;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

// resttemplate的方式
@RestController
@RequestMapping("/resttemplate")
@Configuration
public class TestResttemplateController {
    static Logger logger = LoggerFactory.getLogger(TestResttemplateController.class);

    @Bean
    @LoadBalanced // 这个注解一定要加,不然LoadBalancerAutoConfiguration不会对它进行处理
    RestTemplate RestTemplate() {
        // ribbon feign是一个公司开源,很好的集成
        // resttemplate是spring的
        // 这是为了设置超时
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setReadTimeout(2000);
        simpleClientHttpRequestFactory.setConnectTimeout(2000);
        return new RestTemplate(simpleClientHttpRequestFactory);
    }

    @Autowired
    RestTemplate restTemplate; // spring内置,封装了http请求的工具类
    //下面对应三种配置方式
    // properties
    @RequestMapping("/properties")
    public void properties() {
        // http://127.0.0.1:8080/sss
        // service-by-properties 通过名称 找到负载均衡器,负载均衡器会选择一个具体的实例
        String body = restTemplate.getForObject("http://service-by-properties/", String.class);
        testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口
    }

    // annotation
    @RequestMapping("/annotation")
    public void annotation() {
        String body = restTemplate.getForObject("http://service-by-annotation/", String.class);
        testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口
    }

    // eureka
    @RequestMapping("/eureka")
    public void eureka() {
        String body = restTemplate.getForObject("http://lession-4-sms-interface/sms", String.class);
        logger.warn("TestResttemplateController.eureka执行结果:{}", body);
    }

    // 仅仅是为了根据输出内容来判断是调用的哪个接口
    private void testprint(String body) {
        if (body.contains("dongnaoedu")) {
            logger.warn("根据负载均衡策略,选择实例:dongnaoedu.com");
        } else if (body.contains("csdn")) {
            logger.warn("根据负载均衡策略,选择实例:csdn.net");
        } else if (body.contains("baidu")) {
            logger.warn("根据负载均衡策略,选择实例:baidu.com");
        } else {
            logger.warn("火星....");
        }
    }

}

3、feign的方式

package com.dongnaoedu.springcloud.examples.way;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

// Feign的方式
@RestController
@RequestMapping("/feign")
public class TestFeignController {
    static Logger logger = LoggerFactory.getLogger(TestFeignController.class);
    // properties
    @Autowired
    FeignPropertiesClient feignPropertiesClient;

    @RequestMapping("/properties")
    public void properties() {
        String body = feignPropertiesClient.index();
        testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口
    }

    // annotation
    @Autowired
    FeignAnnotationClient feignAnnotationClient;

    @RequestMapping("/annotation")
    public void annotation() {
        String body = feignAnnotationClient.index();
        testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口
    }

    // eureka
    @Autowired
    FeignEurekaClient feignEurekaClient;

    @RequestMapping("/eureka")
    public void eureka() {
        String body = feignEurekaClient.index();
        logger.warn("TestFeignController.eureka执行结果:{}", body);
    }

    // 仅仅是为了根据输出内容来判断是调用的哪个接口
    private void testprint(String body) {
        if (body.contains("dongnaoedu")) {
            logger.warn("根据负载均衡策略,选择实例:dongnaoedu.com");
        } else if (body.contains("csdn")) {
            logger.warn("根据负载均衡策略,选择实例:csdn.net");
        } else if (body.contains("baidu")) {
            logger.warn("根据负载均衡策略,选择实例:baidu.com");
        } else {
            logger.warn("火星....");
        }
    }
}

@FeignClient(name = "service-by-properties")
interface FeignPropertiesClient {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index();
}

@FeignClient(name = "service-by-annotation")
interface FeignAnnotationClient {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index();
}

@FeignClient(name = "lession-4-sms-interface")
interface FeignEurekaClient {
    @RequestMapping(value = "/timeout/test", method = RequestMethod.GET)
    public String index();

}

补充:
1、eureka配置方式设置超时

ribbon:
  # 开启eureka与ribbon的集成
  eureka:
    enabled: true
  # 暂不开启熔断机制
  hystrix:
    enabled: false
  # 配置ribbon默认的超时时间
  ConnectTimeout: 2000
  ReadTimeout: 2000
  # 是否开启重试
  OkToRetryOnAllOperations: true
  # 重试期间,实例切换次数  比如:100个实例,我只会在四个实例上面去重试
  MaxAutoRetriesNextServer: 3
  # 当前实例重试次数
  MaxAutoRetries: 2

2、resttemplate配置方式设置超时

@Bean
    @LoadBalanced // 这个注解一定要加,不然LoadBalancerAutoConfiguration不会对它进行处理
    RestTemplate RestTemplate() {
        // ribbon feign是一个公司开源,很好的集成
        // resttemplate是spring的
        // 这是为了设置超时
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setReadTimeout(2000);
        simpleClientHttpRequestFactory.setConnectTimeout(2000);
        return new RestTemplate(simpleClientHttpRequestFactory);
    }
时间: 2024-08-19 09:22:16

ribbon客户端负载均衡的相关文章

编码实现Spring Cloud微服务负载均衡调用(eureka、ribbon)

Spring 封装.揉和了一批开源项目,其中以Netflix开源的为主,比如zuul.eureka.hystrix.robbin等:然后就有了现在的Spring cloud微服务架构.这也充分展现了Spring的揉合能力. Spring cloud通过封装使这些项目融入spring的bean管理机制中,从而方便使用.这套微服务的核心功能还是使用这些项目的. 由本篇的标题可以想到本篇就是不使用Spring的注解和配置来使用这套微服务.看看现在网上关于Spring cloud的示例,千篇一律那几行注

Oracle RAC 负载均衡测试(结合服务器端与客户端)

        Oracle RAC 负载均衡使得从客户端发起的连接能够有效地分配到监听器负载较小的实例上.有两种方式实现客户端负载均衡,一是通过配置客户端的load_balance,一是通过配置服务器端的remote_listener参数.两种方式各有优劣,而且两者并不相互排斥,因此可以结合两种方式来更加有效的实现负载均衡.本文将描述两者结合的使用情况(oralce 10g rac).         有关客户端与服务端负载均衡的单独测试请参考:              Oracle RAC

Java微服务开发指南 -- 集群管理、失败转移和负载均衡的实践

集群管理.失败转移和负载均衡的实践     在前一章节中,我们快速的介绍了集群管理.Linux容器,接下来让我们使用这些技术来解决微服务的伸缩性问题.作为参考,我们使用的微服务工程来自于第二.第三和第四章节(Spring Boot.Dropwizard和WildFly Swarm)中的内容,接下来的步骤都适合上述三款框架. 开始     我们需要将微服务打包成为Docker镜像,最终将其部署到Kubernetes,首先进入到项目工程hola-springboot,然后启动jboss-forge,

如何配置Oracle RAC负载均衡和故障转移

Oracle负载均衡主要是指新会话连接到RAC数据库时,如何判定这个新的连接要连到哪个节点进行工作?通常情况下,负载均衡分为客户端负载均衡与服务器端负载均衡.客户端负载均衡通常是在客户端的tnsnames.ora中多添加一个链接地址以及LOAD_BALANCE与failover参数.而服务器端的负载均衡则相对复杂,下面具体描述服务器端负载均衡. 一.负载均衡 注意这里的负载均衡指的是连接的负载均衡,即客户可以随机从不同的实例中连接到数据库 1.配置tnsnames.ora使得该文件中包含如下全部

Oracle RAC:负载均衡简介

负载均衡是指把负载平均分配到集群中的各个节点,从而提高整体性能.Oracle RAC提供 两种方式实现负载均衡,第一种是纯技术手段,即在用户连接时,根据系统当前的负载情况 决定由哪个节点处理用户请求:第二种是面向业务,人为的把应用切分成很多service,通过 某个service过来的连接请求都由某个节点处理.下面来具体看看这两种手段: 纯技 术手段 (面向连接的负载均衡) 1. 客户端负载均衡 配置方法是在客户端 tnsnames.ora文件中设置LOAD_BALANCE=YES,当客户端发起

Oracle] RAC 之 - 负载均衡深入解析

负载均衡是指把负载平均分配到集群中的各个节点,从而提高整体性能.Oracle RAC提供两种方式实现负载均衡,以下就为大家详细介绍一下,需要的朋友可以参考下   Oracle RAC提供两种方式实现负载均衡,第一种是纯技术手段,即在用户连接时,根据系统当前的负载情况决定由哪个节点处理用户请求:第二种是面向业务,人为的把应用切分成很多service,通过某个service过来的连接请求都由某个节点处理.下面来具体看看这两种手段: 纯技术手段 (面向连接的负载均衡) 1. 客户端负载均衡配置方法是在

[Oracle] RAC 之 - 负载均衡深入解析_oracle

Oracle RAC提供两种方式实现负载均衡,第一种是纯技术手段,即在用户连接时,根据系统当前的负载情况决定由哪个节点处理用户请求:第二种是面向业务,人为的把应用切分成很多service,通过某个service过来的连接请求都由某个节点处理.下面来具体看看这两种手段: 纯技术手段 (面向连接的负载均衡) 1. 客户端负载均衡配置方法是在客户端tnsnames.ora文件中设置LOAD_BALANCE=YES,当客户端发起连接时,会从地址列表中随机选取一个,把连接请求随机分散给各个实例.这个技术的

配置 RAC 负载均衡与故障转移

    Oracle负载均衡主要是指新会话连接到RAC数据库时,如何判定这个新的连接要连到哪个节点进行工作?通常情况下,负载均衡分为客户端负载均衡与服务器端负载均衡.客户端负载均衡通常是在客户端的tnsnames.ora中多添加一个链接地址以及LOAD_BALANCE与failover参数.而服务器端的负载均衡则相对复杂,下面具体描述服务器端负载均衡.    一.负载均衡    注意这里的负载均衡指的是连接的负载均衡,即客户可以随机从不同的实例中连接到数据库    1.配置tnsnames.or

【RAC】RAC中的负载均衡和故障切换--TAF配置

[RAC]RAC中的负载均衡和故障切换--TAF配置 涉及到的内容包括:   Oracle RAC 客户端连接负载均衡(Load Balance)      实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力.通常情况下有两种方式来实现负载均衡,一个是基于客户端连接的负载均衡,一个是基于服务器端监听器(Listener)收集到的信息来将新的连接请求分配到连接数较少实例上的实现方式.本文主要讨论的是基于客