Spring Cloud Ribbon 客户端负载均衡 4.3
Ribbon介绍
在Eureka的自动配置依赖模块spring-cloud-starter-eureka中,已经集成了Ribbon,我们可以直接使用Ribbon来实现客户端的负载均衡。二者同时使用时,Ribbon会利用从Eureka读取到的服务信息列表,在调用服务实例时,以合理的方式进行负载。
Ribbon的使用
(1)添加@LoadBalanced注解。在xcservice-eureka-user工程引导类中的restTemplate()方法上添加@LoadBalanced注解,其代码如下:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
(2)使用服务实例名称。在用户服务实例的查询方法中,使用服务提供者(订单服务)的实例名称来执行已注册服务列表中实例的方法,具体如下:
@GetMapping("/findOrdersByUser/{id}")
public String findOrdersByUser(@PathVariable String id) {
// 假设用户只有一个订单,并且订单id为123
int oid = 123;
// return restTemplate.getForObject("http://localhost:7900/order/" + oid, String.class);
return restTemplate.getForObject("http://xcservice-eureka-order/" + id, String.class);
}
从上述代码中可以看出,getForObject()方法的URI中使用的已经不是“主机地址+端口号”的形式,而使用的是注册中心中的订单服务实例名称。
(3)创建服务监听类。为了演示负载均衡的实现效果,这里在xcservice-eureka-order工程中创建一个用于监听服务实例端口的工具类ServiceInfoUtil,其实现代码如下。
package com.xc.xcserviceeurekaorder.util; import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration; @Configuration//注册组件
public class ServiceInfoUtil implements ApplicationListener<EmbeddedServletContainerInitializedEvent> {
/**
* 声明event对象,该对象用于获取运行服务器的本地端口
*/
private static EmbeddedServletContainerInitializedEvent event; @Override
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
ServiceInfoUtil.event = event;
} /**
* 获取端口号
*/
public static int getPort() {
int port = event.getEmbeddedServletContainer().getPort();
return port;
}
}
上述工具类实现了ApplicationListener接口,该接口在Spring3.0中添加了泛型来声明所需要监听的事件类型,其中EmbeddedServletContainerInitializedEvent主要用于获取运行服务器的本地端口号。
(4)添加输出语句。在订单控制器类OrderController的查询订单方法中,增加一行执行输出当前实例端口号的语句。具体如下:
System.out.println(ServiceInfoUtil.getPort());
(5)启动服务,测试应用。分别启动注册中心、用户服务和订单服务,然后修改订单服务的端口号(如7901),再次启动一个订单服务后,Eureka信息页面的注册信息如图4-10所示。
从图4-10中可以看到,名称为xcservice-eureka-order的实例名称下包含两个不同端口号(7900和7901)的实例应用。
当通过浏览器连续4次访问地址http://localhost:8000/findOrdersByUser/1后,用户服务实例通过Ribbon分别调用了端口为7900和7901的订单服务实例,这说明已成功通过Ribbon实现了客户端的负载均衡。
其实Ribbon在工作时主要分为两步:第1步先选择EurekaServer,它会优先选择在同一个区域且负载较少的Server;第2步会根据用户指定的策略(如轮询、随机等)从Server取到的服务注册列表中选择一个地址。本案例中,Ribbon所使用的策略就是轮询。
Spring Cloud Ribbon 客户端负载均衡 4.3的更多相关文章
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 了解了 eureka 服务注册与发现 的3大角色 ,会使用RestTem ...
- 笔记: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 客户端负载均衡
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(三)
一.负载均衡 负载均衡技术是提高系统可用性.缓解网络压力和处理能力扩容的重要手段之一. 负载均衡可以分为服务器负载均衡和客户端负载均衡,服务器负载均衡由服务器实现,客户端只需正常访问:客户端负载均衡技 ...
随机推荐
- 完成一个springboot项目的完整总结一
一. 项目的基础环境的搭建 1.javaJDK的安装和配置环境变量 2.mysql 3.eclipse 二.项目高级环境的搭建 使用maven前,一定要先安装JDK 1) 解压maven到briup目 ...
- Linux PAM 之cracklib模块
如何在Linux系统中限制密码长度的同时对密码的复杂程度也进行管理,最近发现有人的密码符合长度规则,但是却很简单很容易被猜出来,查了相关资料后发现了PAM中的pam_cracklib模块就是用来 ...
- drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件
RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...
- LightOJ - 1297 - Largest Box(数学)
链接: https://vjudge.net/problem/LightOJ-1297 题意: In the following figure you can see a rectangular ca ...
- Java编译器的优化
public class Notice { public static void main(String[] args) { // 右侧20是一个int类型,但没有超过左侧数值范围,就是正确的 // ...
- 导入外部proto获取商品信息
Models.proto syntax = "proto3"; package services; //商品模型 message ProdModel { int32 prod_id ...
- C#在WebApi 中使用Redis 的方法
首先Startup public void ConfigureServices(IServiceCollection services) { services.AddControllers(); // ...
- Node.js 自学之旅(初稿篇)
学习基础,JQuery 原生JS有一定基础,有自己一定技术认知(ps:原型链依然迷糊中.闭包6不起来!哎!) 当然最好有语言基础,C#,java,PHP等等.. 最初学习这个东西的原因很简单,在园子里 ...
- [nodejs]修改全局包位置,修复npm安装全局模块命令失效。好记性不如烂笔头
修复npm -g 全局安装命令失效,好的吧不得不承认,好记性不如烂笔头,我居然会忘记方法哈哈哈 Linux安装nodejs sudo apt install node sudo apt install ...
- centos安装浏览器【备份】
chrome(谷歌) 添加源:sudo wget http://repo.fdzh.org/chrome/google-chrome-mirrors.repo -P /etc/yum.repos.d ...