ribbon技术分享

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Ribbon是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中,Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务。

一、Ribbon概述


1、什么是Ribbon


Ribbon是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中,Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务。


2、作用


(1)服务调用

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助RestTemplate 最终进行调用

(2)负载均衡

当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址


3、基于Ribbon实现订单调用商品服务


不论是基于Eureka的注册中心还是基于Consul的注册中心,SpringCloudRibbon统一进行了封装,所

以对于服务调用,两者的方式是一样的。


坐标依赖


在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以这里不需要导入任何额外的坐标


工程改造


(1) 服务提供者


修改 shop_service_product模块中ProductController#findById() 方法如下


@Value("${server.port}")
private String port;
@Value("${spring.cloud.client.ip-address}")
private String ip;
@GetMapping("/{id}")
public Product findById(@PathVariable Long id) {
    Product product = productService.findById(id);
    //设置端口
    product.setProductDesc("调用shop-service-product服务,ip:"+ip+",服务提供者端
口:"+port);
    return product; } 

(2) 服务消费者


修改服务消费者 shop_service_order模块中的启动类OrderApplication ,在创建RestTemplate方法上添加 @LoadBalanced 注解


/**
* 基于Ribbon的服务调用与负载均衡
*/
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}


在 shop_service_order的OrderController 中添加下单方法,并使用RestTemplate完成服务调用

@Autowired
private RestTemplate restTemplate;
@GetMapping("/buy/{id}")
public Product order() {
//通过restTemplate调用商品微服务
//Product product = 
restTemplate.getForObject("http://127.0.0.1:9002/product/1", Product.class);
Product product = restTemplate.getForObject("http://shop-serviceproduct/product/1", Product.class);
return product;
 }


(3) 测试


浏览器中请求http://localhost:9001/order/buy/1查看展示效果如下,已经可以在订单微服务中已服务

名称的形式调用商品微服务获取数据


二、Ribbon进阶


1、负载均衡概述


在搭建网站时,如果单节点的 web服务性能和可靠性都无法达到要求;或者是在使用外网服务时,经常担心被人攻破,一不小心就会有打开外网端口的情况,通常这个时候加入负载均衡就能有效解决服务问题。


负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算

法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力。


负载均衡的应用场景包括流量包、转发规则以及后端服务,由于该服务有内外网个例、健康检查等功

能,能够有效提供系统的安全性和可用性。


服务端负载均衡

先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访

问;即在服务器端再进行负载均衡算法分配


客户端负载均衡

客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配


2、 基于Ribbon实现负载均衡


搭建多服务实例


修改 shop_service_product 的 application.yml 配置文件,已profiles的形式配置多个实例

spring:
 profiles: product1
 application:
   name: shop-service-product
 datasource:
   driver-class-name: com.mysql.jdbc.Driver
   url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
   username: root
   password: 111111
 jpa:
   database: MySQL
   show-sql: true
   open-in-view: true
 cloud:
   consul: #consul相关配置
     host: localhost #ConsulServer请求地址
     port: 8500 #ConsulServer端口
     discovery:
        #实例ID
       instance-id: ${spring.application.name}-1
        #开启ip地址注册
       prefer-ip-address: true
        #实例的请求ip
       ip-address: ${spring.cloud.client.ip-address}
server:
 port: 9002
---
spring:
 profiles: product2
 application:
   name: shop-service-product
 datasource:
   driver-class-name: com.mysql.jdbc.Driver
   url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
   username: root
   password: 111111
 jpa:
   database: MySQL
   show-sql: true
   open-in-view: true
 cloud:
   consul: #consul相关配置
     host: localhost #ConsulServer请求地址
     port: 8500 #ConsulServer端口
     discovery:
        #实例ID
       instance-id: ${spring.application.name}-2
        #开启ip地址注册
       prefer-ip-address: true
        #实例的请求ip
       ip-address: ${spring.cloud.client.ip-address}
server:
 port: 9004


分别启动两次服务器验证效果,并查看两个控制台发现已轮询的方式调用了商品服务


3、负载均衡策略


Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为com.netflix.loadbalancer.IRule ,实现方式如下:


  • com.netflix.loadbalancer.RoundRobinRule :以轮询的方式进行负载均衡。
  • com.netflix.loadbalancer.RandomRule :随机策略
  • com.netflix.loadbalancer.RetryRule :重试策略。
  • com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越高的被调用的可能性越大。
  • com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回。
  • com.netflix.loadbalancer.AvailabilityFilteringRule :可用过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实力中轮询调用。


在服务消费者的application.yml配置文件中修改负载均衡策略

##需要调用的微服务名称
shop-service-product:
 ribbon:
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule


策略选择:

1、如果每个机器配置一样,则建议不修改策略 (推荐)

2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
自然语言处理 Kubernetes 负载均衡
【Alibaba微服务技术系列】「Dubbo3.0技术专题」第一章之Dubbo3新特性概览的介绍说明
【Alibaba微服务技术系列】「Dubbo3.0技术专题」第一章之Dubbo3新特性概览的介绍说明
232 0
|
9月前
手把手教你搭建SpringCloud项目(六)Eureka实现服务发现
手把手教你搭建SpringCloud项目(六)Eureka实现服务发现
|
11月前
|
负载均衡 算法 Cloud Native
【云原生】springcloud09——但愿发长久,空手撕Ribbon
【云原生】springcloud09——但愿发长久,空手撕Ribbon
|
存储 Kubernetes Cloud Native
饿了么 Dubbo3 实践分享 | 学习笔记
快速学习饿了么 Dubbo3 实践分享
197 0
饿了么 Dubbo3 实践分享 | 学习笔记
|
设计模式 监控 Java
Hystrix技术分享
在微服务架构中,一个请求需要调用多个服务是非常常见的。如客户端访问A服务,而A服务需要调用B服务,B服务需要调用C服务,由于网络原因或者自身的原因,如果B服务或者C服务不能及时响应,A服务将处于阻塞状态,直到B服务C服务响应。此时若有大量的请求涌入,容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
160 0
Hystrix技术分享
|
负载均衡 网络协议 Java
openfeign技术分享
Feign是Netflix开发的声明式,模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket. Feign可帮助我们更加便捷,优雅的调用HTTP API。 在SpringCloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。 Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。 SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka, 从而让Feign的使用更加方便。
193 0
|
存储 缓存 监控
eureka技术分享
上一篇文章《微服务零基础入门教学》,详细的介绍了微服务的大背景以及微服务架构的演进,我们还对各种解决微服务的方案进行了分析,今天就让我们正式开始微服务的实战环节:注册中心。 我打算将迄今为止常见的八种注册中心逐一展开介绍,首先讲解第一个大家最为熟知的注册中心——Eureka。
204 1
eureka技术分享
|
监控 负载均衡 Dubbo
Dubbo技术分享
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容,详见后面描述。
197 0
Dubbo技术分享
|
Nacos
Nacos技术分享
Nacos技术分享
105 0
Nacos技术分享
|
JSON 监控 Dubbo
携程的 Dubbo 之路,值得学习!
携程当初为什么要引入 Dubbo 呢?实际上从 2013 年底起,携程内主要使用的就是基于 HTTP 协议的 SOA 微服务框架。这个框架是携程内部自行研发的,整体架构在这近6年中没有进行大的重构。
161 0
携程的 Dubbo 之路,值得学习!

热门文章

最新文章