SpringCloud学习之Ribbon
一。负载均衡与Ribbon
- 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种:
- 轮询法:所有请求被依次分发到每台应用服务器上,每台服务器需要处理的请求数目都相同,适合所有服务器硬件都相同的场景
- 随机法:请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用。
- 源地址哈希(Hash)法:将请求来源的IP地址进行Hash计算,得到对应的服务器,这样来自同一个IP的请求总在同一个服务器上处理
- 加权法:根据应用服务器配置的情况,按照权重将请求分发到每个服务器,当然高性能的服务器分配的权重更高
- 最小连接数(Least Connections)法:计算每个应用服务器正在处理的连接数,将新的请求分发到最少连接的服务器上,按理说,这是最符合负载均衡定义的算法
2. Ribbon是Netfix公司提供的一个负载均衡的客户端框架,它可以和公司旗下的Eureka feign Hystrix等开源产品很好的集成,Ribbon框架具备以下特点:
- 负载均衡
- 容错
- 多协议(HTTP, TCP, UDP)支持异步和反应模型。
- 缓存和批处理
二。Ribbon使用方式
1。首先我们定义服务(在这里就是order-server)注意在服务中的两个配置文件
application.properties
- #应用程序名称
- spring.application.name=order-server
- #指定config-server服务的地址
- spring.cloud.config.uri=http://localhost:8888
- #spring.profiles.active=local
- #取的是当前激活的环境
- #spring.cloud.config.profile=${spring.profiles.active}
- spring.cloud.config.label=master
- #注册中心地址
- eureka.client.service-url.defaultZone=http://localhost:8000/eureka
- #服务端口号
- server.port=8001
- #management.endpoint.health.show-details=always
- #management.endpoint.hystrix.health.enabled=true
- # http://localhost:8888/{spring.application.name}/{spring.cloud.config.profile}/{label}
application-multi.properties
- spring.application.name=order-server
- eureka.client.service-url.defaultZone=http://localhost:8000/eureka
- server.port=8011
- management.endpoint.health.show-details=always
- management.endpoints.web.base-path=/
- management.endpoints.web.exposure.include=health,beans,info
- # http://localhost:8888/{spring.application.name}/{spring.cloud.config.profile}/{label}
这里我们关注 spring.application.name配置 ,并设置不同的端口号
2。在idea里设置启动类配置项
注意single instance only的复选框勾掉 active profiles 是设置当前激活的环境,配置完毕后启动.OrderApplication服务两次
3.新建一个项目ribbon-project并添加依赖
- compile('org.springframework.cloud:spring-cloud-starter-netflix-ribbon')
4.在application.properties里添加配置项
- order.ribbon.listOfServers=http://localhost:8001,http://localhost:8011
- order.ribbon.connectTimeout=3000
- order.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
注意:
- 这里面的格式定义:<client-name>.<namespace>.<property-value>=<value>,其中client-name代表客户端名称,今后我们会根据这个名字拿到客户端对象。
- namespace默认的为ribbon的命名空间
- property-value我们可以参考:Enum CommonClientConfigKey 。其中listOfServers配置的是我们order-server的服务地址,当然我们也可以不做任何配置,那么此时ribbon会给我们设置默认的配置(可以参考:DefaultConfigClientImpl),如果不指定客户端名称,那么配置适用于所有客户端。
- 我们可以指定负载均衡策略,其格式为:
<clientName>.<clientConfigNameSpace>.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.<className>
className值:BestAvailableRule(),RandomRule(随机) , RoundRobbinRule(轮询) , WeightedResponseTimeRule(权重响应时间)
5.编写客户端请求代码
- package com.bdqn.lyrk.ribbon.study;
- import com.netflix.client.ClientFactory;
- import com.netflix.client.http.HttpRequest;
- import com.netflix.client.http.HttpResponse;
- import com.netflix.config.ConfigurationManager;
- import com.netflix.niws.client.http.RestClient;
- public class RibbonApplication {
- public static void main(String[] args) throws Exception {
- //加载配置文件
- ConfigurationManager.loadPropertiesFromResources("application.properties");
- RestClient restClient = (RestClient) ClientFactory.getNamedClient("order");
- HttpRequest httpRequest = HttpRequest.newBuilder().uri("/orderId/1").build();
- for (int i = 0; i < 5; i++) {
- HttpResponse response = restClient.executeWithLoadBalancer(httpRequest);
- System.out.println(response.getEntity(String.class));
- }
- }
- }
6.服务端请参考:SpringCloud学习之Feign结尾的代码示例
三。SpringCloud中的Ribbon
1) 使用@LoadBlanced注解和FeignClient
在RestTemplate上添加@LoadBlanced注解后,幕后英雄就成为了LoadBalancerClient,此时会创建LoadBalancerInterceptor的拦截器对象加入RestTemplate的拦截器栈中,大家可以自行了解下,具体的代码示例如下:
- @Bean
- @LoadBalanced
- RestTemplate restTemplate(){return new RestTemplate();}
2)使用DiscoveryClient
这个对象是spring给我们提供好的,我们通过@Autowired拿来用就是了。
3) @RibbonClient 与 @LoadBalanced
SpringCloud提供了@RibbonClient注解来创建自己定义的RibbonClient,初次接触很容易与@LoadBalanced注解混淆,那么我在这里简单解释一下:
@LoadBalced主要标记在RestTemplate上,那么此时RestTemplate会使用RibbonLoadBalancerClient
来获取服务
@RibbonClient 主要用于配置RibbonClient客户端的,而且这个注解在我们服务发现中不是必须要配置的,如果我们使用SpringCloud中的服务发现机制,此时SpringCloud会给我们提供默认的Ribbon配置,甚至我们不需要配置@RibbonClient,不过当我们需要定义自己的RibbonClient或者不实用服务发现时,那么我们可以使用@RibbonClient注解
使用例子:
在我们的启动类上添加如下注解
- @RibbonClient(name = "myservice")
然后我们在application.properties做如下配置:
- myservice.ribbon.eureka.enabled=false
- myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001
SpringCloud学习之Ribbon的更多相关文章
- SpringCloud学习之Ribbon使用(四)
1.关于 Ribbon Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具.Ribbon 是 Netflix 发布的开源项目,主要功能是提供客 ...
- SpringCloud学习(4)——Ribbon负载均衡
Ribbon概述 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. 简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端软 ...
- SpringCloud学习笔记(2):使用Ribbon负载均衡
简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...
- SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)使用详解
前言 本篇主要介绍的是SpringCloud中的服务消费者(Feign)和负载均衡(Ribbon)功能的实现以及使用Feign结合Ribbon实现负载均衡. SpringCloud Feign Fei ...
- SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)
前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...
- SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理
前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...
- SpringCloud学习笔记(3):使用Feign实现声明式服务调用
简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...
- SpringCloud学习笔记(4):Hystrix容错机制
简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...
- SpringCloud学习笔记(5):Hystrix Dashboard可视化监控数据
简介 上篇文章中讲了使用Hystrix实现容错,除此之外,Hystrix还提供了近乎实时的监控.本文将介绍如何进行服务监控以及使用Hystrix Dashboard来让监控数据图形化. 项目介绍 sc ...
随机推荐
- 服务器数据恢复方法_存储raid硬盘离线数据恢复案例
[故障描述]某法院的一台HP-P4500的存储系统,底层是12块1TB的硬盘组的RAID.其中每6个1TB的盘一组,第一组的前面一部分组了一个RAID0+1,是存放HP-P4500嵌入式系统,接着组了 ...
- mongodb 定时备份
通过centos 脚步来执行备份操作,使用crontab实现定时功能,并删除指定天数前的备份 具体操作: 1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod ...
- 【TensorFlow随笔】关于一个矩阵与多个矩阵相乘的问题
问题描述: Specifically, I want to do matmul(A,B) where 'A' has shape (m,n) 'B' has shape (k,n,p) and t ...
- wamp的mysql设置用户名和密码
wamp下修改mysql root用户的登录密码 感谢作者:http://www.3lian.com/edu/2014/02-25/131010.html 1.安装好wam ...
- Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber ...
- javascript学习(2)修改html元素和提示对话框
一.修改html元素 1.修改p元素 1.1.源代码 1.2.执行前 1.3.执行后 2.修改div元素的className 2.1.源代码 1.2.执行前 1.3.执行后 3.直接在当前位置输出内容 ...
- spring4——IOC之基于注解的依赖注入(DI )
spring容器对于Bean的创建和对象属性的依赖注入提供了注解的支持,让我们在开发中能够更加便捷的实现对象的创建和对象属性的依赖注入.一,对于Bean的创建spring容器提供了以下四个注解的支持: ...
- Mysql:查用的基本操作
查看MySQL提供什么存储引擎: mysql> show engines; 查看MySQL当前默认的存储引擎: mysql> show variables like '%storage_e ...
- mysql中出现Unknown column 'qwe' in 'field list'的错误
下面是我建表的代码 输入数据的代码 可以看到出现了类似Unknown column 'qwe' in 'field list'的错误 当时看了好久改了又改都没有找到错误,直道我在一次打C语言代码的过程 ...
- Java 局部变量、实例变量、类变量(静态变量)区别
1. 局部变量: 局部变量是类的方法中的变量: 2. 实例变量: 实例变量也是类中独立于方法之外的变量,不过没有static修饰,也叫 对象变量 3. 类变量(静态变量): 类变量是类中独立于方法之外 ...