一 概念

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。 常见的负载均衡有软件Nginx,LVS,硬件 F5等。 相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。

Ribbon概述
是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中,
Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读
取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。
在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的
列表信息,并基于内置的负载均衡算法,请求服务

Ribbon的主要作用
(1)服务调用
基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助
RestTemplate 最终进行调用
(2)负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

二 Ribbon配置初步

  • 启动一中的eureka-server项目和producer-service项目,然后再改producer-service的端口,启动2个客户端

    • 修改producer-service的类

       @RestController
      @RequestMapping("/api/v1/product")
      public class ProductController {



      @Value("${server.port}")
      private String port;

      @Autowired
      private ProductService productService;

      /**
      * 获取所有商品列表
      * @return
      */
      @RequestMapping("list")
      public Object list(){
      return productService.listProduct();
      }


      /**
      * 根据id查找商品详情
      * @param id
      * @return
      */
      @RequestMapping("find")
      public Object findById(int id){

      Product product = productService.findById(id);

      Product result = new Product();
      BeanUtils.copyProperties(product,result);
      result.setName( result.getName() + " data from port="+port );
      return result;
      }
  • 创建order-serveice项目

    • pom.xml

      <dependencies>
      <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>
      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
      </dependency>

      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      </dependency>
      </dependencies>

      注:在springcloud的新版本中提供的服务发现的jar中以及包含了Ribbon的依赖。所以这里不需要导入任何额外的坐标(spring-cloud-starter-netflix-ribbon)

    • 启动类

       @SpringBootApplication
      public class OrderServiceApplication {

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


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


      }
    • Web层

      @RestController
      @RequestMapping("/api/v1/order")
      public class OrderController {


      @Autowired(required = false)
      private ProductOrderServiceImpl productOrderService;


      @RequestMapping("/save")
      public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId){

      return productOrderService.save(userId, productId);
      }




      }
    • Service层

      @Service
      public class ProductOrderServiceImpl {


      @Autowired
      private RestTemplate restTemplate;

      public ProductOrder save(int userId, int productId) {
      System.out.println("123");

      Object obj = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, Object.class);

      System.out.println(obj);

      ProductOrder productOrder = new ProductOrder();
      productOrder.setCreateTime(new Date());
      productOrder.setUserId(userId);
      productOrder.setTradeNo(UUID.randomUUID().toString());

      return productOrder;
      }
      }
    • Bo类

      /**
      * 商品订单实体类
      */
      public class ProductOrder implements Serializable {


      private int id;

      /**
      * 商品名称
      */
      private String productName;

      /**
      * 订单号
      */
      private String tradeNo;

      /**
      * 价格,分
      */
      private int price;


      private Date createTime;


      private int userId;

      private String userName;


      public int getUserId() {
      return userId;
      }

      public void setUserId(int userId) {
      this.userId = userId;
      }

      public String getUserName() {
      return userName;
      }

      public void setUserName(String userName) {
      this.userName = userName;
      }

      public int getId() {
      return id;
      }

      public void setId(int id) {
      this.id = id;
      }

      public String getProductName() {
      return productName;
      }

      public void setProductName(String productName) {
      this.productName = productName;
      }

      public String getTradeNo() {
      return tradeNo;
      }

      public void setTradeNo(String tradeNo) {
      this.tradeNo = tradeNo;
      }

      public int getPrice() {
      return price;
      }

      public void setPrice(int price) {
      this.price = price;
      }

      public Date getCreateTime() {
      return createTime;
      }

      public void setCreateTime(Date createTime) {
      this.createTime = createTime;
      }
      }
    • 配置文件

      server:
      port: 8781


      #指定注册中心地址
      eureka:
      client:
      serviceUrl:
      defaultZone: http://localhost:8761/eureka/

      #服务的名称
      spring:
      application:
      name: order-service
    • 结果:2个结果在轮询

{id=1, name=iphonex data from port=8772, price=9999, store=10}
{id=1, name=iphonex data from port=8771, price=9999, store=10}
{id=1, name=iphonex data from port=8772, price=9999, store=10}
{id=1, name=iphonex data from port=8771, price=9999, store=10}
{id=1, name=iphonex data from port=8772, price=9999, store=10}
{id=1, name=iphonex data from port=8771, price=9999, store=10}

如要修改它的负载均衡策略:

service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

SpirngCloud之Ribbon负载均衡(二)的更多相关文章

  1. spring-cloud: eureka之:ribbon负载均衡自定义配置(二)

    spring-cloud: eureka之:ribbon负载均衡自定义配置(二) 有默认配置的话基本上就是轮询接口,现在我们改用自定义配置,同时支持:轮询,随机接口读取 准备工作: 1.eureka服 ...

  2. spring cloud学习笔记二 ribbon负载均衡

    Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求.Ribb ...

  3. Ribbon负载均衡(四)

    一.Ribbon定义 spring cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡工具 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端 ...

  4. SpringCloud微服务实现生产者消费者+ribbon负载均衡

    一.生产者springcloud_eureka_provider (1)目录展示 (2)导入依赖 <dependency> <groupId>org.springframewo ...

  5. SpringCloud的入门学习之概念理解、Ribbon负载均衡入门

    1.Ribbon负载均衡,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端.负载均衡的工具. 答:简单的说,Ribbon是Netflix发布的开源项目,主要功能 ...

  6. SpringCloud之Ribbon负载均衡配置

    一.负载均衡解决方案分类及特征 业界主流的负载均衡解决方案有: 1.1 集中式负载均衡 即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责 ...

  7. springcloud(十四)、ribbon负载均衡策略应用案例

    一.eureka-server服务中心项目不再创建 二.eureka-common-empdept公共组件项目不再掩饰 三.创建eureka-client-provider-empdept-one提供 ...

  8. SpringCloud之Ribbon负载均衡策略

    Spring Cloud 微服务架构学习记录与示例 一.认识Ribbon 首先咱们需要认识下负载均衡,一般分为服务器端负载和客户端负载均衡. 服务器端负载均衡:比如Nginx.F5,请求达到服务器后由 ...

  9. Spring Cloud06: Ribbon 负载均衡

    一.使用背景 前面的学习中,我们已经使用RestTemplate来实现了服务消费者对服务提供者的调用,如果在某个具体的业务场景下,对某个服务的调用量突然大幅提升,这个时候就需要对该服务实现负载均衡以满 ...

随机推荐

  1. 使用 .gitignore 忽略 Git 仓库中的文件

    .gitignore 在Git中,很多时候你只想将代码提交到仓库,而不是将当前文件目录下的文件全部提交到Git仓库中,例如在MacOS系统下面的.DS_Store文件,或者是Xocde的操作记录,又或 ...

  2. 深度解密Go语言之反射

    目录 什么是反射 为什么要用反射 反射是如何实现的 types 和 interface 反射的基本函数 反射的三大定律 反射相关函数的使用 代码样例 未导出成员 反射的实际应用 json 序列化 De ...

  3. 利用Python与selenium自动化模拟登陆12306官网!

    近年来,12306的反爬越来越来严重,从一年前的 获取tk参数后到现在增加了 JS.CSS等加密方式! 目前大部分人利用的登陆方式都是利用selenium ,此文也不例外. 环境:        Wi ...

  4. Mybatis面试题吐血总结

    高强度训练第二十天总结:Mybatis面试题 什么是Mybatis? Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力 ...

  5. 从React-Native坑中爬出,我记下了这些

    吐槽 如果React-Native是个人,我估计已经想要打死他了... 上一篇文章 当React开发者初次走进React-Native的世界 前言 最近因为业务需要,做了一些关于React-Nativ ...

  6. Mac 安装node npm cnpm vue 以及卸载 node 和 npm 的方法 清空npm缓存的方法

    S01 安装node(内含npm) 首先,到官网下载长期支持版,截止目前,最新的长期支持版本号是10.16.3 https://nodejs.org/zh-cn/download/ 下载完毕后,安装该 ...

  7. Network in Network(2013),1x1卷积与Global Average Pooling

    目录 写在前面 mlpconv layer实现 Global Average Pooling 网络结构 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 <Net ...

  8. Node.js入门教程 第五篇 (Express框架)

    Express框架 Express是适用于Node.js web的框架,提供了大量实用功能,例如路由功能及http功能. Express 框架核心特性: 可以设置中间件来响应 HTTP 请求. 定义了 ...

  9. python编程基础之十六

    for in 循环,与其说是循环不如说精确点交遍历 for 变量名 in + 迭代对象 语句A else: 语句B 作用:一次访问迭代对象中的元素并赋值给变量 循环终止时,执行else语句块,如果br ...

  10. sudo 提示 'xxx is not in the sudoers file.This incident will be reported.的解决方法'

    在使用 Linux 的过程中,有时候需要临时获取 root 权限来执行命令时,一般通过在命令前添加 sudo 来解决. 但是第一次使用 sudo 时,有可能会得到这样一个错误提示 xxx is not ...