Ribbon

是什么

客户端的负载均衡,和进行轮训、随机、权重、自定义等规则配置访问;

通过指定注册到注册中心的服务名,根据设置的规则自动进行调用

工作流程

  1. 先选择 EurekaServer,它优先选择在同一个区域内负载较少的server
  2. 再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址其中Ribbon提供多种策略:比如轮询、随机、根据响应时间加权等规则

怎么用

此处

负载算法

官方提供算法

参考尚硅谷杨哥教程

类型 方法
轮训 RoundRobinRule
随机 RandomRule
先按照轮训策略获取服务,如果获取服务失败则再指定时间内重试,获取可用服务 RetryRule
对轮询策略的扩展,响应速度越快的实例选择权重越大 WeightResponseTimeRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 BestAvailableRule
先过滤掉故障实例,再选择并发较小的实例 AvailabilityFilterRule
默认规则,复合判断server所在区域的性能和server的可用性选择服务器 ZoneAvoidanceRule

使用方法

  1. 在被标注@SpringBootApplication注解的XXXApplication上级包外新建负载均衡配置文件,如果配置文件在XXXApplication包同级或下级,此配置失效

  2. RbRule.java文件内容

    package rule;
    
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration; @Configuration
    public class RbRule {
    @Bean
    public IRule rule() {
    return new RandomRule(); //定义新的策略为随机
    }
    }
  3. 修改ClientApplication.java文件

    package com.project.client;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    import rule.RbRule; @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    @RibbonClient(name = "SERVICE-PROJECT",configuration = RbRule.class)
    // 客户端名称 上一步定义的规则
    public class ClientApplication { public static void main(String[] args) {
    SpringApplication.run(ClientApplication.class, args);
    } }
  4. 测试

    执行访问192.168.1.2/getInstance,正常三台服务提供应随机输出

自定义负载算法

查看 RandomRule类源码(其他的几个类也一样),得知几个关键类及方法:

  • ILoadBalancer//获得注册服务数量的方法
  • getAllServers()//获得所有注册到Eureka的服务
  • getReachableServers()//获得所有在线的服务
  • isAlive()//判断服务是否存活 true存活

在rule包下新建MyRule

简单实现一个倒序轮训的规则,仅仅实现,不考虑健壮性

public class MyRule extends AbstractLoadBalancerRule {
AtomicInteger atomicInteger=new AtomicInteger();
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) { }
@Override
public Server choose(Object key) {
ILoadBalancer loadBalancer = getLoadBalancer();//获得注册服务数量的方法
List<Server> allServers = loadBalancer.getAllServers();//获得所有注册到Eureka的服务
List<Server> reachableServers = loadBalancer.getReachableServers();//获得所有在线的服务
if(atomicInteger.get()<1){
atomicInteger.set(reachableServers.size());
}
int index = atomicInteger.decrementAndGet();
Server server = reachableServers.get(index);
//server.isAlive();//服务是否存活 true存活
return server;
}
}

修改自定义策略类RbRule

@Configuration
public class RbRule {
@Bean
public IRule rule() {
return new MyRule(); //定义策略为自定义
//return new RandomRule(); //定义新的策略为随机
}
}

测试

此时会发现,轮询会按照getReachableServers()读出的list顺序倒序依次调用

OpenFeign

是什么

OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等。

OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

怎么用

基本使用

  1. 导入pom

            <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.5.RELEASE</version>
    </dependency>
  2. XXXApplication.java开启

    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    @EnableFeignClients //开启openfeign
    public class ClientApplication {
    public static void main(String[] args) {
    SpringApplication.run(ClientApplication.class, args);
    }
    }
  3. 新增调用服务接口

    @Service
    @FeignClient(value = "SERVICE-PROJECT") //调用的服务名
    public interface FeignDemoService {
    @GetMapping(value = "/getInstanceId") //服务端的请求地址,如果有入参可通过@PathVariable传入
    public String getInstance();
    }
  4. 调用测试

    @Autowired
    private FeignDemoService feignDemoService; //引入刚刚创建的接口 @GetMapping("feignGetInstance")
    public String feignGetInstance(){
    return feignDemoService.getInstance();//调用,即可返回对应服务提供接口的信息
    }

指定负载均衡策略

添加此注解即可,使用细节同上

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "SERVICE-PROJECT",configuration = RbRule.class) //添加后OpenFeign也使用RbRule策略
@EnableFeignClients
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}

接口超时控制

  1. 修改服务提供方,添加方法,此方法可定义执行时间

        @GetMapping("getInstanceIdByTimeOut")
    public String getInstanceIdByTimeOut(int time) throws InterruptedException {
    if(time>0) {
    TimeUnit.SECONDS.sleep(time);
    }
    return instanceId+"_time_"+time; }
  2. 修改FeignDemoService接口,新增方法

        @GetMapping(value = "/getInstanceIdByTimeOut/{time}")
    public String getInstanceIdByTimeOut(@PathVariable("time") int time);
  3. 修改调用超时时间

    #设置feign客户端超时时间(OpenFeign默认支持ribbon)
    ribbon:
    #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的实际时间,单位毫秒
    ReadTimeout: 5000 #不配置默认为1秒
    #指的是建立连接后从服务器读取到可用资源所用的时间,单位毫秒
    ConnectTimeout: 5000 #不配置默认为1秒
  4. 调用getInstanceIdByTimeOut/{time}接口测试

    time高于5秒就不再等待报错

日志输出

对Feign接口调用情况进行监控和输出

日志级别

NONE: 默认的,不显示任何日志

BASIC: 仅记录请求方法、URL、响应状态码以及执行时间

HEADERS:除了BASIC 中自定义的信息外,还有请求和响应的信息头

FULL: 除了HEADERS中定义的信息外, 还有请求和响应的正文以及元数据。

新增配置类

@Configuration
public class FeignLogConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}

修改yml文件,设置日志

logging:
level:
com.project.client.service.*: debug #收集哪些包下的调用日志

测试,控制台会显示如下信息

Ribbon&Feign&OpenFeign区别

Ribbon

Ribbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件

Ribbon 可以用来做客户端负载均衡,调用注册中心的服务

Ribbon的使用需要代码里手动调用目标服务,请参考官方示例:https://github.com/Netflix/ribbon

Feign(不推荐,停止维护)

Feign是Spring Cloud组件中的一个轻量级RESTfulHTTP服务客户端

Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。

Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务

Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign

Feign本身不支持Spring MVC的注解,它有一套自己的注解

OpenFeign

OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。

OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,

并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

Ribbon&OpenFeign配置使用的更多相关文章

  1. 【Ribbon篇四】Ribbon初步配置(2)

    一. 微服务消费者改造 注:修改microservicecloud-consumer-dept-80工程 1. pom.xml添加依赖 <!-- eureka client --> < ...

  2. 笔记:Spring Cloud Ribbon 客户端配置详解

    自动化配置 由于 Ribbon 中定义的每一个接口都有多种不同的策略实现,同时这些接口之间又有一定的依赖关系,Spring Cloud Ribbon 中的自动化配置能够很方便的自动化构建接口的具体实现 ...

  3. springcloud-04-自定义ribbon的配置方式

    在dubbo项目中, zookeeper即注册中心帮我们实现了调度和负载均衡的能力, 这种方式被称为服务器端的负载均衡, springcloud中, 使用ribben实现的客户端负载均衡 什么是rib ...

  4. Ribbon 常用配置

    配置参数 默认值 说明 <client>.<namespace>.listOfServers 配置服务器列表 <client>.<namespace>. ...

  5. Ribbon的配置

    1.注解配置 @RibbonClient(name = "xxx",configuration = XxxRibbonConfig.class) public class XxxR ...

  6. feignClient中修改ribbon的配置

    1.使用@FeignClient注解发现服务 服务提供者的controller: @RestController public class StudentController { @Autowired ...

  7. 四(1)、springcloud之Ribbon初步配置

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

  8. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)

    1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...

  9. 使用Java代码自定义Ribbon配置

    很多场景下,需要实现不同的微服务采用不同的策略,例如修改Ribbon的负载均衡规则等.Spring Cloud允许使用Java代码自定义Ribbon的配置. 在Spring Cloud中,Ribbon ...

随机推荐

  1. C程序:年转化天

    突然想算算自己到底活了多少天了,e,就是纯属为了好玩,毕竟咱作为一名C初学者还是要多练练的- 为了好玩,加了个密码登陆的,密码是521,还有就是不太懂时间获取... 具体闰年的判断方法: 代码如下: ...

  2. 自定义UITableview自带侧滑删除按钮样式 by 徐

    效果如下: 实现原理: 1.打开tableview自带的侧滑删除功能 核心代码: 1 -(void)tableView:(UITableView *)tableView commitEditingSt ...

  3. 总结tomcat的核心组件以及根目录结构

    一.目录结构说明 进入到tomcat的文件目录,可以看到以下目录结构 每一个目录都有各自的功能,如下所示: 1.1 bin目录 1.2 conf目录 1.3 logs目录 二.核心组件 tomcat核 ...

  4. Windows安装PostgreSQL解压版

    PostgreSQL下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads windows版,务必装在C盘! ...

  5. 06 jQuery

    BOM和DOM 1. 什么是BOM和DOM 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的 ...

  6. Anacanda 与 jupyter 的使用

    内容概要 爬虫开发环境搭建 Anacanda 开发环境 jupyter jupyter 的基本使用 启动 基本使用 快捷键的使用 内容详细 一.爬虫开发环境搭建 1.Anacanda 开发环境 Ana ...

  7. Filter(过滤器)与Listener(监听器)详解

    11.Filter(重点) Filter:过滤器,用来过滤网站的数据: 处理中文乱码 登陆验证... Filter开发步骤: 导包 编写过滤器 导包不要错 实现Filter接口,重写对应的方法即可 p ...

  8. aspnetcore 使用serilog日志

    而在实际项目开发中,使用第三方日志框架来记录日志也是非常多的,首先一般基础的内置日志记录器在第三方日志框架中都有实现,然后很多第三方日志框架在功能上更强大和丰富,能满足我们更多的项目分析和诊断的需求. ...

  9. Welcom to my studyspace! 欢迎来到我的学习空间!

    由于新手,博客才刚开始起步,用于记录我的学习,博客的建设后续需要将其完善 对我的博客进行diy 用于分享我的学习经历,一些笔记,还有一些小小的心得

  10. ios开发 将json格式数据上传服务器

    看了一些大小牛的资料其实就3步 1.使用post 请求 ,因为get是不能上传的 2.设置请求类型 , 讲你的json数据上传 3.向服务器发送数据按照下面示例代码,就差不多了 1 // 1.创建请求 ...