springcloud(五)-Ribbon
前言
先发句牢骚,最近太TM忙了,一直没时间静下心来继续写微服务架构!EMMMMMM。。。。。
经过前文的讲解,我们已经实现了微服务的注册与发现。启动各个微服务时,Eureka Client会把自己的网络信息注册到Eureka Server上。世界似乎更加美好了。
但是,这里面仍存在一些问题,比如负载均衡。一般来说,在生产环境中,各个微服务都会部署多个实例。那么服务消费者要如何将请求分摊到多个服务提供者实例上呢?
Ribbon简介
提到负载均衡,很多人肯定第一反应就想到了nginx(关于nginx,如果有不熟悉的,可以看下我的nginx模块下面的几篇随笔,写的不好,希望能帮到你)。我们今天主要说Ribbon来做负载均衡。
好了,那么nginx和Ribbon有啥区别呢?这么说吧:nginx适用于服务端实现负载均衡,如tomcat;Ribbon适用于在微服务中RPC远程调用中实现本地服务负载均衡,如Dubbo,springcloud中都是采用本地负载均衡。
什么是Ribbon?
Ribbon是Netflix发布的负载均衡器,是基于HTTP和TCP客户端的负载均衡器。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如:轮询,随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
消费者整合Ribbon
1.复制项目microservice-consumer-movie,将ArtifactId修改为microservice-consumer-movie-ribbon.
2.为项目引入Ribbon的依赖,Ribbon的依赖如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
但是呢,前文中我们已经添加了依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
这个依赖包含了spring-cloud-starter-netflix-ribbon,因此无需再次引入。
3.为RestTemplate添加@LoadBalanced注解。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@LoadBalanced就一个注解,就可为RestTemplate整合Ribbon,使其具备负载均衡的能力。
4.对Controller代码进行修改
@RestController
public class MovieController { private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);
@Autowired
private RestTemplate restTemplate; @Autowired
private LoadBalancerClient loadBalancerClient; @GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
}
@GetMapping("log-user-instance")
public void logUserInstance() {
ServiceInstance serviceInstance = loadBalancerClient.choose("microservice-provider-user");
LOGGER.info("{}:{}:{}",
serviceInstance.getServiceId(),
serviceInstance.getHost(),
serviceInstance.getPort()); } }
由代码可知,我们将请求的地址改成了http://microservice-provider-user/.microservice-provider-user是用户微服务的虚拟主机名,当Ribbon和Eureka配合使用时,会自动将虚拟主机名映射成微服务的网络地址。在新增的logUserInstance()方法中可使用LoadBalanceClient的API更加直观地获取当前选择的用户微服务节点。
测试
1.启动microservice-discovery-eureka。
2.启动2个或更多microservice-provider-user实例。
3.启动microservice-consumer-movie-ribbon。
4.访问http://localhost:8761(eureka的端口)
两个user,一个movie都注册进来了。

5.多次访问http://localhost:8010/user/1(movie的端口)
结果如下:
{"id":1,"username":"account1","name":"张三","age":20,"balance":98.23}
同时,两个微服务实例的控制台都打印日志:
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-04-10 19:45:11.740 TRACE 13180 --- [nio-8081-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]
2019-04-10 19:45:11.742 TRACE 13180 --- [nio-8081-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2019-04-10 19:45:11.742 TRACE 13180 --- [nio-8081-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([balance3_0_0_] : [NUMERIC]) - [98.23]
2019-04-10 19:45:11.742 TRACE 13180 --- [nio-8081-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-04-10 19:45:11.742 TRACE 13180 --- [nio-8081-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
2019-04-10 19:46:03.875 INFO 13180 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
6.多次访问http://localhost:8010/log-user-instance,控制台会打印如下日志:
2019-04-10 19:48:55.151 INFO 12048 --- [nio-8082-exec-4] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8084
2019-04-10 19:48:55.333 INFO 12048 --- [nio-8082-exec-6] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8081
2019-04-10 19:48:55.506 INFO 12048 --- [nio-8082-exec-8] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8084
2019-04-10 19:48:55.674 INFO 12048 --- [io-8082-exec-10] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8081
2019-04-10 19:48:55.850 INFO 12048 --- [nio-8082-exec-2] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8084
2019-04-10 19:48:56.057 INFO 12048 --- [nio-8082-exec-4] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8081
2019-04-10 19:48:56.248 INFO 12048 --- [nio-8082-exec-6] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8084
2019-04-10 19:48:56.793 INFO 12048 --- [nio-8082-exec-8] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8081
2019-04-10 19:48:56.958 INFO 12048 --- [io-8082-exec-10] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8084
2019-04-10 19:48:57.111 INFO 12048 --- [nio-8082-exec-2] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8081
2019-04-10 19:48:57.274 INFO 12048 --- [nio-8082-exec-4] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8084
2019-04-10 19:48:57.459 INFO 12048 --- [nio-8082-exec-6] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8081
2019-04-10 19:48:57.616 INFO 12048 --- [nio-8082-exec-8] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8084
2019-04-10 19:48:57.786 INFO 12048 --- [io-8082-exec-10] c.i.cloud.controller.MovieController : microservice-provider-user:192.168.1.33:8081
我的两个user端口是8081和8084,可以看到,此时请求会均匀分布到两个用户微服务节点上,说明已经成功实现了负载均衡。
代码下载地址:https://gitee.com/fengyuduke/my_open_resources/blob/master/ribbon.zip
springcloud(五)-Ribbon的更多相关文章
- SpringCloud(4)---Ribbon服务调用,源码分析
SpringCloud(4)---Ribbon 本篇模拟订单服务调用商品服务,同时商品服务采用集群部署. 注册中心服务端口号7001,订单服务端口号9001,商品集群端口号:8001.8002.800 ...
- spring-cloud配置ribbon负载均衡
spring-cloud配置ribbon负载均衡 ribbon提供的负载均衡就是开箱即用的,简单的不能再简单了 为了顺利演示此demo,你需要如下 需要提前配置eureka服务端,具体看 https: ...
- 浅谈SpringCloud (三) Ribbon负载均衡
什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...
- Spring-Cloud之Ribbon负载均衡-3
一.负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式.一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix .另一种是将负载均衡逻辑以代码的形式封装到服 ...
- SpringCloud系列——Ribbon 负载均衡
前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用 ...
- SpringCloud Netflix Ribbon(负载均衡)
⒈Ribbon是什么? Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负 ...
- java框架之SpringCloud(4)-Ribbon&Feign负载均衡
在上一章节已经学习了 Eureka 的使用,SpringCloud 也提供了基于 Eureka 负载均衡的两种方案:Ribbon 和 Feign. Ribbon负载均衡 介绍 SpringCloud ...
- SpringCloud之Ribbon
一:Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连 ...
- 【微服务架构】SpringCloud之Ribbon
一:Ribbon是什么? Ribbon是Netfix发布的开源项目,主要负责客户端的软件负载均衡算法,将Netfix的中间层连接在一起,Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等. ...
随机推荐
- 数据备份——PHP
在大多数情况下,开发实在win下进行,因此,然系统每天自动备份数据这也是有必要的饿. Windows平台数据备份 创建批处理文件 在批处理文件中填写如下代码: D:\wamp64\bin\php\ph ...
- Android系统编译与测试
1.Android系统分析 2.下载Android源代码(不包括Linux内核部分) 下载好了的Android_5.01.tar.gz,通过samba复制到ubuntu里,再解压之. 可以看到Andr ...
- 矩阵乘法np.dot()及np.multiply()以及*
转载自 https://blog.csdn.net/u012609509/article/details/70230204 Python中的几种矩阵乘法 1. 同线性代数中矩阵乘法的定义: np.do ...
- srping boot thymeleaf 学习总结 (2) - thymeleaf properties 国际化 mesaage
thymeleaf获取配置properties中的数据与thymeleaf国际化(摘录) 使用thymeleaf提供的国际化 有时候会有直接在模板中获取配置文件properties中的配置信息,比如: ...
- 在改变某一项目的svn的地址,relocate
不要忘记删除原有.svn文件.
- PostgreSQL 表空间
PostgreSQL 表空间 一 介绍使用表空间可以将不同的表放到不同的存储介质或不同的文件系统下,实际上是为表指定一个存储的目录.创建数据库,表,索引时可以指定表空间,将数据库,表,索引放到指定的目 ...
- solr特点三: defType(查询权重排序)
Solr的defType有dismax/edismax两种,这两种的区别,可参见:http://blog.csdn.net/duck_genuine/article/details/8060026 e ...
- mysql 主从日志文件mysql-bin文件清除方法
默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题,不建议使用rm命令删除,这样有可能会不安全,正确的方法 ...
- C#使用LitJson对Json数据解析
JSON 介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - ...
- 纸壳CMS3.0中的规则引擎,表达式计算
纸壳CMS3.0中的规则引擎,用于计算通用表达试结果.通常业务逻辑总是复杂多变的,使用这个规则引擎可以灵活的修改计算表达式. IRuleManager IRuleManager,是使用规则引擎的主要接 ...