一 概念

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. 国庆佳节第四天,谈谈我月收入增加 4K 的故事

    01.起承 在我下定决心改变的这将近 1 年的时间里,遇到了很多很多有故事的人,以及有趣的事.自我的认知改变特别大!尤其是收入,比去年同时期增加了 4K. 4K,可能也就买 100 斤猪肉.但是对于身 ...

  2. THINKPHP 中关联查询(多表查询)

    THINKPHP 中关联查询(多表查询)可以使用 table() 方法或和join方法,请看示例: 1.Table方法:定义要操作的数据表名称,可以动态改变当前操作的数据表名称,需要写数据表的全名,包 ...

  3. 特殊的ARP

    免费ARP 协议内容:是指主机发送ARP请求自己的IP地址 作用: 测试网络中是否存在相同的IP地址 更新网络中其他主机的地址绑定信息 补充:根据ARP协议规定,网络中的主机如果收到某个IP地址的AR ...

  4. Windows内核编程时的习惯与注意事项

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.内核编程注意细节: 在头文件中使用的是 <ntddk.h ...

  5. centos7版本以上root密码破解

    centos7版本以上root密码破解 主讲内容: 1.centos7版本以上root密码破解   一.centos7版本以上root密码破解 重启服务器,按键盘的方向键(上 下) 按e 进入紧急救援 ...

  6. 自己写的Weblogic的poc

    """ 暂时只试用于Linux,先试试用一下反弹shell CVE-2017-10271的EXp """ import requests i ...

  7. netty源码解解析(4.0)-24 ByteBuf基于内存池的内存管理

    io.netty.buffer.PooledByteBuf<T>使用内存池中的一块内存作为自己的数据内存,这个块内存是PoolChunk<T>的一部分.PooledByteBu ...

  8. Node.js入门教程 第六篇 (连接使用MySql)

    连接使用MySql 安装MySql模块: npm install mysql 创建连接: const mysql = require('mysql') // 连接 mysql 服务器 const co ...

  9. 解决window.onload延迟加载问题

    window.onload方法,表示当页面所有的元素都加载完毕,并且所有要请求的资源也加载完毕才触发执行function这个匿名函数里边的具体内容.这样肯定保证了代码在domReady之后执行.使用w ...

  10. python编程基础之一

    编译:将全部代码转成二进制可执行文件 速度快, c,c++等 解释:一行一行的将代码解释 速度慢 python,php等 python简介:Guido van Rossum 1989年 常用的pyth ...