开启一个spring cloud工程-第五步 使用Ribbon 实现负载均衡

Ribbon 负载均衡

什么是Ribbon
Spring Cloud Ribbon是一个负载均衡解决方案,Ribbon 是Netflix 发布的负载均衡器,Spring Cloud Ribbon 是给予Netfilx Ribbon 实现的,是一个用于对HTTP请求进行控制的负载均衡客户端。

在注册中心对Ribbon 进行注册之后,Ribbon 就可以基于某种负载均衡算法,如轮询、随机、加权轮询、加权随机等自动帮助服务消费者调用接口,开发者也可以根据具体需求自定义Ribbon负载均衡算法。实际开发中,Spring Cloud Ribbon 需要结合Spring Cloud Eureka 来使用,Eureka Server 提供所有可以调用的服务提供者列表,Ribbon 基于特定的负载均衡算法从这些服务提供者中选择要调用的具体实例。

1、 在父工程中创建一个新的Module ,pom.xml 添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
</dependencies>

可以看到,新建一个ribbon工程的依赖,也只需要eureka 客户端的依赖而已,ribbon实际上也是一个消费者而已。

2、增加application.yml 文件:

server:
  port: 8040
spring:
  application:
      name: ribbon
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

3、创建controller 。 把一开始创建的学生类 复制过来(与前面文章中的Student 实体类是一样的 )
在这里插入图片描述
实体类Student:

package com.southwind.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor                 //无参构造
@AllArgsConstructor                //有参构造
public class Student {
    
    
    private long id;
    private String name;
    private int age;

}

RibbonApplication 代码如下:

package com.southwind;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class RibbonApplication {
    
    
    public static void main(String[] args){
    
    
        SpringApplication.run(RibbonApplication.class,args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
}

@LoadBalanced :声明一个基于ribbon 的负载均衡 这里需要让RestTemplate 实现负载均衡,所以加上@LoadBalanced 即可实现

这样,Ribbon是实现负载均衡的代码就已经写好了

现在继续完善一下 RibbbonHandler 的代码,用于测试

RibbbonHandler:

package com.southwind.controller;

import com.southwind.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Collection;

@RestController
@RequestMapping("/ribbon")
public class RibbbonHandler {
    
    
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/findAll")
    public Collection<Student> findAll(){
    
    
        return restTemplate.getForEntity("http://provider/student/findAll",Collection.class).getBody();
    }
    @GetMapping("/index")
    public String index(){
    
    
       return restTemplate.getForObject("http://provider/student/index",String.class);
    }
}

这里的url 中的ip地址 为什么 不再是 localhost:8010 而换成了 provider(localhost:8010是服务提供者的ip地址),是因为我已经把服务提供者注册在注册中心了,而他在注册中心的名字就叫做provider ,所以可以使用provider 代替他的ip地址,其实provider 等同于 localhost:8010

在这里插入图片描述

index方法是用来 显示当前调用服务的端口号的,为了测试负载均衡。

现在测试一下。用我们上一篇文章中学到的一个工程开启两个不同端口服务的方法来实现负载均衡的测试。
1)启动注册中心,
2) 然后是使用 ProviderApplication启动类启动eurekaclient 工程,然后修改该工程的yml里的端口号(原先端口号是8010,现在改为8011 ,在运行状态下改),再使用 ProviderApplication2 (这个就是复制ProviderApplication 过来的)启动 eurekaclient 工程,这样,一个工程就启动了两个不同端口的服务
3) 最后启动ribbon 工程

在浏览器输入:localhost:8761

在这里插入图片描述

可以看到,两个不同端口的服务已经注册到注册中心了,ribbon工程也注册进去了
然后在浏览器访问 ribbon 服务
输入: localhost:8040/ribbon/index
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
可以看到,端口号为8010 和8011 的服务依次被调用,每次都是百分之五十的几率交替被调用,说明负载均衡已经成功实现

猜你喜欢

转载自blog.csdn.net/chenmaolin928/article/details/109161239
今日推荐