zoukankan      html  css  js  c++  java
  • SpringCloud:Ribbon负载均衡

    1.概述

    Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端       负载均衡的工具。
     
    简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。

    Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。

    简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。

    我们也很容易使用Ribbon实现自定义的负载均衡算法。

    LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。

    负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。

    常见的负载均衡有软件Nginx,LVS,硬件 F5等。

    相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。

    集中式LB

    即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

    进程内LB

    将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

    Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

    关于负载均衡:https://www.cnblogs.com/danbing/p/7459224.html

    2.Ribbon初步配置

    修改microservicecloud-consumer-dept-80工程

    1.修改pom.xml文件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation
    ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.fdzang.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-consumer-dept-80</artifactId> <description>部门微服务消费者</description> <dependencies> <dependency><!-- 自己定义的api --> <groupId>com.fdzang.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <!-- Ribbon相关 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 修改后立即生效,热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>

    2.修改application.yml   追加eureka的服务注册地址

    server:
      port: 80
    
    
    eureka:
      client:
        register-with-eureka: false
        service-url: 
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

    3.对ConfigBean进行新注解@LoadBalanced    获得Rest时加入Ribbon的配置

    package com.fdzang.springcloud.cfgbeans;
    
    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;
    
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RetryRule;
    
    @Configuration
    public class ConfigBean{  //boot -->spring   applicationContext.xml --- @Configuration配置   ConfigBean = applicationContext.xml
    
        @Bean
        @LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端       负载均衡的工具。
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }

    4.主启动类DeptConsumer80_App添加@EnableEurekaClient

    package com.fdzang.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    
    import com.fdzang.myrule.MySelfRule;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class DeptConsumer80_App{
        public static void main(String[] args){
            SpringApplication.run(DeptConsumer80_App.class, args);
        }
    }

    5.修改DeptController_Consumer客户端访问类

    package com.fdzang.springcloud.controller;
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import com.fdzang.springcloud.entity.Dept;
    
    @RestController
    public class DeptController_Consumer
    {
    
        //private static final String REST_URL_PREFIX = "http://localhost:8001";
        private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
    
        /**
         * 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
         * ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
         */
        @Autowired
        private RestTemplate restTemplate;
    
        @RequestMapping(value = "/consumer/dept/add")
        public boolean add(Dept dept){
            return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
        }
    
        @RequestMapping(value = "/consumer/dept/get/{id}")
        public Dept get(@PathVariable("id") Long id){
            return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
        }
    
        @SuppressWarnings("unchecked")
        @RequestMapping(value = "/consumer/dept/list")
        public List<Dept> list(){
            return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
        }
        
        // 测试@EnableDiscoveryClient,消费端可以调用服务发现
        @RequestMapping(value = "/consumer/dept/discovery")
        public Object discovery()
        {
            return restTemplate.getForObject(REST_URL_PREFIX + "/dept/discovery", Object.class);
        }
    }

    先启动3个eureka集群后,再启动microservicecloud-provider-dept-8001并注册进eureka

    启动microservicecloud-consumer-dept-80

    Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号

    3.Ribbon负载均衡

    工作原理

    Ribbon在工作时分成两步

    第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.

    第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。

    其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。

    参考microservicecloud-provider-dept-8001,新建两份,分别命名为8002,8003

    新建8002/8003数据库,各自微服务分别连各自的数据库

    修改8002/8003各自YML

      只修改端口以及数据库连接,不修改实例名

     

    启动3个eureka集群配置区

    启动3个Dept微服务启动并各自测试通过

    启动microservicecloud-consumer-dept-80

    客户端通过Ribbo完成负载均衡并访问上一步的Dept微服务 注意观察看到返回的数据库名字,各不相同,负载均衡实现

    总结:Ribbon其实就是一个软负载均衡的客户端组件,

    他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。

  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/fdzang/p/9707558.html
Copyright © 2011-2022 走看看