一 Ribbon简介

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。


二 新建microservice-consumer-movie-ribbon项目

1 为RestTemplate添加注解@LoadBalanced

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerMovieApplication {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerMovieApplication.class, args);}
}

2 修改Controller代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import com.itmuch.cloud.study.user.entity.User;@RestController
public class MovieController {private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/user/{id}")public User findById(@PathVariable Long id) {//VIP:virtual IPreturn this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);}@GetMapping("/log-user-instance")public void logUserInstance() {ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");// 打印当前选择的是哪个节点MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());}
}

3 配置文件

server:port: 8010
spring:application:name: microservice-consumer-movie
eureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/instance:prefer-ip-address: true

三 测试

  1. 启动eureka微服务
  2. 启动movie-ribbon微服务
  3. 启动一个user微服务

测试结果:


    4 启动另外一个user微服务方法

修改user微服务的端口如下:

server:port: 8001
spring:application:name: microservice-provider-userjpa:generate-ddl: falseshow-sql: truehibernate:ddl-auto: nonedatasource:                           # 指定数据源platform: h2                        # 指定数据源类型schema: classpath:schema.sql        # 指定h2数据库的建表脚本data: classpath:data.sql            # 指定h2数据库的数据脚本
logging:                                # 配置日志级别,让hibernate打印出执行的SQLlevel:root: INFOorg.hibernate: INFOorg.hibernate.type.descriptor.sql.BasicBinder: TRACEorg.hibernate.type.descriptor.sql.BasicExtractor: TRACE
eureka:client:healthcheck:enabled: trueserviceUrl:defaultZone:http://localhost:8761/eureka/#defaultZone: http://user:password123@localhost:8761/eureka/instance:prefer-ip-address: true

启动第2个user微服务后

5 9次访问http://localhost:8010/user/1 ,可以得出ribbon默认采用轮询的方式进行负载均衡
5次访问8000端口

2018-06-16 08:56:41.277  INFO 3396 --- [nio-8000-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-06-16 08:56:41.277  INFO 3396 --- [nio-8000-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2018-06-16 08:56:41.315  INFO 3396 --- [nio-8000-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 38 ms
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=?
2018-06-16 08:56:41.439 TRACE 3396 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:41.454 TRACE 3396 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:41.455 TRACE 3396 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:41.455 TRACE 3396 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2018-06-16 08:56:41.457 TRACE 3396 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
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=?
2018-06-16 08:56:49.171 TRACE 3396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:49.171 TRACE 3396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:49.171 TRACE 3396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:49.172 TRACE 3396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2018-06-16 08:56:49.172 TRACE 3396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
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=?
2018-06-16 08:56:53.448 TRACE 3396 --- [nio-8000-exec-3] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:53.448 TRACE 3396 --- [nio-8000-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:53.448 TRACE 3396 --- [nio-8000-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:53.448 TRACE 3396 --- [nio-8000-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2018-06-16 08:56:53.449 TRACE 3396 --- [nio-8000-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
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=?
2018-06-16 08:56:57.129 TRACE 3396 --- [nio-8000-exec-4] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:57.130 TRACE 3396 --- [nio-8000-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:57.130 TRACE 3396 --- [nio-8000-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:57.130 TRACE 3396 --- [nio-8000-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2018-06-16 08:56:57.130 TRACE 3396 --- [nio-8000-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
2018-06-16 08:58:45.337  INFO 3396 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration
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=?
2018-06-16 08:58:49.603 TRACE 3396 --- [nio-8000-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:58:49.603 TRACE 3396 --- [nio-8000-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:58:49.603 TRACE 3396 --- [nio-8000-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:58:49.603 TRACE 3396 --- [nio-8000-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2018-06-16 08:58:49.603 TRACE 3396 --- [nio-8000-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]

4次访问8001端口


2018-06-16 08:56:39.230  INFO 11828 --- [nio-8001-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-06-16 08:56:39.231  INFO 11828 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2018-06-16 08:56:39.423  INFO 11828 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 192 ms
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=?
2018-06-16 08:56:39.553 TRACE 11828 --- [nio-8001-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:39.567 TRACE 11828 --- [nio-8001-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:39.568 TRACE 11828 --- [nio-8001-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:39.569 TRACE 11828 --- [nio-8001-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [瀵姳绗乚
2018-06-16 08:56:39.569 TRACE 11828 --- [nio-8001-exec-1] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
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=?
2018-06-16 08:56:44.995 TRACE 11828 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:44.996 TRACE 11828 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:44.996 TRACE 11828 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:44.996 TRACE 11828 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [瀵姳绗乚
2018-06-16 08:56:44.996 TRACE 11828 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
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=?
2018-06-16 08:56:51.624 TRACE 11828 --- [nio-8001-exec-3] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:51.624 TRACE 11828 --- [nio-8001-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:51.624 TRACE 11828 --- [nio-8001-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:51.624 TRACE 11828 --- [nio-8001-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [瀵姳绗乚
2018-06-16 08:56:51.624 TRACE 11828 --- [nio-8001-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
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=?
2018-06-16 08:56:55.351 TRACE 11828 --- [nio-8001-exec-4] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-06-16 08:56:55.352 TRACE 11828 --- [nio-8001-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-06-16 08:56:55.352 TRACE 11828 --- [nio-8001-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-06-16 08:56:55.352 TRACE 11828 --- [nio-8001-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [瀵姳绗乚
2018-06-16 08:56:55.352 TRACE 11828 --- [nio-8001-exec-4] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
2018-06-16 08:57:11.589  INFO 11828 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration
2018-06-16 09:02:11.591  INFO 11828 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration

我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://blog.csdn.net/chengqiuming/article/details/80711168

SpringCloud系列-Ribbon的基本应用相关推荐

  1. SpringCloud系列——Zuul 动态路由

    前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...

  2. J360-cloud SpringCloud系列二:服务发现Discovery Service

    2019独角兽企业重金招聘Python工程师标准>>> j360开源博客之 ----------------------------------------------------- ...

  3. SpringCloud系列研究---Eureka服务消费Feign

    转载自:https://www.cnblogs.com/chxuyuan/p/8358998.html SpringCloud系列研究---Eureka服务消费Feign 一.Feign简介 Feig ...

  4. 08、SpringCloud 系列:Nacos - 安装、启动

    SpringCloud 系列列表: 文章名 文章地址 01.Eureka - 集群.服务发现 https://blog.csdn.net/qq_46023503/article/details/128 ...

  5. SpringCloud系列博客父工程xml依赖

    SpringCloud系列博客父工程xml依赖 <?xml version="1.0" encoding="UTF-8"?><project ...

  6. SpringCloud系列之Nacos+Dubbo+Seata应用篇

    SpringCloud系列之Nacos+Dubbo+Seata应用篇 原文链接:https://www.cnblogs.com/chinaWu/p/13671620.html ---------- 源 ...

  7. SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】

    阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...

  8. SpringCloud 微信小程序授权登录 获取openId SessionKey【SpringCloud系列13】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 自我提升方法推荐:神奇的早起 早上 5:00 -5:20 起床刷牙 5:30-6:00 晨练(跑步.跳绳.骑自行车.打球等等) ...

  9. SpringCloud之Ribbon简单入门

    提出疑问 ① 如何在配置Eureka Client注册中心时不去硬编码Eureka Server的地址? ② 在微服务不同模块间进行通信时,如何不去硬编码服务提供者的地址? ③ 当部署多个相同微服务时 ...

最新文章

  1. bootsrap Glyphicons 字体图标
  2. Hash查找的基本原理及实现
  3. 洛谷P2401 不等数列(线性DP)
  4. IE下 c00ce56e 错误竟然是nginx 字符设置的问题
  5. 画出的点做交互_设计之下交互设计原型设计之概念设计
  6. 添加组合索引时,做相等运算字段应该放在最前面
  7. 【前端框架之Bootstrap 02】布局与导航
  8. Linux各个文件夹介绍
  9. 每日三道前端面试题--vue 第一弹
  10. 机器学习笔记(十三):主成分分析法(PCA)
  11. shell sort 最后一列排序_Shell 编程 排序工具 sort 和 uniq
  12. 简易计时器的设计与实现-DE2|VHDL|EDA|FPGA/CPLD
  13. unity 创建中文自定义字体
  14. 教你如何用java开发Alexa语音设备。全程详细介绍。
  15. html5 侧滑菜单,侧滑菜单
  16. 快解析外网如何访问内网共享服务器
  17. CSS魔法堂:重新认识Box Model、IFC、BFC和Collapsing margins
  18. python agg函数_python – 将百分位数传递给pandas agg函数
  19. Could not resolve com.youzanyun.open.mobile:x5sdk:6.4.25.
  20. 数控加工插补功能指令

热门文章

  1. CodeIgniter笔记3
  2. 三国演义告诉我们的60个道理
  3. python 碎片图像拼接_python实现图像拼接
  4. CSS3图片跳动效果
  5. CSDN怎么换行?添加空行
  6. Nginx、servlet、redis、sentinel、nacos、sprng-cloud、
  7. GIT提交记录和Revert commit过程分析
  8. Java运行时内存工作过程
  9. JVM优化系列-详解常用的虚拟机调优参数
  10. Solaris11 磁盘分区