前言

  Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制。我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用,服务消费者调用服务提供者,本文记录Feign调用Ribbon负载均衡的服务提供者

  GitHub地址:https://github.com/Netflix/ribbon

  官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.RC2/single/spring-cloud-netflix.html#spring-cloud-ribbon

  服务提供者

  服务提供者有两个,实际上可以看做只有一个,因为这两个只有端口不同

  maven引入Ribbon

        <!-- Ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

  创建RibbonConfig文件,主类添加@RibbonClient(name = "RibbonConfig", configuration = RibbonConfig.class),我这里偷懒,直接在主类中创建内部类

@EnableEurekaClient
@RibbonClient(name = "RibbonConfig", configuration = RibbonConfig.class)
@SpringBootApplication
public class SpringbootSpringdataJpaApplication{ public static void main(String[] args) {
SpringApplication.run(SpringbootSpringdataJpaApplication.class, args);
}
} @Configuration
class RibbonConfig { @Bean
public IRule ribbonRule(){
return new RandomRule(); //分配策略:随机选择一个server
// return new BestAvailableRule(); //分配策略:选择一个最小的并发请求的server,逐个考察Server,如果Server被tripped了,则忽略
// return new RoundRobinRule(); //分配策略:轮询选择,轮询index,选择index对应位置的server
// return new WeightedResponseTimeRule(); //分配策略:根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低
// return new ZoneAvoidanceRule(); //分配策略:复合判断server所在区域的性能和server的可用性选择server
// return new RetryRule(); //分配策略:对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
} @Bean
public IPing ribbonPing() {
return new PingUrl();
} @Bean
public ServerListSubsetFilter serverListFilter() {
ServerListSubsetFilter filter = new ServerListSubsetFilter();
return filter;
} }

  下表显示了Spring Cloud Netflix默认为Ribbon提供的bean:

  官网例子:

  PS:我们启动的时候有可能会碰到这个问题或类似的问题,说我们注入的某个bean对象有重名,叫我们改名或启用覆盖

  这个是ribbonRule跟txlcn框架的重名了,我们这里进行改名就能解决问题

  我们添加一个测试接口

@RestController
@RequestMapping("/user")
public class UserController { @RequestMapping("/ribbon")
public String ribbon() {
return "springdatejpa -- 我的端口是:10088";
} }

  第二个服务提供者也是这样配置,注意:应用名要相同(spring.application.name=springdatejpa);端口不同;

  服务消费者

  服务消费者使用Feign调用,无需做任何修改,Feign已经使用Ribbon。具体配置请戳:SpringCloud系列——Feign 服务调用

@FeignClient(name = "springdatejpa", path = "/user/")
public interface MyspringbootFeign { @RequestMapping("/ribbon")
String ribbon();
}
    /**
* feign调用
*/
@GetMapping("feign/ribbon")
String ribbon(){
return myspringbootFeign.ribbon();
}

  效果

  启动所有项目,我们注册了三个服务,其中:

  有两个服务名称相同、处理的业务相同、端口不同,这两台作为服务提供者(可看做是一个“小集群”);

  另一个是服务消费者(Feign调用);

  消费者不断调用,Ribbon会从注册中心的服务列表拉取实例集合进行负载均衡调用背后的服务提供者

  后记

  Ribbon负载均衡已经可以实现,更多配置请看官方文档

  代码开源

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/springCloud

  码云:https://gitee.com/huanzi-qch/springCloud

SpringCloud系列——Ribbon 负载均衡的更多相关文章

  1. spring-cloud配置ribbon负载均衡

    spring-cloud配置ribbon负载均衡 ribbon提供的负载均衡就是开箱即用的,简单的不能再简单了 为了顺利演示此demo,你需要如下 需要提前配置eureka服务端,具体看 https: ...

  2. 浅谈SpringCloud (三) Ribbon负载均衡

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

  3. SpringCloud:Ribbon负载均衡

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

  4. 四(2)、springcloud之Ribbon负载均衡

    2.Ribbon负载均衡 ​ Ribbon在工作时分成两步第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server. 第二步再根据用户指定的策略,在从server取到的 ...

  5. Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)

    什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...

  6. SpringCloud之Ribbon负载均衡及Feign消费者调用服务

    目的: 微服务调用Ribbon Ribbon负载均衡 Feign简介及应用 微服务调用Ribbon Ribbon简介 1. 负载均衡框架,支持可插拔式的负载均衡规则 2. 支持多种协议,如HTTP.U ...

  7. SpringCloud之Ribbon负载均衡配置

    一.负载均衡解决方案分类及特征 业界主流的负载均衡解决方案有: 1.1 集中式负载均衡 即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责 ...

  8. Spring-Cloud之Ribbon负载均衡-3

    一.负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式.一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix .另一种是将负载均衡逻辑以代码的形式封装到服 ...

  9. 第六章 SpringCloud之Ribbon负载均衡

    ###################使用默认的负载均衡(轮询)############################# 1.pom.xml <?xml version="1.0&q ...

随机推荐

  1. php获取当前时间的毫秒数

    floor(microtime()*1000); 用microtime能输出当前的秒的后面8位小数 乘以1000取整数就行了

  2. PHP环境在7以上的项目报错A non-numeric value encountered

    报错如下图: 解决办法: 在相对应的报错控制器层加入一行代码,需加载控制器上方,代码如下:   ini_set("error_reporting","E_ALL & ...

  3. 【CSS 第六天】三种简历

    1.盒子模型 2.三种简历 利用float和CSS制作内容一致,但是样式不一致的三种简历. 代码 3.效果 style-1 3.2效果2 效果三

  4. layui layer弹框中表格的显示

    场景描述:点击iframe里面的一个按钮,需要在父级弹出一个弹框表格. 问题描述:这个弹框的分页不能正常显示,如果把layer.open前面的parent去掉,就可以正常显示. 代码展示: paren ...

  5. mac 下SonarQube 安装与使用

    参考文件:https://www.jianshu.com/p/aa863cf30406 https://www.jianshu.com/p/b41262fca5b8 jenkins 集成Sonar: ...

  6. Web发展史

    Web 万维网常称为WWW(World Wide Web)发展至今仅30年,英国计算机科学家,蒂姆 伯纳斯 李爵士 提出了 World Wide Web的设计方案,1990年李爵士完成了Web 所有的 ...

  7. MyEclipse 10 报错记录

    1. js文件:右键 >> MyEclipse >> Exclude From Validation 2. Servlet 警告:Window ==> Preferenc ...

  8. C#的几种文件操作方法

    创建或覆盖文件 需求:如果文件不存在,创建之,如果存在,覆盖之. 1,可能有问题的方法 using (FileStream fs = File.OpenWrite(@"d:\work\1.t ...

  9. 贪心算法----区间覆盖问题(POJ2376)

    题目: 题目的大概意思是约翰这个农民有N条牛,这些牛可以在一天中的某个时间段可以进行工作,他想把这个时间段分成若干个片段让这些牛去进行打扫任务,你的任务是安排尽量少的牛然后可以完成分成这些片段的打扫任 ...

  10. [Swift]LeetCode1 .两数之和 | Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...