一。负载均衡与Ribbon

  1. 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种:
  • 轮询法:所有请求被依次分发到每台应用服务器上,每台服务器需要处理的请求数目都相同,适合所有服务器硬件都相同的场景
  • 随机法:请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用。
  • 源地址哈希(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

注意:

  1. 这里面的格式定义:<client-name>.<namespace>.<property-value>=<value>,其中client-name代表客户端名称,今后我们会根据这个名字拿到客户端对象。
  2. namespace默认的为ribbon的命名空间
  3. property-value我们可以参考:Enum CommonClientConfigKey 。其中listOfServers配置的是我们order-server的服务地址,当然我们也可以不做任何配置,那么此时ribbon会给我们设置默认的配置(可以参考:DefaultConfigClientImpl),如果不指定客户端名称,那么配置适用于所有客户端。
  4. 我们可以指定负载均衡策略,其格式为:<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的更多相关文章

  1. SpringCloud学习之Ribbon使用(四)

    1.关于 Ribbon Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具.Ribbon 是 Netflix 发布的开源项目,主要功能是提供客 ...

  2. SpringCloud学习(4)——Ribbon负载均衡

    Ribbon概述 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. 简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端软 ...

  3. SpringCloud学习笔记(2):使用Ribbon负载均衡

    简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...

  4. SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)使用详解

    前言 本篇主要介绍的是SpringCloud中的服务消费者(Feign)和负载均衡(Ribbon)功能的实现以及使用Feign结合Ribbon实现负载均衡. SpringCloud Feign Fei ...

  5. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

  6. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  7. SpringCloud学习笔记(3):使用Feign实现声明式服务调用

    简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...

  8. SpringCloud学习笔记(4):Hystrix容错机制

    简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...

  9. SpringCloud学习笔记(5):Hystrix Dashboard可视化监控数据

    简介 上篇文章中讲了使用Hystrix实现容错,除此之外,Hystrix还提供了近乎实时的监控.本文将介绍如何进行服务监控以及使用Hystrix Dashboard来让监控数据图形化. 项目介绍 sc ...

随机推荐

  1. 在wamp集成环境下安装laravel5.2.*框架

    虽然官方一直强烈推荐使用homestead,但是这个相对麻烦一点,所以我还是选择使用wamp集成开发环境.还有这里我只讲解windows系统下的安装,其他例如mac或linux就不写了,此文章是面向刚 ...

  2. R语言-推荐系统

    一.概述 目的:使用推荐系统可以给用户推荐更好的商品和服务,使得产品的利润更高 算法:协同过滤 协同过滤是推荐系统最常见的算法之一,算法适用用户过去的购买记录和偏好进行推荐 基于商品的协同过滤(IBC ...

  3. [JCIP笔记] (三)如何设计一个线程安全的对象

    在当我们谈论线程安全时,我们在谈论什么中,我们讨论了怎样通过Java的synchronize机制去避免几个线程同时访问一个变量时发生问题.忧国忧民的Brian Goetz大神在多年的开发过程中,也悟到 ...

  4. 腾讯云服务器上安装phstudy和lnmp

    phpstudy的安装:wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin #权限设置./phpstudy.bin ...

  5. istio入门(01)istio的优势在哪里?

    Istio能做什么?Istio 试图解决微服务实施后面临的问题.Istio 提供了一个完整的解决方案,对整个服务网格行为洞察和操作控制,以满足微服务应用程序的多样化需求. Istio在服务网络中提供了 ...

  6. HTML的水平居中和垂直居中解决方案

    水平居中:给div设置一个宽度,然后添加margin:0 auto属性 div{ width:200px; margin:0 auto; } 让绝对定位的div居中 div { position: a ...

  7. python tornado TCPserver异步协程实例

    项目所用知识点 tornado socket tcpserver 协程 异步 tornado tcpserver源码抛析 在tornado的tcpserver文件中,实现了TCPServer这个类,他 ...

  8. nexus私服服务器意外关机后,本地不能下载jar包

    主要记录一个小问题. 今天要做个需求,需要读取word文档中的表格来在生成数据库建表语句. 读取word文档,要添加maven依赖 <dependency> <groupId> ...

  9. (数字IC)低功耗设计入门(八)——物理级低功耗设计&to be continued?

    前面学习了从系统级到门级的低功耗设计,现在简单地了解了一下物理级设计.由于物理级的低功耗设计与后端有关了,这里就不详细学习了.这里主要是学习了一些基本原则,在物理级,进行低功耗设计的基本原则是:    ...

  10. [Kaggle] dogs-vs-cats之制作数据集[1]

    Step 0:导入必要的库 import tensorflow as tfimport os Step 1:获取图片文件名以及对应的标签 首先是读取给定路径下所有图片的名称以及对应的标签.os.lis ...