Spring Cloud 负载均衡器 Ribbon原理及实现

2025-05-29 0 56

ribbon简介

分布式系统中,各个微服务会部署多个实例,如何将服务消费者均匀分摊到多个服务提供者实例上,就要使用到负载均衡器

ribbon 是负载均衡器 ,它提供了很多负载均衡算法,例如轮询、随即等,在配置服务提供者地址后,可以将服务消费者请求均匀的分发

Spring Cloud 负载均衡器 Ribbon原理及实现

为服务消费者整合ribbon

添加 ribbon 依赖库

?

1

2

3

4
<dependency>

<groupid>org.springframework.boot</groupid>

<artifactid>spring-boot-starter-ribbobn</artifactid>

</dependency>

给 resttemplate 添加 @loadbalaced 注解,就可整合 resttemplate 和 ribbon

?

1

2

3

4

5
@bean

@loadbalanced

public resttemplate resttemplate(){

return new resttemplate();

}

修改controller,请求地址修改为 http://flim-user/user/ ,当 ribbon 和 eureka 配合使用时,会自动将虚拟主机名映射成微服务的网络地址,并注入了 loadbalancerclient 输出当前选择的微服务节点

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22
@restcontroller

public class moviecontroller {

private final logger log = loggerfactory.getlogger(moviecontroller.class);

@autowired

private resttemplate resttemplate;

@autowired

private loadbalancerclient loadbalancerclient;

@getmapping("/user/{id}")

public user findbyid(@pathvariable int id){

return this.resttemplate.getforobject("http://flim-user/"+id,user.class);

}

@getmapping("/log-instance")

public void loginstance(){

serviceinstance serviceinstance = this.loadbalancerclient.choose("flim-user");

log.info("{}:{}:{}",serviceinstance.getserviceid(),serviceinstance.gethost(),serviceinstance.getport());

}

}

运行测试程序

  1. 启动 eureka server
  2. 启动 2 个或更多 flim-user 实例
  3. 启动 flim-consumer
  4. 访问 http://localhost:8761/ 查看微服务 flim-user 是否注册成功
  5. 多次访问 http://localhost:8010/user/1 会返回如下结果

{"id":1,"username":"account1","name":"张三","age":20,"balance":100.00}

多次访问 http://localhost:8010/log-instance 控制台会输出以下信息

Spring Cloud 负载均衡器 Ribbon原理及实现

可以看到请求会均匀的分布到两个用户微服务上

2017-12-17 20:47:53.975 info 12313 — [nio-8010-exec-2] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8764
2017-12-17 20:47:54.215 info 12313 — [nio-8010-exec-1] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8763
2017-12-17 20:47:54.445 info 12313 — [nio-8010-exec-3] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8764
2017-12-17 20:47:54.690 info 12313 — [nio-8010-exec-4] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8763
2017-12-17 20:47:54.935 info 12313 — [nio-8010-exec-5] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8764

注意 :不能将 resttemplate.getforobject(…) 与 loadbalancerclient.choose(…) 写在同一方法中,因为 rest-template 实际上就是一个 ribbon 客户端,本身已经包含“choose”行为

代码方式配置 ribbon

可以使用java代码或属性自定义 ribbon 的配置,ribbon 默认配置类是 ribbonclientconfiguration,也可以使用一个 pojo 自定义 ribbon 配置,这种 配置是细粒度的,不同的 ribbon 客户端可以使用不同的配置

创建 ribbon 配置类

?

1

2

3

4

5

6

7

8

9

10

11

12
/**

* 该类为配置类

* 不应该被componentscan扫描

*/

@configuration

public class ribbonconfiguration {

@bean

public irule ribbonrule(){

//配置负载均衡的规则,更改为随机

return new randomrule();

}

}

使用 @ribbonclient 或 @ribbonclients 注解为服务提供者指定配置类

?

1

2

3

4

5

6

7

8

9

10

11

12

13
@springbootapplication

@enablediscoveryclient

@ribbonclient(name = "flim-user",configuration = ribbonconfiguration.class)

public class flimconsumerapplication {

@bean

@loadbalanced

public resttemplate resttemplate(){

return new resttemplate();

}

public static void main(string[] args) {

springapplication.run(flimconsumerapplication.class, args);

}

}

访问测试地址 http://localhost:8010/log-instance 可看见请求会随机分布到两微服务上

2017-12-17 21:08:52.769 info 12524 — [nio-8010-exec-7] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8763
2017-12-17 21:08:52.946 info 12524 — [nio-8010-exec-8] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8763
2017-12-17 21:08:53.138 info 12524 — [nio-8010-exec-9] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8763
2017-12-17 21:08:53.319 info 12524 — [io-8010-exec-10] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8764
2017-12-17 21:08:53.511 info 12524 — [nio-8010-exec-1] com.linyuan.controller.moviecontroller : flim-user:linyuandembp:8763

注意 :ribbonconfiguration 类不能被 @componentscan 扫描到,否则配置信息就会被所有 @ribbonclient 共享,因此如果只想自定义某个 ribbon 客户端的配置,必须防止被 @componentscan 扫描

配置文件方式配置 ribbon

通过配置文件方式自定义 ribbon 属性更加方便,配置的前缀是 <clientname>.ribbon.

  1. nfloadbalancerclassname:配置 iloadbalancer 的实现类
  2. nfloadbalancerruleclassname:配置 irule 的实现类
  3. nfloadbalancerpingclassname:配置 iping 实现类
  4. niwsserverlistclassname:配置 serverlist 的实现类
  5. niwsserverlistfilterclassname:配置 serverlistfilter 的实现类

通过配置文件定义ribbon配置

?

1

2

3
flim-user:

ribbon:

nfloadbalancerruleclassname: com.netflix.loadbalancer.randomrule

常用的 ribbon 全局配置

?

1

2

3

4

5

6

7
ribbon:

connectiontimeout: #连接超时时间

readtimeout: #读取超时时间

oktoretryonalloperatotions: #对所有操作请求都进行重试

maxautoretriesnextserver: #切换服务器实例的重试次数

maxautoretries: #对当前实例的重试次数

serverlistrefreshinterval: #刷新服务列表源的间隔时间

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://www.jianshu.com/p/047ef2b7284f

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Spring Cloud 负载均衡器 Ribbon原理及实现 https://www.kuaiidc.com/112392.html

相关文章

发表评论
暂无评论