最适合新手入门的SpringCloud教程 6—Ribbon负载均衡「F版本」

SpringCloud版本:Finchley.SR2
SpringBoot版本:2.0.3.RELEASE
源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials
前言
写博客一个多月了,断断续续的更新,今天有小伙伴催更新了,很高兴,说明我的分享是有意义的。

于是乎,更新来了,还顺便给该系列教程改了个名儿《最适合入门的SpringCloud教程》

通过之前的几篇文章,在代码中会有三个项目,分别是两个注册中心和一个客户端,如下图:

今天将会在这个代码的基础上:
- 将 eureka-client-8803 作为服务提供者
- 通过IDEA将eureka-client-8803启动在8803和8804端口上,模拟服务提供者集群
- 再创建一个服务消费者eureka-consumer-8805
- 让消费者通过服务调用和负载均衡调用服务提供者的服务。

Tips:需要了解过RestTemplate的使用 SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
服务提供者集群运行,创建服务消费者
服务提供者写Controller接口
在服务提供者eureka-client-8803中写入一个TestController类
package com.lby.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author luxiaoyang
* @create 2020-04-02-20:13
*/
@RestController
public class TestController {
/**
* @Value("${server.port}") 读取application配置文件中的值
* 赋值到成员变量上
*
* ${server.port} 参数为 application配置文件中的key
*/
@Value("${server.port}")
private String port;
/**
* @RequestParam 获取Request参数的 用于RestFul风格中
* @PathVariable 获取路径中的参数
*/
@GetMapping("showImgById")
public String showImgById(@RequestParam("id") Integer id){
return "查询到id为:"+id+"的信息,使用端口号为:"+port;
}
}
通过IDEA在8803和8804端口号启动服务提供者「模拟集群」
IDEA 中 默认项目启动是单例的,即一个项目只能够在一个端口号启动一次。但是在IDEA 实际上是支持多实例的,一个项目可以通过修改端口号启动多次。
以eureka-client-8803为例
1.修改eureka-client-8803的IDEA启动设置


IDEA的版本不同,还会出现如图所示的配置

2.在 8803 端口号启动项目


3.不要关闭 8803 这个服务,然后直接修改yml中的端口号为8804,再次通过启动类启动


通过以上步骤,就启动了两个服务提供者,用来模拟集群,效果如下

创建服务消费者 eureka-consumer-8805
根据之前教程中的步骤,再创建一个客户端eureka-consumer-8805作为消费者

pom配置
<dependencies>
<!-- Eureka 客户端的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- web的依赖-->
<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>
</dependencies>
application配置文件
server:
port: 8805
#指定当前服务的名称 会注册到注册中心
spring:
application:
name: eureka-consumer-8805
# 指定 服务注册中心的地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8801/eureka,http://localhost:8800/eureka
启动类
package com.lby;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author luxiaoyang
* @create 2020-04-02-20:43
*/
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaConsumer8805 {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumer8805.class,args);
}
}
服务调用和负载均衡
Ribbon负载均衡
Ribbon是一个基于HTTP和TCP的客户端负载均衡工具。
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的负载均衡算法。
关于Ribbon的简介,有一个名词需要进行解释,客户端负载均衡?
负载均衡是一种非常常见的技术,例如:Nginx,F5。

对于Nginx来说,在Nginx中存储一份服务端的清单,用户的请求到达Nginx之后,Nginx会根据负载均衡策略从服务清单中选择一台服务器去处理客户端的请求。
服务清单存储在负载均衡服务中,这就是服务端负载均衡。
而客户端负责均衡,例如Ribbon,本身是不存储可用服务清单的,需要服务清单的时候通过服务节点找注册中心获取。
服务消费者 eureka-consumer-8805 中通过RestTemplate+Ribbon调用服务提供者
RestTemplate+Ribbon的配置
1.在服务消费者 eureka-consumer-8805中导入Ribbon的依赖
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.在启动类中写RestTemplate+Ribbon的配置

演示Ribbon负载均衡的效果
1.在消费者中创建接口 通过RestTemplate调用服务提供者
package com.lby.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author luxiaoyang
* @create 2020-04-02-20:49
*/
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
/**
* 调用服务提供者
*/
@RequestMapping("/consumer/showConsumer")
public String showConsumer(){
/**
* 通过Ribbon 发送服务调用 用的是RestTemplate
* RestTemplate 本身没有负载均衡的能力
*
* 注意:RestTemplate请求地址中写的不是 ip+端口号 而是被调用服务的服务名称
*/
String object = restTemplate.getForObject("http://eureka-client-8803/showImgById?id=1", String.class);
return "查询到服务提供者的数据,"+object;
}
}
注意:RestTemplate请求地址中写的不是 ip+端口号 而是被调用服务的服务名称
2.重启所有的服务,两个服务提供者,一个服务消费者
3.访问服务消费者的接口
请求地址:http://localhost:8805/consumer/showConsumer
可以看到每次请求端口号不一样


总结
以上就是RestTemplate+Ribbon的负载均衡的基本使用
- RestTemplate负责服务调用
- Ribbon实现负载均衡
恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。

要掌握SpringCloud更多的用法,请持续关注本系列教程。
求关注,求点赞,求转发
最适合新手入门的SpringCloud教程 6—Ribbon负载均衡「F版本」的更多相关文章
- SpringCloud学习(4)——Ribbon负载均衡
Ribbon概述 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. 简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端软 ...
- SpringCloud无废话入门02:Ribbon负载均衡
1.白话负载均衡 在上一篇的介绍中,我们创建了两个一模一样的服务提供者:Provider1和Provider2,然后它们提供的服务也一模一样,都叫Hello-Service.为什么一样的服务我们要部署 ...
- SpringCloud的入门学习之概念理解、Ribbon负载均衡入门
1.Ribbon负载均衡,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端.负载均衡的工具. 答:简单的说,Ribbon是Netflix发布的开源项目,主要功能 ...
- SpringCloud系列之客户端负载均衡Netflix Ribbon
1. 什么是负载均衡? 负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力.提到负载均衡,你可能想到nginx.对于负 ...
- spring-cloud: eureka之:ribbon负载均衡自定义配置(二)
spring-cloud: eureka之:ribbon负载均衡自定义配置(二) 有默认配置的话基本上就是轮询接口,现在我们改用自定义配置,同时支持:轮询,随机接口读取 准备工作: 1.eureka服 ...
- SpringCloud学习笔记(2):使用Ribbon负载均衡
简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...
- SpringCloud系列——Ribbon 负载均衡
前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用 ...
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...
- spring-cloud: eureka之:ribbon负载均衡配置(一)
spring-cloud: eureka之:ribbon负载均衡配置(一) 比如我有: 一个eureka服务:8761 两个user用户服务: 7900/7901端口 一个movie服务:8010 1 ...
随机推荐
- 用 Python 生成 HTML 表格
在 邮件报表 之类的开发任务中,需要生成 HTML 表格. 使用 Python 生成 HTML 表格基本没啥难度, for 循环遍历一遍数据并输出标签即可. 如果需要实现合并单元格,或者按需调整表格样 ...
- Nginx之反向代理配置(二)
前文我们聊了Nginx的防盗链.反向代理以及开启nginx代理缓存,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12417130.html:今天我们继续说ng ...
- Windows下安装虚拟机
一.准备工作 1.下载centos7操作系统 阿里巴巴站点: http://mirrors.aliyun.com/centos/7/isos/x86_64/ 2.下载VMware虚假机 可以直接通过3 ...
- 报错: raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
Django2.0同步Mysql数据库时出现的问题 执行 python manage.py makemigrations 报错 # 报错位置 File "G:\python\lib\site ...
- Element-UI饿了么时间组件控件按月份周日期,开始时间结束时间范围限制参数
在日常开发中,我们会遇到一些情况,在使用Element-UI 限制用户的日期时间范围的选择控制(例如:查询消息开始和结束时间,需要限制不能选择今天之后的时间). 看了网上的一些文档,零零散散.各式各样 ...
- SUCTF checkin
复现的时候看了源码...... 发现文件上传时会对文件内容以及后缀进行严格的检测 同时还有exif_imagetype 这个就用图片马就行绕过,绕过文件后缀试一下传图片马解析为php 但是常规解析 ...
- 借助Redis完成延时任务
背景 相信我们或多或少的会遇到类似下面这样的需求: 第三方给了一批数据给我们处理,我们处理好之后就通知他们处理结果. 大概就是下面这个图说的. 本来在处理完数据之后,我们就会马上把处理结果返回给对方, ...
- Tomcat起不来的原因
1.没有配java_home Tomcat是Java编写的,所以必须要java_home 2.端口被占用 怎么查看端口被占用呢?——windows 小工具:Fport.exe 3.Catalina_h ...
- Java集合01——List 的几个实现类,了解一下?
从本文起,我们将开始分享 Java 集合方面的知识,关注公众号「Java面典」了解更多 Java 知识点. List 是继承于 Collection 的接口,其实现类有 ArrayList,Linke ...
- rimraf node_modules 突然不能用了 怀疑是yarn的问题,从环境变量将yarn删掉,能用了
rimraf node_modules 突然不能用了 怀疑是yarn的问题,从环境变量将yarn删掉,能用了