1. Ribbon简介

Ribbon是一个基于HTTP和TCP的客户端负载均衡器,当使用Ribbon对服务进行访问的时候,他会扩展Eureka客户端的服务发现功能,实现从Eureka注册中心获取服务端列表,并通过Eureka客户端来确定服务端是否已经启动。Ribbon在Eureka客户端服务发现的基础上,实现对服务实例的选择策略,从而实现对服务的负载均衡消费。负载均衡在系统架构中是一个非常重要的内容,因为负载均衡是对系统的高可用、网络的压力的缓冲和处理能力扩容的重要手段之一,我们通常说的负载均衡都是指的是服务端的负载均衡,其中分为硬件负载均衡和软件负载均衡。

  • 硬件负载均衡:主要通过服务器节点之间安装专门用于负载均衡的设备,比如F5,深信服,Array等。

  • 软件负载均衡:则是通过服务器上安装一些具有负载功能或模块的软件来完成请求分发工作,比如Nginx、LVS、HAProxy等。

    硬件负载均衡的设备或是软件负载均衡的软件模块都会维护一个可用的服务端清单,通过心跳检测来剔除故障的服务端节点保证清单中都是可以正常访问的服务端节点。当客户端发送请求到负载均衡的设备时候,该设备按某种算法(比如线性轮询、按权重负载、按流量负载等)从维护的可用服务端清单中取出一台服务端地址,然后进行转发。

    Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,是一个基于HTTP和TCP的客户端负载均衡工具。SpringCloud对Ribbon做了二次封装,可以让我们使用 RestTemplate的服务请求,自动转换成客户端负载均衡的服务调用。Ribbon支持多种负载均衡算法,还支持自定义的负载均衡算法。Ribbon只是一个工具类框架,比较小巧, SpringCloud对它封装后使用也非常方便,它不像服务注册中心、配置中心、API网关那样需要独立部署, Ribbon 只需要在代码直接使用即可。

Ribbon与 Nginx的区别:

  • 都是软负载
  • Ribbon是客户端负载均衡
  • Nginx是服务器段负载均衡
  • 服务端的负载均衡是提前配置好的:Nginx
  • 客户端的负载均衡是从注册中心找的:Ribbon

区别在于:

服务清单所存储的位置不同,在客户端负载均衡中,所有客户端节点下的服务端清单,需要自己从服务注册中心上获取,比如Eureka服务注册中心。同服务端负载均衡的架构类似,在客户端负载均衡中也需要心跳去维护服务端清单的健康性,只是这个步骤需要与服务注册中心配合完成,在SpringCloud实现的服务治理框架中,默认会创建针对各个服务治理框架到的Ribbon自动化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,在实际使用的时候,我们可以通过查看这个类的实现,以找到他们的配置详情来帮助我们更好的使用它。

2. 能干什么

实现微服务间请求的负载均衡策略。

3. Quick Start

通过SpringCloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用非常的简单,只需要如下两步:

  1. 服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心上。
  2. 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。

在SpringCloud中,Ribbon主要与RestTemplate对象配合使用,Ribbon会自动化配置RestTemplate对象,通过@LoadBalance开启RestTemplate对象调用时的负载均衡,Ribbon所处的作用如图

创建服务模块如下

3.1 创建服务注册中心

3.1.1 引入依赖坐标

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

3.1.2 配置application.yml

server:
port: 8080 spring:
application:
name: eureka-server eureka:
instance:
hostname: localhost
client:
# 是否将自己注册到Eureka服务中,本身就是所有无需注册
registerWithEureka: false
# 是否从Eureka中获取注册信息
fetchRegistry: false
# 客户端与Eureka服务端进行交互的地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3.1.3 配置启动类

添加@EnableEurekaServer 标记为EurekaServer

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

3.1.4 启动项目

浏览器输入localhost:8080访问注册中心

3.2 创建服务提供者

3.2.1 引入依赖坐标

<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>

3.2.2 配置application.yml

这里将port设置为动态传参,主要是想通过设置vm参数来使启动两个端口不同的服务,以便后续通过consumer调用的时候实现负载均衡效果

server:
# 缺省为8010
port: ${port:8010} spring:
application:
name: provider eureka:
client:
# eureka server的路径
serviceUrl:
defaultZone: http://localhost:8080/eureka/

3.2.3 创建测试接口

package com.ldx.provider.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class HelloController {
@Value("${server.port}")
String port; @GetMapping("hi")
public String hi(){
// 通过返回port,使掉用端方便查看调用的是那个端口的服务
return "hi~ my port ===" + port;
}
}

3.2.4 配置启动项

通过idea的复制功能创建两个启动模板,且8011模板通过传port参数实现服务端口的动态替换

3.2.5 启动服务

查看注册中心控制台

服务已注册成功

测试服务接口

3.3 创建服务消费者

3.3.1 引入坐标依赖

spring-cloud默认集成了ribbon,所以不用额外的引用ribbon坐标

<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>

3.3.2 配置application.yml

server:
port: 8082 spring:
application:
name: consumer eureka:
client:
# eureka server的路径
serviceUrl:
defaultZone: http://localhost:8080/eureka/

3.3.3 配置启动类

package com.ldx.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
} @Bean
// ribbon 提供的负载均衡注解
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

3.3.4 创建测试接口

controller

package com.ldx.consumer.controller;

import com.ldx.consumer.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class HelloController {
@Autowired
HelloService helloService; @GetMapping("hi")
public String hi(){
return helloService.hi();
}
}

service

通过服务名调用(启动类中默认集成了ribbon)

package com.ldx.consumer.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; @Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
public String hi(){
return restTemplate.getForObject("http://PROVIDER/hi",String.class);
}
}

3.3.5 启动项目

查看注册中心控制台

服务注册已成功

测试接口

第一次访问:

第二次访问:

SpringCloud-Ribbon的更多相关文章

  1. springcloud Ribbon学习笔记二

    之前介绍了如何搭建eureka服务并开发了一个用户服务成功注册到了eureka中,接下来介绍如何通过ribbon来从eureka中获取用户服务: springcloud ribbon提供客户端的负载均 ...

  2. 客户端实现负载均衡:springCloud Ribbon的使用

    Netfilx发布的负载均衡器,是一个基于http.tcp的客户端负载均衡工具,具有控制http.tcp客户端的行为,为ribbon配置服务提供者的地址后,ribbon就 可以经过springClou ...

  3. springcloud ribbon的 @LoadBalanced注解

    在使用springcloud ribbon客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载 ...

  4. springcloud Ribbon学习笔记一

    上篇已经介绍了如何开发eureka服务并让多个服务进行相互注册,接下来记录如何开发一个服务然后注册到eureka中并能通过ribbon成功被调用 开发一个用户服务并注册到eureka中,用户服务负责访 ...

  5. SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个

    一,问题 采取eureka集群.客户端通过Ribbon调用服务,Ribbon端报下列异常 java.net.UnknownHostException: SERVICE-HI java.lang.Ill ...

  6. springcloud ribbon Finchley 版本,自定义算法

    引用上一个项目,在原有的基础上进行更改,添加springcloud的内荣. eureka-server 和上一个springcloud eureka的一样,没有改动. 添加cloud-api pack ...

  7. SpringCloud Ribbon 负载均衡

    Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具.可以将面向服务的 REST 模板请求自动转化成客户端负载均衡的服务调用.Spring Cloud Rib ...

  8. SpringCloud Ribbon的分析(二)

    上文我们分析到 loadBalancer 根据具体的算法选择相应的server. protected Server getServer(ILoadBalancer loadBalancer) { if ...

  9. SpringCloud Ribbon的分析

    Spring Cloud Ribbon主要用于客户端的负载均衡.最基本的用法便是使用RestTemplate进行动态的负载均衡.我们只需要加入如下的配置便能完成客户端的负载均衡. @Configura ...

  10. springcloud ribbon 客户端负载均衡用法

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is ...

随机推荐

  1. 《大话设计模式》java实现:第二章-策略模式

    <大话设计模式>java实现:第二章-策略模式 第二章是使用策略模式实现商场收银系统,使收银系统的促销策略可以灵活更改. 1. 原始代码实现: package gof; /* * < ...

  2. Windows 11安装跳过联网

    方案1 在选择WIFI联网的界面,不要连接网络. Shift + F10(或者Fn+Shift+F10),打开cmd窗口,输入命令:oobe\BypassNRO.cmd 重启后会有一个我没有互联网的选 ...

  3. ubuntu系统下安装 steam 游戏平台

    方法1:安装命令: sudo snap install steam 方法2:下载安装: 地址: https://store.steampowered.com/about/

  4. csv导出特殊字符问题

    昨天听到隔壁组讨论说按照逗号分割implode导出到csv文件,传递文件数据给别人的时候,别人按照都好explode分割回来多一个单元格,他们调查了一下发现是内容里面就是有逗号导致的,居然就这么卡住了 ...

  5. 23、表空间及段区块_1(段区块管理、pctfree、数据块结构、行迁移、高水位)

    oracle数据库的物理存储结构 1.spfile:参数文件 2.controlfile:控制文件 3.datafile:数据文件 4.redo log 5.arch:归档日志 oracle数据库的d ...

  6. Apache APISIX 和 Kong 的选型对比

    从 API 网关核心功能点来看,两者均已覆盖: 功能 Apache APISIX Kong 动态上游 支持 支持 动态路由 支持 支持 健康检查和熔断器 支持 支持 动态SSL证书 支持 支持 七层和 ...

  7. linux学习用到的命令

    创建快件方式 ln 创建目录的快件方式 sudo ln -s /root/myhack/ /root/Desktop以上指令是创建软链接到桌面. ln -s /mnt/hgfs/VMware_shar ...

  8. 前端项目部署之pushstate-server

    pushstate-server 内部的原理是通过 connect 服务器,开启一个端口,将 dist/index.html 文件作为静态模板输出 这种方式可以将本地的项目打包成静态文件,以服务的方式 ...

  9. laravel之model

    记录laravel 中model常用方法 1.keyBy() 指定数据的某个字段作为该条数据的key 2.like操作 $model->where('goods', 'like', '%test ...

  10. 基于Github gist的代码片段管理工具Lepton

    Lepton主要功能 无限制的公共/私人片段 无限制的标签 语言组 Markdown支持 Jupyter Notebook查看器支持 macOS / Win / Linux客户端 GitHub Ent ...