【SpringCloud】SpringCloud详解之Ribbon实战

news2024/10/7 12:27:54

目录

  • 前言
  • SpringCloud Ribbon 负载均衡
    • 一需求
    • 二.RestTemplate远程调用配置负载均衡(order服务内修改)
    • 三.Ribbon实现负载均衡的原理
    • 四.Ribbon负载均衡策略
      • 1.负载均衡种类
      • 2.配置负载均衡(order服务中配置)
    • 五.Ribbon的饥饿加载配置(在order服务配置)

前言

微服务中比如用户服务部署多台服务器,怎么调用其中某一服务呢?
这里有组件的讲解 SpringCloud组件原理和面试题

SpringCloud Ribbon 负载均衡

SpringCloud Feign 远程调用实战

一需求

假设现在用户服务部署在两台或者多台服务器上,订单用户怎么去访问某一个?
在这里插入图片描述

二.RestTemplate远程调用配置负载均衡(order服务内修改)

1.修改远程调用用户的代码

	@Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 根据订单id查询订单
        Order order = orderMapper.findById(orderId);
        // 利用RestTemplate发起http请求,根据用户id查询用户
        // 把localhost改为服务名称
 这里这里  String url = "http://userservice/user/" + order.getUserId();
        //String url = "http://localhost:8081/user/" + order.getUserId();
        // 发送http请求,实现远程调用,现在是get请求类型
        User user = restTemplate.getForObject(url, User.class);
        // 封装user到Order
        order.setUser(user);
        // 返回值
        return order;
    }

注意: Feign集成了Ribbon,不用去特别配置负载均衡。
2.RestTemplate配置类加上注解

	 /**
     * 创建RestTemplate并注入Spring容器
     */
    @Bean
    @LoadBalanced //负载均衡注解
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

三.Ribbon实现负载均衡的原理

Ctrl + N 快速查找类:原理是 LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 接口。


客户端http请求拦截器

@FunctionalInterface
public interface ClientHttpRequestInterceptor {
    ClientHttpResponse intercept(HttpRequest var1, byte[] var2, ClientHttpRequestExecution var3) throws IOException;
}
 
public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {

	重写ClientHttpRequestInterceptor接口的方法
	@Override
	public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,final ClientHttpRequestExecution execution) throws IOException {
		// 1.获取http的请求地址
		final URI originalUri = request.getURI();
		
		// 2.获取服务的名称
		String serviceName = originalUri.getHost();
		
		Assert.state(serviceName != null,"Request URI does not contain a valid hostname: " + originalUri);
		
		//3.我们进去execute方法:就是为了从Eureka-Server拉取信息
		return this.loadBalancer.execute(serviceName,this.requestFactory.createRequest(request, body, execution));
	}
}
public class RibbonLoadBalancerClient implements LoadBalancerClient {
	//4.进入此方法
	public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
		//调用下面的execute方法
        return this.execute(serviceId, (LoadBalancerRequest)request, (Object)null);
    }

	public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint) throws IOException {
		
		//5.根据服务名称获取对应的服务列表,loadBalancer里面有List存有服务的地址
        ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);
       
        //6.根据算法选择要使用的服务,会进入IRule接口里面,默认是轮询算法
        Server server = this.getServer(loadBalancer, hint);
       
        if (server == null) {
            throw new IllegalStateException("No instances available for " + serviceId);
        } else {
            RibbonLoadBalancerClient.RibbonServer ribbonServer = new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
            return this.execute(serviceId, (ServiceInstance)ribbonServer, (LoadBalancerRequest)request);
        }
    }
}

在这里插入图片描述

四.Ribbon负载均衡策略

Ribbon负载均衡策略是 IRule接口定义的,每一个子接口都是一种策略。下面是常见负载均衡算法

1.负载均衡种类

负载均衡类规则
RoundRobinRule轮询选择服务器。Ribbon默认负载均衡算法。
AvailabilitvFilteringRule(1) 默认情况,服务器连接3次失败,服务器设置为短路状态。短路状态持续30秒,如果再连接失败,短路状态持续时间就会几何级增长。      (2)并发数高的服务器。可配置该规则会忽略并发数高的服务器。并发数上限可以配置。
WeightedResponseTimeRule给服务器赋予权重。响应时间越长,权重越小。权重影响服务器的选择。
ZoneAvoidanceRule使用Zone对服务器进行分类。Zone可以是一个机房、一个机架等。然后对Zone内的服务进行轮询。例如:配置Zone是曹县机房,然后服务提供者会优先选择曹县机房的服务器。
BestAvailableRule忽略短路的服务器并选择并发数低的服务器。
RandomRule随机选择一个可用服务器。
RetryRule重试机制的选择逻辑。

2.配置负载均衡(order服务中配置)

(1) 代码类型

	注意:这种配置是全局的,订单服务不光调用用户服务是随机的,调用其他的服务也是随机的
	//注入新的负载均衡算法 在启动类内注入也可以自定义配置类
  	@Bean
    public IRule randomRule() {
    	//随机选取一个可用服务器
        return new RandomRule();
    }

(2) yml中配置

注意:这种局部配置,只针对用户服务去选择负载均衡的算法
userservice:  # 服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.RandomRule  # 负载均衡规则

五.Ribbon的饥饿加载配置(在order服务配置)

Ribbon默认是懒加载: 第一次加载才会创建 LoadBalancerClient ,请求时间会很长。
饥饿加载: 在项目启动时创建,降低第一次访问的耗时。

(1) 单个服务配置饥饿加载(在yml文件配置)

ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: userservice # 指定饥饿加载的服务名称

(1) 多个服务配置饥饿加载(在yml文件配置)

ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: # 指定饥饿加载的服务名称
      - userservice   # 用户服务
      - cangkuservice # 仓库服务
      - zhifuservice  # 支付服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sklearn使用入门

文章目录1.机器学习1.1 机器学习简介1.2 有监督学习(supervised learning)1.3 无监督学习(unsupervised learning)1.4 半监督学习2. 机器学习工具SKlearn2.1 sklearn2.2 sklearn常用模块2.2.1 分类2.2.2 回归2.2.3 聚类2.2.4 降维2.2.5 模型选择2.2.6 数据预处理2.3 sklearn使用…

Android startActivityForResult()废弃了,代替方案案例

安卓项目compileSdk为32&#xff0c;在使用startActivityForResult()方法时发现Android studio提示此方法已经废弃了。 目前的代替方案案例。 // 确保 app 的 build.gradle中已经引入了androidx.appcompat:appcompat dependencies {implementation androidx.appcompat:appcomp…

操作系统之进程管理---每天一点点(春招加油呀)--知识点回顾(自问自答版本总结)

1.什么是进程&#xff1f;什么是线程&#xff1f;进程和线程的区别&#xff1f; 进程&#xff1a;资源分配和管理的基本单位 线程&#xff1a;程序执行的最小单位。 区别&#xff1a; 地址空间&#xff1a; 同一进程的所有线程共享本进程的地址空间&#xff0c;而不同的进程之间…

仓库拣货标签电子价格标签办公电子标牌

数字货架标签尺寸&#xff1a;2.13英寸、2.9英寸、4.2英寸、7.5英寸、10.2英寸技术&#xff1a;2.4G MHz无线通信技术&#xff0c;电子墨水显示。刷新20&#xff0c;000个标签/1小时/AP。3-5年的寿命&#xff0c;电池可以快速更换。ESL管理系统工作原理&#xff1a;实时显示最新…

【Maven】P3 依赖管理

依赖管理依赖配置依赖传送依赖具有传递性直接依赖与间接依赖依赖冲突可选依赖排除依赖依赖范围依赖配置 依赖指的是当前项目所需要的jar包&#xff0c;在 pom.xml 中可以看到 <!--设置当前项目所依赖的所有jar包--> <dependencies><!--设置一个具体的依赖jar-…

【CVPR2022】Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation

论文标题&#xff1a;Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation收录&#xff1a;CVPR 2022paper: https://arxiv.org/abs/2203.00962code: https://github.com/zhaozhengChen/ReCAM解读&#xff1a;https://zhuanlan.zhihu.com/p/478133151https:…

mx-font

Abstract 短镜头字体生成(FFG)方法必须满足两个目标:生成的图像既要保留目标字符的底层全局结构,又要呈现多样化的局部参考风格。现有的FFG方法旨在通过提取通用表示样式或提取多个组件样式表示来分离内容和样式。然而,以往的方法要么无法捕捉不同的本地风格,要么无法推广到…

初识系统移植

系统移植简单来说就是将准备好的内核&#xff08;OS&#xff09;移植到一台主机或者开发板中&#xff0c;类似于器官移植&#xff0c;将准备好的器官移植到人体中。 为什么需要系统移植&#xff1f; 没有内核的情况下&#xff0c;上层如果要控制硬件只能将C语言代码先编译成二…

【C++】栈和队列(stackqueue)介绍,实现,oj

&#x1f345;一文包教会&#xff0c;不再赘述栈最基本的结构和性质&#xff08;栈的基本介绍在这里&#xff09; &#xff08;队列基本介绍和实现&#xff09;,博主主页还有很多栈和队列oj题哦~ 目录 ☃️1.stack_list &#x1f41d;1.1 介绍 &#x1f41d;1.2 stack和list实…

人工智能|HCIA-AI V3.0(一)——人工智能概览

文章目录一 AI、机器学习、深度学习的关系二 AI的三个方面的应用2.1 计算机视觉2.2 语音处理2.3 自然语言处理三、争议四、未来展望一 AI、机器学习、深度学习的关系 人工智能:是研究、开发用于模拟、延伸和扩展人的智能的理论、方法及应用系统的一- 门新的技术科学。 机器学习…

【蓝桥杯集训15】求最短路存在负权边——spaf算法(3 / 4)

——SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称 单源最短路&#xff0c;且图中没有负环就可以用spfa 目录 spaf求最短路模板 852. spfa判断负环 341. 最优贸易 - spfa 双向建图 3305. 作物杂交 - spaf求最短路模板 只有当一个点的前驱结点更新了&#xff0c;…

多线程共享数据结构的无锁释放

目录背景问题共享结构的无锁释放对比ref-cntrcuepoch-based reclamhazard pointer: 冒险指针结构原理正确性保证范例参考背景 多线程共享一个数据结构。 共享数据结构&#xff0c;可以做到节约内存。 但是多线程共享&#xff0c;可能会有问题&#xff0c;比如同步的问题。 问…

(Android-RTC-9)PeerConnectionFactory

开篇前瞎扯。很久没发技术文章了&#xff0c;此文一直放着草稿箱没有完成&#xff0c;感觉自己在家庭和工作中找到了拖延的借口&#xff0c;开始慢慢变得懒惰了&#xff0c;那是万万不行的。恰逢2023开年ChatGPT的爆火&#xff0c;更让我这些普通程序员危机感瞬间飙升&#xff…

安全规约第一章

文章目录传统密码和现代密码的区别古典密码近代密码现代密码定义模型证明现代密码学CryptographyCryptanalysisCryptosystemScheme如何定义算法步骤第一步&#xff0c;搞清楚安全服务目标第二步&#xff0c;计算过程中需要几方的参与需要几个算法描述它算法命名谁来运行哪一个算…

03_Apache Pulsar的Local与分布式集群构建、Pulsar的分布式集群模式、Pulsar的分布式集群模式构建\启动\测试

1.3.Apache Pulsar的Local与分布式集群构建 1.3.1 Apache Pulsar的Local模式构建 1.3.1.1.Apache Pulsar的Local模式基本使用 1.3.2.Apache Pulsar的分布式集群模式 1.3.2.1.安装zookeeper集群 1.3.3.Apache Pulsar的分布式集群模式构建 1.3.4.Apache Pulsar的分布式集群模式启…

Sparx Systems Pro Cloud Server crack

Sparx Systems Pro Cloud Server crack 云服务器 添加了新的“OSLC会话超时”设置&#xff0c;以配置OSLC用户将注销的最长非活动时间。 改进了对重复SQL列名的处理。 FLS&#xff1a;为“组”添加了对其他Microsoft Active Directory名称格式的支持。 云配置客户端 在扩展服务…

香橙派5使用NPU加速yolov5的实时视频推理(二)

三、将best.onnx转为RKNN格式 这一步就需要我们进入到Ubuntu20.04系统中了&#xff0c;我的Ubuntu系统中已经下载好了anaconda&#xff0c;使用anaconda的好处就是可以方便的安装一些库&#xff0c;而且还可以利用conda来配置虚拟环境&#xff0c;做到环境与环境之间相互独立。…

SpringCloud Alibaba入门

作为微服务刚入门的小白&#xff0c;不足之处请多多指教 1. Cloud Alibaba简介2.Nacos简介和下载3.Nacos安装4.Nacos之服务提供者注册5.Nacos之服务消费者注册和负载6.Nacos服务注册中心对比提升7.Nacos之服务配置中心8.Nacos之命名空间分组和DataID三者关系9.Nacos之DataID配…

如何写好单测

1、为什么要写单测&#xff1f; 单测即单元测试&#xff08;Unit Test&#xff09;&#xff0c;是对软件的基本组成单元进行的测试&#xff0c;比如函数、过程或者类的方法。其意义是&#xff1a; 功能自测&#xff0c;发现功能缺陷自我Code Review测试驱动开发促进代码重构并…

File、递归、IO流(一)、IO流(二)

目录 ​File类概述 File类的常用API 判断文件类型、获取文件信息 创建文件、删除文件功能 遍历文件夹 方法递归 递归的形式和特点 递归的算法流程、核心要素 递归常见案例 递归的经典问题 非规律化递归案例-文件搜索 非规律化递归案例-啤酒问题 字符集 常见字符集…