springCould中的Ribbon-从小白开始【5】

目录

1.什么是Ribbo❤️❤️❤️

2.eureka自带Ribbon❤️❤️❤️

[3. RestTemplate](#3. RestTemplate)❤️❤️❤️

4.IRule❤️❤️❤️

5.负载均衡算法❤️❤️❤️


1.什么是Ribbo

  • 1.Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡的工具。
  • 2.主要功能是提供客户端的软件负载均衡算法和服务调用
  • 3.Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
  • 4.在配置文件中列出Load Balancer (简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。

2.eureka自带Ribbon

之前没引入Ribbon为啥也能负载均衡?

因为我们引入eureka时,eureka自动引入了ribbon

3. RestTemplate

restTemplate有两种方式:

  • 1.restTempalte.getForObject
  • 2.restTemplate.getForEntity
java 复制代码
  @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Integer id) {
        log.info("进入查询功能成功");
        return restTemplate.getForObject(PAYMENT_URL + "/payment/selectById/" + id, CommonResult.class);
    }

    @GetMapping("/payment/get2/{id}")
    public CommonResult<Payment> getPayment2(@PathVariable("id") Integer id) {
        log.info("进入查询功能成功");
        ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/selectById/" + id, CommonResult.class);
        if (entity.getStatusCode().is2xxSuccessful()){
            log.info(entity.getStatusCode()+"\t"+entity.getHeaders());
            return entity.getBody();
        }else {
            return new CommonResult<>(404,"查询失败~");
        }
    }

4.IRule

4.1轮询策略

  • 1.RoundRobinRule --------轮询
  • 2.RandomRule ---------随机
  • 3.RetryRule ---------重试 (先轮询,如果失败,在执行时间内重试

4.2如何替换

1.创建配置类

注意:创建的配置类,不能被@ComponentSacn所扫描(不能与主启动类同包)

2.创建IRule对象

使用@Bean创建对象,根据要求返回具体实现类

java 复制代码
@Configuration
public class MySelfRule {
    @Bean
    public IRule myRule(){
        return new RandomRule();//定义为随机
    }
}

3.添加@RibbonClient

name属性:表示要访问服务的名称。(必须与Eureka中的名称一致,包括大小写)

configuration属性:表示要访问的自定义IRUle配置类

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
@RibbonClient(name = "COULD-PAYMENT-SERVICE",configuration = MySelfRule.class)
public class OrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class);
    }
}

5.负载均衡算法

5.1原理

  • **算法:**rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后rest接口计数从1开始。

例如:

List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");

获取实例:

List 0 instances = 127.0.0.1:8002

List 1 instances = 127.0.0.1:8001

8001和8002组成集群,共两台机器:

当总请求数为1时: 1%2=1对应下标位置为1 ,则获得服务地址为127.0.0.1:8001

当总请求数位2时: 2%2=0对应下标位置为0,则获得服务地址为127.0.0.1:8002

当总请求数位3时: 3%2=1对应下标位置为1 ,则获得服务地址为127.0.0.1:8001

当总请求数位4时: 4%2=0对应下标位置为0,则获得服务地址为127.0.0.1:8002

5.2手写轮询

  • 自定义轮询算法
java 复制代码
@Component
public class MyLb implements LoadBalance {

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    public final int getAndIncrement() {
        int current;
        int next;
        do {
            current = this.atomicInteger.get();
            next = current >= Integer.MAX_VALUE ? 0 : current + 1;
        } while (!this.atomicInteger.compareAndSet(current, next));
        System.out.println("next:" + next);
        return next;
    }

    @Override
    public ServiceInstance instances(List<ServiceInstance> serviceInstance) {
        int index = getAndIncrement() % serviceInstance.size();

        return serviceInstance.get(index);
    }
}
  • 80服务使用自定义轮询
java 复制代码
    //自己的负载均衡算法
    @Autowired
    private LoadBalance loadBalance;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/payment/lb")
    public String getPaymentLb() {
        List<ServiceInstance> instances = discoveryClient.getInstances("COULD-PAYMENT-SERVICE");
        if (instances == null || instances.size() < 0) {
            return null;
        }
        ServiceInstance serviceInstance=loadBalance.instances(instances);
        URI uri = serviceInstance.getUri();
        return restTemplate.getForObject(uri+"/payment/lb",String.class);
    }

相关推荐
下辈子不要当码农9 分钟前
Day7-Linux软件编程(进程与线程(3))
java·开发语言
AI多Agent协作实战派10 分钟前
AI多Agent协作系统实战(五十二):我删了定时器,进程还在偷偷干活
后端
星火102412 分钟前
【从 0 到 1 动手造 Agent】02、确定性铁笼 LangGraph
人工智能·后端·agent
唐青枫14 分钟前
别把 Debug 和 Release 混为一谈:Zig Build Mode 全面解析
后端
A_nanda15 分钟前
拆解ASP.NET Core 底层源码!从零手写
后端·asp.net
钱栈up17 分钟前
别忽略INFO日志:我用AI编码助手1小时修完3个接口的隐藏Bug
后端·json·trae
星火102418 分钟前
【从 0 到 1 动手造 Agent】03、给 Agent 装上操作系统——MemGPT/Letta 内存分层与自我演化
人工智能·后端·agent
万物智能18 分钟前
OpenHarmony源码树解剖—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
前端·后端
深入云栈20 分钟前
一文搞懂Netty 4.2六大核心概念:Channel/EventLoop/Selector/ByteBuf 如何关联
java·后端
hh95023 分钟前
Agent Plan × DeepSeek Harness:角色 Prompt 驱动的 Agent 分工优化与协作质量实验
java·前端·人工智能·prompt·adg·agent plan·adg成都社区