负载均衡Ribbon入门

本文介绍了负载均衡的基本概念,详细讲解了如何在Java中使用Ribbon实现负载均衡。通过配置provide1和provide2,展示了Ribbon在consumer中的应用,包括pom和yml配置,以及启动类、controller和服务层的设置。此外,还解释了Ribbon作为客户端负载均衡器的作用和其内置的负载均衡策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一,负载均衡

1,什么是分在均衡

2,自定义负载均衡

provide1的配置

provide2的配置 

consumer的配置

二,Ribbon

1,什么是Ribbon

2,基于ribbon实现负载均衡

测试:

一,负载均衡

1,什么是分在均衡

负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。也就是说把请求分摊到所拥有的服务器上。

2,自定义负载均衡

provide1的配置

pom文件

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
<!--        Nacos服务中心的启动器-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

yml文件

server:
  port: 8091
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.122.131:8848 #nacos注册中心的地址
  application:
    name: provider #注册到nacos的服务名

启动类

@SpringBootApplication
@EnableDiscoveryClient //把当前服务注册到nacos,并发现其它服务
public class RibbonProviderApp1 {

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

 controller

@RestController
@RequestMapping("/provider")
public class ProviderController {

    @Autowired
    private UserService userService;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}

service

//接口
public interface UserService {
    User getUserById(Integer id);
}

//实现类
@Service
public class UserServiceImpl implements UserService {
    @Override
    public User getUserById(Integer id) {
        return new User(id,"@遗失的风--1",18);
    }
}

provide2的配置 

 与provide1的配置基本一致,区别:yml配置的端口换一个,service的实现类的返回值换一个方便观察。

consumer的配置

pom文件配置

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

yml文件配置

server:
  port: 80

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.122.131:8848
  application:
    name: consumer

 启动类

@SpringBootApplication
@EnableDiscoveryClient //开启nacos,允许注册当前服务,并发现其它服务
public class RibbonConsumerApp {

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

config 

@Configuration
public class BeanConfig {

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

controller 

@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
	
	@Autowired
	private RestTemplate restTemplate;

	@Autowired
	private DiscoveryClient discoveryClient;

	private int index;

	@RequestMapping(value="/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		List<ServiceInstance> serviceList = 
            				discoveryClient.getInstances("ribbon-provider");

		//(1)随机方式获得服务
		//int currentIndex = new Random().nextInt(serviceList.size());
		//(2)轮询方式获得服务
		index=index + 1;
        int currentIndex = (index) % serviceList.size();
		
		ServiceInstance instance = serviceList.get(currentIndex);
		String serviceUrl = instance.getHost() + ":" + instance.getPort();
        System.out.println("serviceUrl:"+serviceUrl);
		String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
		return restTemplate.getForObject(url, User.class);
	}
}

二,Ribbon

1,什么是Ribbon

Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,默认提供 很多种负载均衡算法,例如轮询、随机 等等。

2,基于ribbon实现负载均衡

config

@Configuration
public class BeanConfig {

    /**
     * 拦截器
     *  1.通过ribbon-provider-->List<Service>--->使用负载均衡策略返回Service
     *  2.把ribbon-provider换成ip和端口
     */
    @LoadBalanced//开启负载均衡,默认是轮训策略
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    //随机策略
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

controller

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @Autowired
    public RestTemplate restTemplate;
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
       
        //使用ribbon的策略

        String url = "http://Ribbon-provider/provider/getUserById/"+id;
        return restTemplate.getForObject(url, User.class);

    }
}

测试:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值