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. SpringBoot 设置编码UTF-8

    第一种  通过过滤器来设置 @Configuration public class UtfConfig { @Bean public FilterRegistrationBean filterRegi ...

  2. SSIS作业提示所请求的 OLE DB 访问接口 Microsoft.ACE.OLEDB.12.0 尚未注册

    没有跨不过的坎,也没有解决不了的问题,那些曾经没有把我们打死的困难,最终都会让我们变得更加强大 最近在使用ETL获取Excel数据时,在本地运行没有任何问题,部署到服务器后,使用作业运行时便一直提示以 ...

  3. C++多线程应用

    一个进程就是一个程序,一个程序里不止一个功能,每个功能的实现就可以交给一个线程去完成.一个进程就像是一个工程,这个工程里,有设计,有监理,有施工,就相当于三个线程,各干各的又相互配合. https:/ ...

  4. 问题:深度学习时代的初期最为火热的AI安全问题已经很少有人讨论了,那么是不是已经解决该问题了呢?

    答案: 先说结果,该问题并没有被解决. 之所以该问题已经不是最初的那么火热的讨论和研究热点了,其主要原因是大家发现这个神经网络在深度学习时代是十分的work的,虽然AI安全问题一直没有解决,但是比较发 ...

  5. git clone失败,超时,速度慢

    最近使用git这个工具,发现git clone指令经常由于网络问题导致失败.查找相关资料之后,找到办法为修改网址,具体为: 将 git clone https://github.com/alibaba ...

  6. SpringMVC源码剖析(三)- DispatcherServlet的初始化流

    在我们第一次学Servlet编程,学java web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转 ...

  7. Getting Flex 3 talking to Java via JSON

    packagecom.giantflyingsaucer; importjava.io.*; importjava.io.PrintWriter; importjavax.servlet.*; imp ...

  8. pip之常见错误汇总

    基本使用: 1.安装文件中的包 pip install -r requirements.txt 问题: 1. pip._vendor.urllib3.exceptions.ReadTimeoutErr ...

  9. nodejs安装和环境配置

    nodejs安装和环境配置 1.下载安装node.js 官方下载地址: https://nodejs.org/en/ 下载LTS版本(长期稳定版本) 安装可以更改安装路径(我的更改是D:\Progra ...

  10. Java基础 —— 集合(二)

    Collection 接口 Collection接口常用方法 boolean add(E e):在集合末尾添加元素 boolean remove(Object o):若集合中存在与o相同的元素,则删除 ...