SpringCloud Ribbon客户端负载均衡

一、开始

本文介绍Ribbon,我们需要去思考解决的问题:

  1. Ribbon是什么?
  2. Ribbon能干什么?
  3. Ribbon和nignx的区别?
  4. Ribbon实现负载均衡的策略?
  5. SpringCloud使用Ribbon实现负载均衡。
二、Ribbon是什么?

spring cloud ribbon 是一个基于HTTP 和 TCP 的客户端负载均衡工具,它基于Netflix Ribbon 实现。通过Spring Cloud 的封装,可以轻松的将面向服务的REST模块请求自动转换为客户端负载均衡的服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等,简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。后续要介绍的 Feign,它也是基于Ribbon实现的工具。

SpringCloud Ribbon客户端负载均衡_第1张图片
image.png

简之,Ribbon会获取Eureka Server上服务注册列表上的地址,然后在服务消费者本地上通过一定的策略规则去选择合适的地址,将请求发送到对应的服务提供者实例上,实现客户端的负载均衡。

三、Ribbon能干什么?

LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。

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

相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。
服务端负载均衡LB:即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方。
客户端负载均衡LB: 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

Ribbon就属于客户端负载均衡,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址

四、Ribbon和nginx的区别?

Ribbon客户端负载均衡:原理:在调用接口的时候,会在eureka注册中心上获取信息服务列表,获取到之后,缓存在jvm本地,通过一定策略选择服务实例,让你使用本地实现rpc远程调用技术进行调用,即是客户端实现负载均衡。

Nginx是服务端负载均衡,客户端将所有请求发送给nignx,然后再由nginx实现转发请求,即是负载均衡有服务端实现的。

应用场景:ribbon本地负载均衡适合微服务rpc远程调用,比如dubbo,springcloud。
nginx服务端负载均衡适合针对服务端,比如tomcat,jetty。

五、Ribbon实现负载均衡的策略

这个负载策略配置说白了就是让 Ribbon 这个客户端负载均衡器怎么进行访问服务提供者列表。是轮流访问?随机访问?权重?等。

SpringCloud Ribbon客户端负载均衡_第2张图片
image.png

默认为轮询策略。

六、SpringCloud使用Ribbon实现负载均衡

首先,我们需要去启动Eureka注册中心,启动两个不同端口的相同服务。
我们可以将服务通过maven install 导成jar包,然后通过命令行去启动两个服务。

java -jar springboot-java-0.0.1-SNAPSHOT.jar --server.port=9001

这样,就能看到这个服务有两个用例在提供


SpringCloud Ribbon客户端负载均衡_第3张图片
服务消费

新建个项目,pom.xml如下



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.19.RELEASE
         
    
    com.travis.java
    springboot-java
    0.0.1-SNAPSHOT
    springboot-java
    Demo project for Spring Boot

    
        1.8
        Edgware.SR5
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.cloud
            spring-cloud-starter
        
            
            org.springframework.cloud
            spring-cloud-starter-eureka
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    



我们可以看下jar包依赖,在eureka包中已经帮我们引用了ribbon包,所以我们引用eureka包后能直接使用ribbon


SpringCloud Ribbon客户端负载均衡_第4张图片
image.png

在application.properties和application.java配置好,使其能注册到eureka
application.properties

spring.application.name=eureka-consumer
server.port=9010
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/

application

@EnableEurekaClient
@SpringBootApplication
public class SpringbootWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebApplication.class, args);
    }

        @Bean
        @LoadBalanced
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
}

需要在application 将restTemplate 在spring容器上生成,不然会报找不到restTemplate的错。

接着直接可以通过restTemplate调用eureka上的服务。

@RestController
public class TestController {
    
    @Autowired
    RestTemplate restTemplate;
    
    @RequestMapping(value="testConsumer",method=RequestMethod.GET)
    public String testConsumer()
    {
        String url="http://eureka-client/getTest";
        return restTemplate.getForEntity(url, String.class).getBody();
    }
}

下面是eureka-client 项目上的getTest方法:

@RestController
public class TestController {
    
    @Value("${server.port}")
    private String serverport;
    
    @RequestMapping("/getTest")
    public String getTest()
    {
        return "我的端口号是:"+serverport;
    }

}

启动注册中心,两个不同端口的eureka-client 服务,eureka-consumer服务作为消费者去调用eureka-client 服务。

SpringCloud Ribbon客户端负载均衡_第5张图片
image.png
SpringCloud Ribbon客户端负载均衡_第6张图片
根据负载均衡调用9002或9001端口的服务

你可能感兴趣的:(SpringCloud Ribbon客户端负载均衡)