spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】
spring boot 1.5.9.RELEASE
spring cloud Dalston.SR1
1.前言
了解了 eureka 服务注册与发现 的3大角色 ,会使用RestTemplate 在消费者 调用提供者 的服务了,
那么如果引入了 集群 ,让提供者集群化 ,那么消费者如何调用 服务呢?
答案是使用 Ribbon 客户端负载均衡 ,与Nginx不同 ,Nginx是服务端的负载均衡 ,Ribbon则是运行在客户端的,原理是客户端从eureka 获取服务列表信息 ,然后根据在客户端
配置文件定义的 Ribbon 负载均衡策略来寻找要访问具体是那台服务器【即服务提供者,因为是集群 ,因此是不同的服务器 运行一样的代码,做一样的事情,因此注册在eureka上的应用名是一样的 ,但是ip或端口不同】
2.操作
(1)在消费者 的 pom.xml引入 Ribbon依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
完成的pom.文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.springcloud</groupId>
<!-- 父级maven模块的工程名字-->
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>demo-my-cen-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-my-cen-test</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies> <!-- 引入同级的maven-->
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-my-cen-2-2</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> <!-- <dependency>-->
<!-- <groupId>org.yaml</groupId>-->
<!-- <artifactId>snakeyaml</artifactId>-->
<!--<!– <version>${version}</version>–>-->
<!-- </dependency>--> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency><!-- 自己定义的api -->
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-config</artifactId>-->
<!-- </dependency>--> <!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
(2)
工程结构

(3)配置 RestTemplate,注册bean, ,配合注解 @LoadBalanced ,开启负载均衡
完成的配置文件
package com.example.demomycentest.cfgBean; import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; @Configuration
public class MyConfigBean { @Bean
////添加注解@LoadBalanced,开启负载均衡。。。就这么简单
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
} //设置负载均衡策略
@Bean
public IRule myRule() {
//其他看看 https://www.cnblogs.com/htyj/p/10705472.html
//
//该策略通过遍历负载均衡器中维护的所有实例,会过滤调故障的实例,并找出并发请求数最小的一个,所以该策略的特征是选择出最空闲的实例
//return new BestAvailableRule(); //轮询策略,其实里面就是一个计数器
return new RoundRobinRule(); }
}
更过负载均衡策略可以查看这篇博文 : https://www.cnblogs.com/htyj/p/10705472.html
基本常用的默认策略 有 :
- RandomRule:
实现了从服务实例清单中随机选择一个服务实例的功能
- RoundRobinRule:
实现了按照线性轮询的方式一次选择每个服务实例的功能
- RetryTule:
实现了一个具备重试机制的实例选择功能
- WeightedRespinseTimeRule:
该策略是对RoundRobinRule的扩展,增加了根据实例的运行情况来计算权重,并根据权重来挑选实例,已达到更优的分配效果。
- ClientConfigEnabledRoundRobinRule
该策略较为特殊,我们一般不直接使用它。因为它本身并没有实现什么特殊的处理逻辑,真如代码中所示,在他的内部定义了一个RoundRobinRule策略,而choose函数的实现也正是使用了RoundRobinRule的线性轮询机制,所以它实现的功能实际上RoundeRobinRule相同。
虽然不能直接使用该策略,但是可以通过继承该策略,默认的choose就实现了线性轮询机制,但是可以在子类中实现更高级的策略
- BestAvailableRule
该策略通过遍历负载均衡器中维护的所有实例,会过滤调故障的实例,并找出并发请求数最小的一个,所以该策略的特征是选择出最空闲的实例
(4)application.yml文件配置
server:
port: 565 spring:
application:
name: demo-my-cen-test
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/clinic?characterEncoding=utf-8 # 数据库名称
username: root
password: mysql
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间 eureka:
client:
register-with-eureka: false # 当前微服务不注册到eureka中(消费端)
service-url:
defaultZone: http://localhost:7001/eureka/
# 如果有注册中心不在线,但是写上了地址,会报错
# ,http://localhost:7002/eureka/,http://localhost:7003/eureka/
(5)controller层
package com.example.demomycentest.controller; //import com.example.demomycen22.pojo.Food;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; @Controller
public class GGController { private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT1"; /**
* 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
* ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
*/
@Autowired
private RestTemplate restTemplate; @RequestMapping("/bb")
@ResponseBody
public String bb(){ // Food d = new Food();
// d.setApple("苹果");
// d.setEgg("鸡蛋");
// System.out.println(d); System.out.println("调用服务,开启负载均衡Ribbon");
//使用restTemplate 直接调用 ,postForObject 是post请求方式 ,getForObject是get请求方式,根据服务提供者的接口选择,这个是需要提前知道服务提供者的接口格式的
return restTemplate.getForObject(REST_URL_PREFIX + "/ask", String.class); }
}
(6)启动类需要使用注解@EnableEurekaClient ,注册为eureka客户端

3.测试
(1)提前准备好了2个 服务提供者作为集群,端口分别是8001,8003 ,一个服务注册中心,端口7001 ,本服务消费者端口565

(2)查看eureka控制面板

ok,运行正常
8001端口业务截图

8003端口业务截图

消费者565端口的业务 在 第二节(5)controller层 有源码,这里就不展示了
(3)去浏览器调用消费者接口 ,输入 http://localhost:565/bb
访问第一次

访问第2次

访问第三次

完美 !!!
因为是使用了轮询负载均衡策略 ,【就是轮流访问集群的每个服务器】,Ribbon会根据策略选择访问具体是哪个服务
spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】的更多相关文章
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...
- 笔记:Spring Cloud Ribbon 客户端负载均衡
Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,基于 Netflix Ribbon 实现,通过Spring Cloud 的封装,可以让我们轻松的将面向服 ...
- Spring Cloud Ribbon——客户端负载均衡
一.负载均衡负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意思 ...
- Spring Cloud Ribbon客户端负载均衡(四)
序言 Ribbon 是一个客户端负载均衡器(Nginx 为服务端负载均衡),它赋予了应用一些支配 HTTP 与 TCP 行为的能力,可以得知,这里的客户端负载均衡也是进程内负载均衡的一种.它在 Spr ...
- Spring Cloud Ribbon 客户端负载均衡 4.3
在分布式架构中,服务器端负载均衡通常是由Nginx实现分发请求的,而客户端的同一个实例部署在多个应用上时,也需要实现负载均衡.那么Spring Cloud中是否提供了这种负载均衡的功能呢?答案是肯 ...
- Spring Cloud Ribbon 客户端负载均衡
Ribbon客户端组件提供一系列完善的配置选项,比如连接超时.重试.重试算法等,内置可插拔.可定制的负载均衡组件.下面是用到的一些负载均衡策略: 简单轮询负载均衡 加权轮询负载均衡 区域感知轮询负载均 ...
- Spring Cloud 2-Ribbon 客户端负载均衡(二)
Spring Cloud Eureka 1.Hello-Service服务端配置 pom.xml application.yml 启动两个service 2.Ribbon客户端配置 pom.xml ...
- spring cloud 之 客户端负载均衡 Ribbon
一.负载均衡 负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意 ...
- 【Spring Cloud】客户端负载均衡组件——Ribbon(三)
一.负载均衡 负载均衡技术是提高系统可用性.缓解网络压力和处理能力扩容的重要手段之一. 负载均衡可以分为服务器负载均衡和客户端负载均衡,服务器负载均衡由服务器实现,客户端只需正常访问:客户端负载均衡技 ...
随机推荐
- 【Linux】【CentOS7】免密登录突然失效
[报错解决]免密登录突然失效 哔哩哔哩 萌狼蓝天 博客:萌狼工作室-博客园 [问题描述] 原本配置好了的免密登录,今天启动hadoop发现免密登录失效了 [解决方案] 1.切换到管理员模式,进入配置文 ...
- 常用windows命令和Dos命令
Windows常用快捷键 Ctrl + C :复制 Ctrl + V :粘贴 Ctrl + X :剪切 Ctrl + A :全选 Ctrl + Z :撤销(做错了后退一步) Ctrl + Y :向前一 ...
- Python3元组的简介和遍历
一.Python3元组简介 1.1.如何创建一个元组 ''' Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号(),列表使用方括号[]. 元组创建很简单,只需要在括号中添 ...
- 从离线分析建模到稳健风控升级,为什么说顶象Dinsight实时风控引擎是对的选择?
随着金融业数字化程度进一步加深,互联网垂直电商.消费金融等领域与人们生活的深度融合,数字科技在安全风险控制上已经成为了重要的基石.如何主动防范化解风险,建立智能化的实时风险监测预警体系,加速业务模式转 ...
- 转:ios delegate
首先,大家应该都明白的是委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事.也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法. 其次,我简单的总结了 ...
- [BUUCTF]PWN2——rip
[BUUCTF]PWN2-rip 题目网址:https://buuoj.cn/challenges#rip 步骤: 例行检查附件,64位程序,没有开启任何保护 nc一下,看看输入点的提示字符串,让我们 ...
- 解决android studio no debuggable process
这个问题可能是由多种因素造成的. 一.可能是buildtypes配置或选择错误,在对应module的build.gradle中确认如下配置 debug { debuggable true//一定要配置 ...
- Python 属性方法、类方法、静态方法、 特殊属性__doc__ (内建属性)
总结:和类的关联性讲:属性方法>类方法>静态方法 属性方法@property:仅仅是调用方式不用+括号. 类方法@classmethod:访问不了累的属性变量,只可以访问类变量. 静态方法 ...
- C++实现反射---RTTR库的使用
使用过C#或者Java 的童鞋,应该对这些语言提供的反射机制有所了解.所谓反射,在我看来就是在只知道一个类的名字(字符串形式)的情况下,自动创建出具体的类实例,并且能够枚举该类型拥有的属性.方法等信息 ...
- 制作一个文档同步工具,自动同步到gitee中。。。
之所以要做这个工具是为了让自己可以随时用电脑时能记录日常工作或生活.一般只需要简单记录下就行了.这样我在家里的和公司里的记录都能同步看到. 这样后期整理的时候看到几个关键词就能想起来具体的事情,有的也 ...