LoadBalancer 客户端的负载均衡器+openFeign 请求转发

LoadBalancer 

Spring Cloud LoadBalancer是Spring Cloud中负责客户端负载均衡的模块,其主要原理是从nacos中获取服务列表通过选择合适的服务实例来实现负载均衡。

源码跟踪

可以看到这里的intercept()方法,拦截了用户的HttpRequest请求,然后做了几件事:

1、request.getURI():获取请求uri,本例中就是 http://spzx-cloud-user/api/user/findUserByUserId/1

2、originalUri.getHost():获取uri中的服务id,spzx-cloud-user

3、this.loadBalancer.execute():处理服务id和用户请求。

这里的this.loadBalancerBlockingLoadBalancerClient类型,我们继续跟入。

choose(String serviceId)方法做了两件事:
1、获取一个loadBalancer负载均衡器对象,默认类型为:RoundRobinLoadBalancer轮询
2、根据服务的id从Nacos注册中心中获取服务地址列表,从服务列表中选择一个服务实例对象loadBalancerResponse,包括实例的ip和port

更改负载均衡算法

LoadBalancer默认的负载均衡算法是RoundRobinLoadBalancer,如果想更改默认的负载均衡算法,那么此时需要向Spring容器中注册一个Bean,并且配置负载均衡的使用者。

代码如下所示:

1、在Spring容器中注册一个Bean(订单服务创建配置类)

public class CustomLoadBalancerConfiguration {

    //创建一个bean,类型为:RandomLoadBalancer,随机
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

2、配置负载均衡算法的使用者

@Configuration
@LoadBalancerClients(value = {
        @LoadBalancerClient(
                name = "spzx-cloud-user" , 
                configuration = CustomLoadBalancerConfiguration.class
        )      // 将负载均衡算法应用到指定的服务提供方中
})
public class RestTemplateConfiguration {

    @Bean
    @LoadBalanced       // 让RestTemplate具有负载均衡的能力
    public RestTemplate restTemplate() {
        return new RestTemplate() ;
    }

}

重启服务  重启服务后可以看出 负载均衡算法已经被修改。

OpenFeign

OpenFeign 是一个Web声明式的Http客户端远程远程调用工具,底层是封装HttpClient技术,提供接口和注解形式调用。  亦在解决 restTemplate 进行远程调用的弊端。 由于通过restTemplate 进行服务调用时参数传递不够灵活所以我们这里采用了 openFeign来替代 redisTemplate

OpenFeign的配置

1. 在我们自己的微服务中引入openFeign的依赖

<!-- 加入OpenFeign的依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、在启动类上添加 @EnableFeignClients 注解开启OpenFeign的功能支持

3.编写OpenFeign的客户端

package com.atguigu.spzx.cloud.order.feign;

@FeignClient(value = "spzx-cloud-user")        // 声明当前接口是一个访问user-service的feign的客户端
public interface UserFeignClient {

    @GetMapping("/api/user/findUserByUserId/{userId}")
    public abstract User queryById(@PathVariable("userId") Long userId) ;    // 根据userId查询用户信息的接口方法

}

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

① 请求方式:GET

② 请求路径:/api/user/findUserByUserId/{userId}

③ 请求参数:Long userId

④ 返回值类型:User

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。

4、修改微服务中的远程调用代码,使用Feign客户端代替RestTemplate:

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper ;

    @Autowired
    private UserFeignClient userFeignClient ;

    @Override
    public Order findOrderByOrderId(Long orderId) {
        Order order = orderMapper.findOrderByOrderId(orderId);

        // 远程调用
        User user = userFeignClient.queryById(order.getUserId());
        order.setUser(user);
        return order ;
    }
}

OpenFeign自定义配置

日志配置

Feign提供了日志打印功能,我们在项目中可以通过配置来调整日志级别,从而了解Feign中http请求的细节 ,也就是说feign提供的日志功能可以对接口的调用情况进行监控和输出。

feign的日志的级别分为四种:

① NONE:不记录任何日志信息,这是默认值。

② BASIC:仅记录请求的方法,URL以及响应状态码和执行时间

③ HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

④ FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。


1.明配置类

public class DefaultFeignConfiguration  {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.FULL; // 日志级别为FULL
    }
}

2、如果要全局生效,将其放到微服务的启动类的@EnableFeignClients这个注解中

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

3、如果是局部生效,则把它放到对应的@FeignClient这个注解中: @FeignClient 是自定义的配置类用于进行配置openFeign的远程调用的。

@FeignClient(value = "spzx-cloud-user", configuration = DefaultFeignConfiguration .class)

4、在配置文件中配置 debug级别打印  

logging:
  level:
    com.atguigu.spzx.cloud.order.feign: debug

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在IDEA使用HBase Java API连接

一、下载安装Maven并加载到IDEA中 官网地址:Maven – Download Apache Maven 将对应版本的压缩包下载到本地,并新建一个文件夹Localwarehouse&#xff0c;用来保存下载的依赖文件 配置maven的系统环境配置&#xff0c;将maven安装的bin目录地址写入path环境变量&#xff1a; …

机器学习--循环神经网络(RNN)4

一、RNN的学习方式 如果要做学习&#xff0c;需要定义一个损失函数&#xff08;loss function&#xff09;来评估模型的好坏&#xff0c;选一个参数要让损失最小。 以槽填充为例&#xff0c;如上图所示&#xff0c;给定一些句子&#xff0c;给定一些标签&#xff0c;告诉机器…

【软件工程导论】——软工学绪论及传统软件工程(学习笔记)

&#x1f4d6; 前言&#xff1a;随着软件产业的发展&#xff0c;计算机应用逐步渗透到社会生活的各个角落&#xff0c;使各行各业都发生了很大的变化。这同时也促使人们对软件的品种、数量、功能和质量等提出了越来越高的要求。然而&#xff0c;软件的规模越大、越复杂&#xf…

测试环境搭建整套大数据系统(九:docker学习)

一&#xff1a;为什么学习dockder&#xff1f; 对于组件的搭建和部署&#xff0c;可以简化。 二&#xff1a;什么是docker&#xff1f; docker是一个平台。 三&#xff1a;怎么使用docker&#xff1f; 1. 安装&#xff0c;切换仓库。 安装 curl -fsSL https://test.docke…

[java基础揉碎]继承

为什么需要继承: > 继承就可以解决代码复用的问题 继承的基本介绍: 继承的使用细节: 1.子类继承了所有的属性和方法&#xff0c;但是私有属性和方法不能在子类直接访问&#xff0c;要通过公共的方法去访问 解决, 提供公共的方法返回: 2.子类必须调用父类的构造器,完成父…

CACLP预告 | 飞凌嵌入式与您相约山城重庆

第二十一届中国国际检验医学暨输血仪器试剂博览会&#xff08;CACLP&#xff09;将于2024年3月16日-18日在重庆国际博览中心举行。本次会议将探讨科技创新趋势&#xff0c;展示最新成果&#xff0c;发现和挖掘颠覆性技术和创新产品&#xff0c;引领实验医学体外诊断科技创新和未…

利用IP地址信息提升网络安全

在计算机网络中&#xff0c;IP地址是用于唯一标识网络设备的重要标识符。然而&#xff0c;由于网络中存在大量设备&#xff0c;有时会出现IP地址冲突的情况&#xff0c;即两个或多个设备在同一网络中使用了相同的IP地址&#xff0c;这可能导致网络连接故障和通信中断。本文将介…

机器学习开源分子生成系列(1)-DeepFrag的本地部署及使用

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …进入 文章目录 前言一、DeepFrag是什么&#xff1f;二、conda中安装DeepFrag CLI环境1. 创建环境并激活2. 下载pre-trained model3. DeepFrag CLI 使用方法必需参数&#xff1a;可选参数&#xff1a; 4. DeepFrag CLI 使用…

R语言基础的代码语法解译笔记

1、双冒号&#xff0c;即&#xff1a;“::” 要使用某个包里的函数&#xff0c;通常做法是先加载&#xff08;library&#xff09;包&#xff0c;再调用函数。最新加载的包的namespace会成为最新的enviroment&#xff0c;某些情况下可能影响函数的结果。而package name::funct…

excel统计分析——重复测量设计

参考资料&#xff1a;生物统计学 裂区设计中的裂区通常是指空间上的裂区&#xff0c;如果对试验指标进行连续测量时&#xff0c;时间也可以作为裂区因素。重复测量设计实际上就是时间裂区设计。进行试验结果的统计分析时&#xff0c;将试验因素作为主区&#xff0c;时间因素作为…

HTML—基本介绍

HTML是一种超文本标记语言(HyperText Markup Language)&#xff0c;用于创建网页的标记语言超文本&#xff1a;是指页面内可以包含图片、链接、声音、视频等内容标记&#xff1a;HTML富含大量的标签供程序员使用&#xff0c;通过标记符号来规定指定内容的样式 浏览器最终根据不…

问题解决 | vscode无法连接服务器而ssh和sftp可以

解决步骤 进入家目录删除.vscode-server rm -rf .vscode-server 然后再次用vscode连接服务器时&#xff0c;会重新安装&#xff0c;这时可能报出一些缺少依赖的错 需要联系管理员安装相关依赖&#xff0c;比如 sudo apt-get install libstdc6 至此问题解决

C.C语言初步认识

文章目录 一. 什么是C语言 二. 第一个C程序解读 三. 数据类型 四. 变量常量 4.1. 定义变量的方法 4.2. 变量的分类 4.3. 变量的使用 4.4. 变量的作用域和生命周期 4.5. 常量分类 五. 字符串 六. 转义字符 七. 注释 八. 选择语句 九. 循环语句 十. 函数 十一. 数…

ubuntu18.04编译OpenCV-3.4.19+OpenCV_contrib-3.4.19

首先确保安装了cmake工具 安装opencv依赖文件 sudo apt-get install build-essential sudo apt-get install git libgtk-3-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev li…

机器学习——分类问题、logistic分类算法

之前我们学习的线性回归算法&#xff0c;适用于预测值y为连续值的情况下&#xff0c;但是在分类问题中&#xff0c;预测值y是个离散值&#xff0c;所以线性回归算法不适用。在这篇文章中&#xff0c;主要以二分类问题为例&#xff0c;介绍分类算法————logistic回归算法&…

Elasticsearch:什么是 DevOps?

DevOps 定义 DevOps 是一种现代软件开发方法&#xff0c;它将公司软件开发 (Dev) 和 IT 运营 (Ops) 团队的工作结合起来并实现自动化。 DevOps 提倡这样一种理念&#xff1a;这些传统上独立的团队在协作方面比在孤岛中更有效。 理想情况下&#xff0c;DevOps 团队共同努力改进…

【Web】浅聊Java反序列化之C3P0——不出网Hex字节码加载利用

目录 简介 原理分析 EXP 前文&#xff1a;【Web】浅聊Java反序列化之C3P0——URLClassLoader利用 简介 不出网的情况下&#xff0c;这个C3P0的Gadget可以和fastjson&#xff0c;Snake YAML , JYAML,Yamlbeans , Jackson,Blazeds,Red5, Castor等配合使用(调用setter和初始化…

基于卷积神经网络的野外可食用植物分类系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细探讨了一基于深度学习的可食用植物图像识别系统。采用TensorFlow和Keras框架&#xff0c;利用卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测&#xff0c;并引入迁移学习模型…

.NET开源的两款第三方登录整合库

前言 我相信做开发的同学应该都对接过各种各样的第三方平台的登录授权&#xff0c;来获取用户信息&#xff08;如&#xff1a;微信登录、支付宝登录、QQ登录、GitHub登录等等&#xff09;。今天大姚分享两款.NET开源的第三方登录整合库。 MrHuo.OAuth MrHuo.OAuth是.NET项目…

加密与安全_PGP、OpenPGP和GPG加密通信协议

文章目录 PGPOpenPGPGPG工作原理工作流程用途案例说明过程 代码实现pom依赖PgpEncryptionUtilPgpDecryptionUtilCommonUtilsPgpEncryptionTest 小结 PGP PGP (Pretty Good Privacy) 是一种加密通信协议&#xff0c;用于保护电子邮件和文件的安全性和隐私。它通过使用加密、数字…