SpringCloud学习之Ribbon

一。负载均衡与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

  

原文地址:https://www.cnblogs.com/niechen/p/8542081.html

时间: 2024-07-31 05:05:24

SpringCloud学习之Ribbon的相关文章

SpringCloud学习系列-Ribbon负载均衡(2)

Ribbon配置初步  1.修改microservicecloud-consumer-dept-80工程  2.修改pom.xml文件           <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/

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

前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关的过滤器Filter以及异常处理的教程. SpringCloud Zuul Filter 介绍 过滤器概述 Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由过程中执行一系列操作. 以下是Zuul过滤器的主要特征: 类型:通常在应用过滤器时在路由流程中定义阶段(尽管它可以是任何自定义字

SpringCloud学习系列之三----- 断路器Hystrix和断路器监控Dashboar

前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netflix创建了一个名为Hystrix的库,它实现了断路器模式.主要的目的是为了解决服务雪崩效应的一个组件,是保护服务高可用的最后一道防线. 开发准备 开发环境 JDK:1.8 SpringBoot:2.1.1.RELEASE SpringCloud:Finchley 注:不一定非要用上述的版本,可以根据

SpringCloud学习心得—1.3—Eureka与REST API

SpringCloud学习心得—1.3—Eureka与REST API Eureka的REST API接口 API的基本访问 Eureka REST APIEureka 作为注册中心,其本质是存储了每个客户端的注册信息,Ribbon 在转发的时候会获取注册中心的服务列表,然后根据对应的路由规则来选择一个服务给 Feign 来进行调用. 如果我们不是Spring Cloud 技术选型,也想用 Eureka,可以吗?完全可以. 如果不是 Spring Cloud 技术栈,推荐用 Zookeeper,

SpringCloud学习心得—1.2—Eureka注册中心的密码认证、高可用的设置

SpringCloud学习心得—1.2—Eureka注册中心的密码认证.高可用的设置 这是相关代码 链接 Eureka开启密码配置 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 向properties添加密码与用户名 spr

SpringCloud+Eureka+Feign+Ribbon的简化搭建流程,加入熔断,网关和Redis缓存[2]

作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 前提:本篇是基于 SpringCloud+Eureka+Feign+Ribbon的简化搭建流程和CRUD练习[1] 的修改与拓展 1.修改consumer的CenterFeign.java,把返回值全部设置为String /** * 是consumer调用provider(需要指定provider的名字) * 请求的清单列表:规定调用地址.参数.返回值 * 在正常走通的时候不走CenterFeignFallBack,当provider down

SpringCloud学习之Stream消息驱动【自定义通道】(十一)

如果不清楚本篇内容的,请务必先去看完上一篇再看本篇,否则阅读起来可能会有部分障碍和困难: 上一篇文章<SpringCloud学习之Stream消息驱动[默认通道](十)>我们简单用自定义通道实现了消息发送和接收,但是用的是Stream给我们提供的默认Source,Sink,接下来我们要自己进行自定义,这种方式在工作中还是用的比较多的,因为我们要往不同的消息通道发消息,必然不能全都叫input,output的,那样的话就乱套了 (一)创建消息生产者[service-sender-stream-8

SpringCloud学习:Eureka、Ribbon和Feign

Talk is cheap,show me the code , 书上得来终觉浅,绝知此事要躬行.在自己真正实现的过程中,会遇到很多莫名其妙的问题,而正是在解决这些问题的过程中,你会发现自己之前思维的盲点.引子 看完<微服务设计>后,算是补上了自己在服务化这块的理论知识,在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构.基于Spring Cloud的微服务架构.从概念上来讲,Dubbo和Spring Cloud并不能放在一起对比,因为Dubbo仅仅是一个RPC框架,实现Java程

SpringCloud学习笔记(2)——Ribbon

参考SpringCloud官网第16.17章 16. Client Side Load Balancer: Ribbon Ribbon是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制.Feign也是用的Ribbon,所以在这一章你也可以用@FeignClient Ribbon的一个核心概念是命名的客户端.每个负载均衡器都是这个组件的全体的一部分,它们一起工作来连接到服务器,并且它们全体都有一个给定的名字. Spring Cloud用RibbonClientConfigur