03、SpringCloud之Ribbon(netflix)学习笔记(一)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 03、SpringCloud之Ribbon(netflix)学习笔记(一)

一、认识Ribbon


1.1、介绍Ribbon


Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以


让我们轻松地将面向服务的 REST 模版请求 自动转换成客户端负载均衡的服务调用。 轮询 hash 权重 …


简单的说 Ribbon 就是 netfix 公司的一个开源项目,主要功能是提供客户端负载均衡算法和 服务调用。


Ribbon 客户端组件提供了一套完善的配置项,比如连接超时,重试等。 在 Spring Cloud 构建的微服务系统中, Ribbon 作为服务消费者的负载均衡器,有两种使 用方式,一种是和 RestTemplate 相结合,另一种是和 OpenFeign 相结合。


OpenFeign 已经 默认集成了 Ribbon,关于 OpenFeign 的内容将会在下一章进行详细讲解。Ribbon 有很多子 模块,但很多模块没有用于生产环境!



1.2、负载均衡协议


负载均衡,英文名称为 Load Balance(LB)http:// lb://(负载均衡协议) ,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如 Web 服务器、 企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。


负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。


服务器的负载均衡



二、实战—快速集成Ribbon组件


目标:借助使用Ribbon组件集成到SpringCloud实现负载均衡【针对于某个服务的集群模式】。


项目版本环境:


SpringBoot:2.3.12.RELEASE

SpringCloud:Hoxton.SR12


2.1、前提准备(provider生产者)


想要完成这一个ribbondemo,首先需要准备一个Eureka Server服务端,还有两个provider生产端。



Eureake-Server使用的时之前的案例demo,然后最新的两个生产方则时最新创建的。其实这两个provider本质就是两个Eureka-client,在启动时都会注册到Server服务端中。


创建两个provider的流程与之前的相同,这里给出两个配置文件以及各自暴露的接口:


① provider-a:
application.yml:
server:
    port: 8080
spring:
    application:
      name: provider
eureka:
  client:
      service-url:
        defaultZone: http://localhost:8761/eureka
  instance:
      hostname: locahost
      prefer-ip-address: true
      instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}


controller/ProviderController.java:


package com.changlu.ribbonprovidera.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Description:
 * @Author: changlu
 * @Date: 4:58 PM
 */
@RestController
public class ProviderController {
    @GetMapping("/hello")
    public String hello(){
        return "我是服务提供者aaa";
    }
}


②provider-b:


application.yml:
server:
  port: 8081
spring:
  application:
    name: provider
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    hostname: localhost
    prefer-ip-address: true
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}


controller/ProviderController.java:


package com.changlu.ribbonproviderb.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Description:
 * @Author: changlu
 * @Date: 4:58 PM
 */
@RestController
public class ProviderController {
    @GetMapping("/hello")
    public String hello(){
        return "我是服务提供者bbb";
    }
}



暴露的接口返回的不是同一个内容,主要目的是为了之后的测试。


我们将这三个服务启动起来:



访问:http://localhost:8761/


可以看到此时provider应用有两个服务,之后我们的目标就是这个provider应用对其进行负载均衡:



2.2、创建消费者consumer



创建一个Eureka-Client项目:


SpringBoot:2.3.1.RELEASE
SpringCloud:Hoxton.SR12
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>


配置如下:


server:
  port: 8082
spring:
  application:
    name: consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    hostname: localhost
    prefer-ip-address: true
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}


开启EureakClient:


@EnableEurekaClient


2.3、消费者集成Ribbon组件(两种方案)


前提


若是我们想要实现一个负载均衡的功能,那么我们引入netflix的ribbon依赖:


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>


实践


方式一:增强RestTemplate方法,使其具备负载均衡功能。


如何增强呢?我们来RestTemplate来在注入过程中进行增强。


package com.changlu.ribbonconsumer.config;
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;
/**
 * @Description: 个人配置类
 * @Author: changlu
 * @Date: 5:03 PM
        */
@Configuration
public class MyConfig {
    @Bean
    @LoadBalanced   //使用负载均衡器
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}



controller/ConsumerController.java:


package com.changlu.ribbonconsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
 * @Description:
 * @Author: changlu
 * @Date: 4:56 PM
 */
@RestController
public class ConsumerController {
    //方式一:增强版的RestTemplate(附带负载均衡)
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/testRibbon")
    public String testRibbon(String serviceId) {
        String url = "http://" + serviceId + "/hello";
        String content = restTemplate.getForObject(url, String.class);
        return content;
    }
}


启动服务后我们来进行测试:http://localhost:8082/testRibbon?serviceId=provider




思路如下:


思考 ribbon是怎么将 http://provider/hello 路径请求成功的【本质:对服务名来进行服务发现并进行替换发送请求】
1.拦截这个请求
2.截取主机名称
3.借助eureka来做服务发现 list<> (127.0.0.1:8080、127.0.0.1:8081)
4.通过负载均衡算法 拿到一个服务ip port,举例如:http://127.0.0.1:8080/hello
5.reConstructURL


方法二:直接使用ribbon给我们提供的客户端


package com.changlu.ribbonconsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
 * @Description:
 * @Author: changlu
 * @Date: 4:56 PM
 */
@RestController
public class ConsumerController {
  //方式二:使用ribbon提供的客户端来进行负载均衡获取服务
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @GetMapping("/testRibbon2")
    public String testRibbon2(String serviceId) {
        //根据服务来进行选择一个实例
        ServiceInstance choose = loadBalancerClient.choose(serviceId);
        return choose.toString();
    }
}


访问路径:http://localhost:8082/testRibbon2?serviceId=provider



相关实践学习
通过ACR快速部署网站应用
本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3天前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。
|
24天前
|
安全 Java 开发者
Java一分钟之-Spring Cloud Netflix Eureka:服务注册与发现
【6月更文挑战第8天】Spring Cloud Eureka是微服务架构的关键,提供服务注册与发现功能。本文讲解Eureka工作原理、配置、常见问题及解决方案。Eureka包含Server(管理服务状态)和Client(注册服务实例并发现服务)。快速入门包括启动Eureka Server和创建Eureka Client。常见问题涉及服务注册不上、服务下线和客户端注册信息不准确,可通过检查网络、理解自我保护机制和配置元数据解决。此外,文中还提及健康检查、安全配置和集群部署等高级实践,以增强系统健壮性和扩展性。
61 8
|
23天前
|
监控 Java UED
Java一分钟之-Spring Cloud Netflix Hystrix:容错管理
【6月更文挑战第9天】Spring Cloud Hystrix是用于微服务容错管理的库,通过断路器模式防止服务雪崩。本文介绍了Hystrix的基本概念,如断路器、线程隔离和fallback机制,并展示了如何快速上手,包括添加依赖、启用注解和编写Hystrix命令。此外,还讨论了常见问题(如断路器打开、资源泄漏和不当的Fallback策略)及其解决方案。通过自定义Hystrix指标监控,可以进一步优化系统性能。理解Hystrix工作原理并适时调整配置,对于构建健壮的微服务至关重要。
132 3
|
23天前
|
缓存 负载均衡 Java
Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
82 3
|
3天前
|
Java Maven 微服务
Spring Cloud Netflix 之 Eureka
Spring Cloud Netflix Eureka是服务发现组件,由Netflix开发,Spring Cloud集成为微服务治理工具。Eureka采用客户端/服务器架构,包含Eureka Server(服务注册中心)和Eureka Client(服务提供者和服务消费者)。服务提供者注册到Eureka Server,服务消费者通过它查找并调用服务。
|
2月前
|
负载均衡
【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载
【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载
27 0
|
2月前
|
负载均衡 算法
SpringCloud&Ribbon负载均衡原理与实践
SpringCloud&Ribbon负载均衡原理与实践
31 3
|
2月前
|
JSON 负载均衡 Java
Spring Cloud Ribbon:负载均衡的服务调用
Spring Cloud Ribbon:负载均衡的服务调用
74 0
|
2月前
|
负载均衡 算法 Java
第五章 Spring Cloud Netflix 之 Ribbon
第五章 Spring Cloud Netflix 之 Ribbon
30 0
|
2月前
|
负载均衡 算法 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
41 0