ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

服务负载均衡设计及实现

2022-01-23 15:02:31  阅读:111  来源: 互联网

标签:负载 调用 服务 RestTemplate Feign 均衡 设计


业务描述

一个服务实例可以处理请求时有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?

@LoadBalanced

当使用RestTemplate进行远程服务调用时,加入需要负载均衡,还可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在ConsumerApplication中构建名字为loadBalancedRestTemplate的RestTemplate对象:

在需要RestTemplte实现负载均衡调用的地方进行依赖注入.例如在ConsumerController类中添加loadBalancedRestTemplate属性

 接下来,可以在对应的服务端调用的方法内,基于RestTemplate借助服务名进行调用,例如:

 RsetTemplate在发送请求的时候会被LoadBalancerInterceptor拦截,它的作用就是用于RestTemplate的负载均衡,loadBalancerInterceptor将负载均衡的核心逻辑交给了loadBaIancer,

知识点分析

1.   Nacos中的负责均衡底层是如何实现的?  (通过Ribbon实现,Ribbon中定义了一些负载均衡的算法,然后基于这些算法从服务实例中获取一个实例为消费方提供服务)

2.  Ribbon是什么? (Netflix公司提供的负载均衡客户端,一般用于服务方的消费方法)

3.   @LoadBalanced的作用是什么?(描述RestTemplate对象,用于告诉Spring框架,在使用RestTemplate进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后再拦截器内部,启动负载均衡策略)

基于Feign的远程服务调用(重点)

背景分析

服务消费方基于rest方式请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生。

Feign是什么?

Feign是一种声明式Web服务客户端,底层封装了Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现。如图所示:

Feign应用实践

第一步:在服务消费方,添加项目依赖 代码如下:

 第二步:在启动类上添加@EnableFeignClients注解,代码如下:

 第三步:定义请求API,基于此API借助OppenFeign访问远端服务,代码如下:

 第四步:创建FeignConsumerController中并添加feign访问,代码如下:

 第五步:启动消费者服务,在浏览器中直接通过feign客户端进行访问

Feign配置进阶实践

一个服务提供方通常会提供很多资源服务,服务消费方基于同一个服务提供方写了很多服务调用接口,此时假如没有指定contextld,服务 启动就会失败,例如,假如在服务消费方在添加一个接口,消费方启动就会失败。

此时我们需要为远程调用服务接口指定一个contexld,作为远程调用服务的唯一标识(这个标识时bean对象的名字)即可,例如:

 还有,当我们再进行远程服务调用时,假如调用的服务突然不可用了或者调用超时了,怎么办呐?一般服务消费端会给出具体的的容错方案,例如,在feign应用中通过FallbackFactory接口的实现类进行默认的相关处理,例如:

第一步:定义FallbackFactory接口的实现类,代码如下:

 第二步:在Feign访问接口中应用FallbackFactory对象,例如:

 第三步:在配置文件application.yml中添加如下配置,启动feign方式调用时的服务中断处理机制.

Feign 调用过程分析

feign应用过程分析:

1. 通过@EnableFeignCleints注解告诉springcloud,启动Feign Starter组件。

2. Feign Starter会在项目启动过程中注册全局配置,扫描包下所有@FeignClient注解描述的接口,然后由系统底层创建接口实现类(JDK代理类),并构建类的对象,然后交给spring管理(注册 IOC 容器)。
3.  Feign接口被调用时,底层代理对象会将接口中的请求信息通过编码器创建 Request对象,基于此对象进行远程过程调用。
4.  Feign客户端请求对象会经Ribbon进行负载均衡,挑选出一个健康的 Server 实例(instance)。
5.  Feign客户端会携带 Request 调用远端服务并返回一个响应。
6.  Feign客户端对象对Response信息进行解析然后返回客户端。

重难点分析

为什么使用Feign?(基于feign可以更加友好的实现服务调用,用简化服务消费方对服务提供方方法的调用)。

@FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)

Feign方式的调用,底层负载均衡是如何实现的?(Ribbon)

@EnableFeignCleints 注解 作用是什么? (描述配置类,例如启动类)

何为注册中心?(用于记录服务信息的一个web服务,例如淘宝平台,滴滴平台...)

注册中心的核心对象?(服务提供方,服务消费方,注册中心-Registry)

标签:负载,调用,服务,RestTemplate,Feign,均衡,设计
来源: https://blog.csdn.net/knbe_/article/details/122642219

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有