手把手带你利用Ribbon实现客户端的负载均衡
之前的文章《SpringCloud搭建注册中心与服务注册》介绍了注册中心的搭建和服务的注册,本文将介绍下服务消费者通过Ribbon调用服务实现负载均衡的过程。
本文目录
一、Ribbon服务调用流程二、搭建注册中心三、服务提供者四、服务消费者五、服务调用实战
一、Ribbon服务调用流程
Ribbon是一个客户端负载均衡器,它有几种负载均衡机制,默认是轮询,我们也可以自定义规则,通过合理的分配网络请求来减小服务器的压力。
总体流程是首先启动注册中心,服务提供者提供服务并注册到注册中心,消费者从注册中心中获取服务并执行。
实现服务调用需要有三个角色:服务注册中心、服务提供者和服务消费者。
二、搭建注册中心
首先新建一个SpringBoot项目,命名spring-cloud-eureka,然后按照下面步骤编写代码即可。
- pom.xml代码
添加eureka-server的依赖,代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version><!-- eureka版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 启动类代码
启动类添加注解@EnableEurekaServer即可,代码如下:
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaApplication.class, args);
}
}
- 配置文件
使用yml的配置文件,application.yml配置如下:
server:
port: 9001 #服务端口
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #是否将eureka自身作为应用注册到eureka注册中心
fetch-registry: false #为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
配置项说明:
1. server.port=9001表示设置该服务注册中心的端口号
2. eureka.instance.hostname=localhost表示设置该服务注册中心的hostname
3. eureka.client.register-with-eureka=false,由于我们目前创建的应用是一个服务注册中心,而不是普通的应用。默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种默认行为
4. eureka.client.fetch-registry=false,表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
- 运行截图
打开浏览器访问http://localhost:9001/,可以看到注册中心以及启动,运行截图如下:

注册中心运行截图
三、服务提供者
服务注册中心有了之后,我们可以向这个服务注册中心注册一个服务提供者,新建一个SpringBoot项目,命名spring-cloud-user-service,提供用户查询服务,然后按照下面步骤编写代码即可。
- pom.xml代码
添加eureka-client的依赖,代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version><!-- eureka版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 启动类代码
启动类添加注解@EnableEurekaClient即可,代码如下:
@EnableEurekaClient
@SpringBootApplication
public class UserServiceDemoApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceDemoApplication.class, args);
}
}
添加一个提供用户服务的UserController,代码如下:
/**
* 用户服务
*/
@Slf4j
@RestController
@RequestMapping("/provider")
public class UserController {
static Map<Integer, User> userMap = new HashMap<>();
static {
//模拟数据库
User user1 = new User(1, "张三", "123456");
userMap.put(1, user1);
User user2 = new User(2, "李四", "123123");
userMap.put(2, user2);
}
/**
* 根据id 查询
*/
@RequestMapping("/getUser")
public String getUser(Integer id) {
log.info("调用getUser接口,id={}",id);
User user = userMap.get(id);
return JSON.toJSONString(user);
}
- 配置文件
使用yml的配置文件,application.yml配置如下:
server:
port: 8100 #服务端口
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9001/eureka/
spring:
application:
name: user-service
四、服务消费者
首先新建一个SpringBoot项目,命名spring-cloud-consumer-ribbon,然后按照下面步骤编写代码即可。
- pom.xml代码
添加eureka-client的依赖,代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version><!-- eureka版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 启动类代码
配置RestTemplate时候添加@LoadBalanced注解,就代表启动Ribbon,进行负载均衡。
启动类添加注解@EnableEurekaClient,也注册到注册中心,代码如下:
@EnableEurekaClient
@SpringBootApplication
public class RibbonConsumerApplication {
//当添加@LoadBalanced注解,就代表启动Ribbon,进行负载均衡
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
}
- Controller代码
添加一个Controller,用于调用服务提供者。
/**
* 消费者Controller
*/
@Slf4j
@RestController
@RequestMapping("/consumer")
public class RibbonConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 调用 user微服务
*/
@GetMapping("getUser")
public String getUser(Integer id) {
String url = "http://user-service/provider/getUser?id=" + id;
return restTemplate.getForObject(url, String.class);
}
}
- 配置文件
使用yml的配置文件,application.yml配置如下:
server:
port: 8082 #服务端口
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9001/eureka/
spring:
application:
name: user-service-consumer-ribbon
五、服务调用实战
- 启动服务中心并注册服务
代码编写之后,按顺序启动spring-cloud-eureka、spring-cloud-user-service和spring-cloud-consumer-ribbon,先访问注册中心http://localhost:9001/,出现下图说明注册中心和两个服务已经注册成功。
注册中心运行截图
需要注意的是为了演示负载均衡,启动spring-cloud-user-service时候启动两个服务8100和8200,启动命令如下:
java -jar spring-cloud-user-service-0.0.1-SNAPSHOT.jar --server.port=8100
java -jar spring-cloud-user-service-0.0.1-SNAPSHOT.jar --server.port=8200
- 服务调用
打开浏览器访问连续访问几次http://localhost:8082/consumer/getUser?id=1,我们可以看到每次处理请求的者user-service实例每次都是不一样的,这里就是客户端负载均衡策略的体现,我把调用过程做成了gif图片,效果如下:

调用gif图片
到此SpringCloud通过Ribbon调用服务实现负载均衡的过程已经全部实现,有问题欢迎留言沟通哦!
完整源码地址: https://github.com/suisui2019/springboot-study
推荐阅读
1.SpringCloud搭建注册中心与服务注册
2.SpringCloud实现服务间调用(RestTemplate方式)
3.别在 Java 代码里乱打日志了,这才是正确的打日志姿势!
4.编码神器Lombok,学会后开发效率至少提高一倍!
5.利用Spring Boot+zxing,生成二维码还能这么简单
限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:
Java碎碎念公众号
手把手带你利用Ribbon实现客户端的负载均衡的更多相关文章
- SpringCloud系列七:使用Ribbon实现客户端侧负载均衡
1. 回顾 在前面,已经实现了微服务的注册与发现.启动各个微服务时,Eureka Client会把自己的网络信息注册到Eureka Server上. 但是,在生成环境中,各个微服务都会部署多个实例,因 ...
- 5.使用Ribbon实现客户端侧负载均衡
Ribbon实现客户端侧负载均衡 5.1. Ribbon简介 Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法 ...
- Spring Cloud 入门教程(五): Ribbon实现客户端的负载均衡
接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端 ...
- 关于spring cloud eureka整合ribbon实现客户端的负载均衡
1. 实现eureka整合ribbon非常简单, 1.1.首先引入所需maven依赖 <dependency> <groupId>org.springframework.boo ...
- SpringCloud之实现客户端的负载均衡Ribbon(二)
一 Ribbon简介 Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务 ...
- Spring Cloud Ribbon源码分析---负载均衡实现
上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...
- Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制
Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制 因为没有注册中心,所以需要网关对下游服务做负载均衡,然后果断集成Ribbon.中间遇到很多坑,最后终于解决了. 其实Ribbon里面 ...
- Puppet利用Nginx多端口实现负载均衡
随着公司应用需求的增加,需要不断的扩展,服务器数量也随之增加,当服务器数量不断增加,我们会发现一台puppetmaster压力大,解析缓慢,而且时不时出现"time out"之类的 ...
- 客户端实现负载均衡:springCloud Ribbon的使用
Netfilx发布的负载均衡器,是一个基于http.tcp的客户端负载均衡工具,具有控制http.tcp客户端的行为,为ribbon配置服务提供者的地址后,ribbon就 可以经过springClou ...
随机推荐
- CountHunter 6101 最优贸易 强联通缩点
题目传送门 题解:强连通锁点之后. 就成了一副单向图. 然后对于每个点 找到 后面合法的点的最大值就好了. 合法就是后面的那个点可以走到n号点. 也可以正向跑一遍dij 求出到这个点的最小花费. 然后 ...
- hdu 6092 Rikka with Subset(多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6092 #include <cstdio> #include <iostream> ...
- SSH项目,JSP项目,SSM项目源码附带环境安装指导视频教程
基于java开发的一个局域网端口扫描程序下载地址:https://www.icodedock.com/article/6.html 用JAVA实现对JAVA代码的格式化下载地址:https://www ...
- 「每日五分钟,玩转JVM」:对象内存布局
概览 一个对象根据不同情况可以被划分成两种情况,当对象是一个非数组对象的时候,对象头,实例数据,对齐填充在内存中三分天下,而数组对象中在对象头中多了一个用于描述数组对象长度的部分 对象头 对象头分为两 ...
- mysql5.7指定字符集
在这个配置下面加上下面这行就可以 [mysqld] character_set_server=utf8 重启后: mysql> show variables like 'char%';+---- ...
- SqlServer DbHelper
/// <summary> /// 数据库通用操作类 /// </summary> public abstract class DbHelper { #region " ...
- Winform应用程序简介
1.winform应用程序是一种智能客户端技术,我们可以使用winform应用程序帮助我们获得信息或传输信息等. WPF技术——XAML美化界面. 2. F4快速属性 (1)Name:在后台要获得前 ...
- Python 开发植物大战僵尸游戏
作者:楷楷 链接:https://segmentfault.com/a/1190000019418065 开发思路 完整项目地址: https://github.com/371854496/pygam ...
- Rocksdb基本用法
rocksdb 用法 rocksdb 介绍 RocksDB是使用C++编写的嵌入式kv存储引擎,其键值均允许使用二进制流.由Facebook基于levelDB开发, 提供向后兼容的levelDB AP ...
- 在Typora中使用Markdown
在Typora中使用Markdown 记:准备正式开始在博客园写博客,故学习Markdown语法,为写博客做好准备.以前也在CSDN写过一些,但广告太多,个人更喜欢博客园的简洁. 1. 标题 (#)标 ...