微服务负载均衡实践

概述

本文介绍微服务的服务调用和负载均衡,使用spring cloud的loadbalancer及openfeign两种技术来实现。

本文的操作是在微服务的初步使用的基础上进行。

环境说明

jdk1.8

maven3.6.3

mysql8

spring cloud2021.0.8

spring boot2.7.12

idea2022

步骤

改造Eureka为单节点

为了方便测试,把高可用Eureka还原为单节点Eureka。

修改eureka_server的application.yml

spring:application:name: eureka-server
server:port: 9000
eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/server:enable-self-preservation: falseeviction-interval-timer-in-ms: 4000

修改product-service服务和order-service服务的application.yml的Eureka配置如下

eureka:client:service-url:defaultZone: http://localhost:9000/eureka/

spring-cloud-loadbalancer

spring-cloud-loadbalancer和ribbon类似,之前的spring cloud版本eureka内部继承了ribbon ,但spring cloud版本升级后,不再内置ribbon(可查看依赖关系),spring cloud提供了自己的负载均衡的实现,可查看 官方文档

Spring Cloud provides its own client-side load-balancer abstraction and implementation. For the load-balancing mechanism, ReactiveLoadBalancer interface has been added and a Round-Robin-based and Random implementations have been provided for it. In order to get instances to select from reactive ServiceInstanceListSupplier is used. Currently we support a service-discovery-based implementation of ServiceInstanceListSupplier that retrieves available instances from Service Discovery using a Discovery Client available in the classpath.

服务调用

之前服务调用时,使用host:ip拼接成URL的方式进行调用,较为麻烦,使用@LoadBalanced注解后,可以使用微服务的服务名称来进行调用,更加方便。

在创建RestTemplate的时候,申明@LoadBalanced

使用restTemplate调用远程微服务:不需要拼接微服务的URL,用服务名称替换IP地址

修改OrderController.java,使用服务名称代替host:port的形式,避免了之前的使用实例元数据进行拼接。

修改前

product  = restTemplate.getForObject("http://"+host+":"+port+"/product/1", Product.class);

修改后

product  = restTemplate.getForObject("http://service-product/product/1", Product.class);

启动测试

启动eureka、product、order服务

浏览器访问

能访问到数据,说明服务调用成功了。

负载均衡

使用@LoadBalanced注解后,除了方便使用服务名称进行调用之外,更重要的是也实现了服务调用的负载均衡功能。准备两个商品服务,端口号分别为9001、9011,两个商品服务的作用:1.增加系统吞吐率  2.商品服务高可用。

服务架构及流程如下图:

修改product-service的controller

    @Value("${spring.cloud.client.ip-address}") //springcloud自动获取应用的ip地址private String ip;

启动product服务(9001端口)

修改product服务的yml,修改服务端口为9011

复制运行配置得到另一个proudct服务

启动product2服务(9011端口)

查看Eureka Web页面

http://localhost:9000/

看到SERVICE-PRODUCT,有2个在线状态的实例,端口分别是:9001和9011 

启动order服务

分别访问9001和9011

http://localhost:9001/product/1

http://localhost:9011/product/1

两个商品服务均正常

测试负载均衡

访问如下链接2次

http://localhost:9002/order/buy/1

发现实现 第一次访问9001商品服务,第二次访问了9011商品服务,说明实现了客户端的负载均衡

多次刷新访问http://localhost:9002/order/buy/1,发现9001和9011是交替出现,说明默认使用的负载均衡是轮询策略。

OpenFeign

此前的服务调用代码如下:

restTemplate.getForObject("http://service-product/product/1", Product.class);

如果请求参数过多是,拼接URL的方式显得麻烦,可以使用OpenFeign来解决。

OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。

OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持。

OpenFeign的使用

order-service操作

1.导入依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

2.配置调用接口

业务需求:order服务调用product服务

@FeignClient(name = "service-product")
public interface ProductFeignClient {/*** 配置需要调用的微服务接口* @return*/@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)Product findById(@PathVariable("id") Long id);
}

 3.在启动类上激活feign

//激活feign
@EnableFeignClients
public class OrderApplication {

4.通过自动注入的接口调用远程微服务

修改之前的Controller代码

@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){Product product = null;product  = restTemplate.getForObject("http://service-product/product/1", Product.class);return product;}}

修改之后的代码

@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate ProductFeignClient productFeignClient;@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){Product product = null;//调用微服务product = productFeignClient.findById(id);return product;}}

可以看出,OrderController通过注入ProductFeignClient接口实例,并调用接口方法实现了调用。 可以看出不需要自己构建http请求,就像是调用自身工程的方法调用。如果有多个参数可以传递对象参数,避免了拼接url的麻烦。

测试

启动服务

启动eureka、启动product(启动两个实例:9000和9011)、启动order

浏览器访问

分别访问,确保product服务能正常访问

http://localhost:9001/product/1

http://localhost:9011/product/1

访问order两次

http://localhost:9002/order/buy/1

多次访问,发现9001和9011交替出现,说明实现了负载均衡。

OpenFeign的配置

如果需要配置OpenFeign,在application.yml添加相关配置

配置案例如下:

feign:client:config:feignName: #FeginClient的名称connectTimeout: 5000 #建立链接的超时时长readTimeout: 5000 #读取超时时长loggerLevel: full #Fegin的日志级别errorDecoder: com.example.SimpleErrorDecoder #Feign的错误解码器retryer: com.example.SimpleRetryer #配置重试requestInterceptors: #添加请求拦截器- com.example.FooRequestInterceptor- com.example.BarRequestInterceptordecode404: false #配置熔断不处理404异常#日志配置  #NONE : 不输出日志(高)   #BASIC: 适用于生产环境追踪问题#HEADERS : 在BASIC的基础上,记录请求和响应头信息   #FULL : 记录所有service-product:logger-level: FULL #配置商品服务日志compression:request:enabled: true #开启请求压缩mime-types: text/html,application/xml,application/json #设置压缩的数据类型min-request-size: 2048 #设置触发压缩的大小下限response:enabled: true #开启相应压缩
logging:level:org.example.order.feign.ProductFeignClient: debug #配置具体接口的日志级别

总结

两种服务调用及负载均衡技术:@LoadBalanced方式和OpenFeign的方式。

1.@LoadBalanced方式是借助于RestTemplate方式进行,可以直接使用服务名称来调用,但需要拼接URL。

2.OpenFeign的方式是通过声明接口并注入接口进行调用,避免了拼接URL的麻烦。

完成!enjoy it!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文编程开发语言工具开发案例:多种称重方式编程实际例子

中文编程开发语言工具开发案例&#xff1a;多种称重方式编程实际例子 上图为 计价秤&#xff0c;使用串口通讯线连接电脑的主机&#xff0c;软件自动读取称的重量&#xff0c;自动计算金额。这种方式称重快速&#xff0c;不需再打印条码。 上图这个称重方式为 一体称称重&#…

ES6(ECMAScript 2015)有哪些新属性,如何判断当前浏览器是否支持?

ES6&#xff08;ECMAScript 2015&#xff09;引入了许多新的语法和特性&#xff0c;以增强 JavaScript 编程语言的功能。以下是一些常见的 ES6 语法和特性以及它们的解释&#xff1a; let 和 const 声明&#xff1a; let 和 const 用于声明变量&#xff0c;代替了旧的 var 关键…

Kubernetes基础概念及架构和组件

目录 一、kubernetes简介 1、kubernetes的介绍与作用 2、为什么要用K8S&#xff1f; 二、kubernetes特性 1、自我修复 2、弹性伸缩 3、服务发现和负载均衡 4、自动发布&#xff08;滚动发布/更新&#xff09;和回滚 5、集中化配置管理和密钥管理 6、存储编排 7、任务批…

虚拟音频设备软件 Loopback mac中文版软件介绍

创建虚拟音频设备以从应用程序和音频输入设备获取声音&#xff0c;然后将其发送到音频处理应用程序&#xff0c;它就是—Loopback for Mac&#xff0c;Loopback mac为您提供高端工作室混音板的强大功能&#xff0c;有了它在Mac上传递音频会变得很容易。 Loopback for mac中文版…

Qt ModelViewDelegate(模型-视图-代理) 介绍和使用

一、Model (模型) 介绍 Qt Model 是 Qt 的一个重要组件&#xff0c;用于管理和展示数据。它是 Qt 的 Model/View 架构的核心部分&#xff0c;用于将数据模型与其视图相分离&#xff0c;实现数据的高效处理和可视化呈现。 Qt Model 可以理解成一组数据结构&#xff0c;其中包含…

什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别?软件测试等相关概念入门篇

1、什么是软件测试&#xff1f; 常见理解&#xff1a; 软件测试就是找BUG&#xff0c;发现缺陷 真正理解&#xff1a; 软件测试就是验证软件产品特性是否满足用户的需求 测试定义&#xff1a; 测试人员验证软件是否符合需求的这个过程就是测试 2、为什么要有测试 标准情况下&a…

【Linux学习笔记】代码编辑工具vim

1. vim工具基本模式的转换2. vim命令模式下的各种编辑命令2.1. 光标行定位2.2. 光标自由定位2.3. 复制粘贴2.4. 删除2.5. 文本的大小写替换2.6. 文本的替换2.7. 文本的前删后删2.8. 撤销操作 3. vim底行模式下的命令3.1. 设置行号与取消设置行号3.2. 分屏操作3.3. 在不退出vim的…

Openssl数据安全传输平台003:Protobuf - 部署

文章目录 一、Windows环境二、Linux Centos环境三、protobuf测试3.1 新建.proto文件生成相应的类3.2 .proto生成相应的类的使用3.3 配置VS3.4 test代码 一、Windows环境 在windows下配置&#xff0c;无论protobuf是什么版本&#xff0c;IDE和编译器的版本都要保持一致。 比如…

ESP32出现喂狗失败处理办法

前言 &#xff08;1&#xff09;今天在使用ESP32S3的时候&#xff0c;做移植测试的时候&#xff0c;不知道为什么出现了看门狗报错。简单查了一下&#xff0c;测试发现是任务阻塞导致的。 报错 &#xff08;1&#xff09;报错信息如下&#xff1a; <1>E (5368) task_wdt:…

大数据Flink(九十九):SQL 函数的解析顺序和系统内置函数

文章目录 SQL 函数的解析顺序和系统内置函数 一、​​​​​​​SQL 函数

oracle 表空间详解以及配置操作

Oracle 数据库是由若干个表空间构成的。任何数据库对象在存储时都必须存储在某个 表空间中。表空间对应于若干个数据文件&#xff0c;即表空间是由一个或多个数据文件构成的。 1、常用表空间&#xff1a; 系统表空间 (system tablespace) 是每个 Oracle 数据库都必须具备的。…

Hadoop3教程(二十三):Yarn的三大调度器

文章目录 &#xff08;129&#xff09;FIFO调度器&#xff08;130&#xff09;容量调度器特点资源分配算法 &#xff08;131&#xff09;公平调度器特点缺额的定义队列资源分配方式基于FIFO策略基于Fair策略资源分配算法 DRF策略 参考文献 &#xff08;129&#xff09;FIFO调度…

博客系统中的加盐算法

目录 一、为什么要对密码进行加盐加密&#xff1f; 1、明文 2、传统的 MD5 二、加盐加密 1、加盐算法实现思路 2、加盐算法解密思路 3、加盐算法代码实现 三、使用 Spring Security 加盐 1、引入 Spring Security 框架 2、排除 Spring Security 的自动加载 3、调用 S…

WGCNA分析教程五 | [更新版]

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 往期WGCNA分析教程 WGCNA分析 | 全流程分析代码 | 代码一 WGCNA分析 | 全流程分析代码 | 代码二 WGCNA分析 | 全流程分析代码 | 代码四 关于WGCNA分析教程日常更新 学习无处不在&#xff0c;我们的教程会在…

Ubuntu小知识总结

Ubuntu相关的小知识总结 一、Ubuntu系统下修改用户开机密码二、Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件的详细方法问题描述Vmware tools灰色不能安装解决方法小知识点&#xff1a;MarkDown的空格 三、Ubuntu虚拟机网络无法连接的几种解决方法1.重启网络编辑器2. 重启虚…

C语言中的3种注释方法

C语言中的3种注释方法 2021年8月28日星期六席锦 在用C语言编程时&#xff0c;常用的注释方式有如下几种&#xff1a; (1)单行注释 // … (2)多行注释 /* … */ (3)条件编译注释 #if 0…#endif (1)(2)在入门教程中比较常见。 对于(1) 【单行注释 // …】&#xff0c;注释只能显示…

python知识:从PDF 提取文本

一、说明 PDF 到文本提取是自然语言处理和数据分析中的一项基本任务&#xff0c;它允许研究人员和数据分析师从 PDF 文件中包含的非结构化文本数据中获得见解。Python 是一种通用且广泛使用的编程语言&#xff0c;它提供了多个库和工具来促进提取过程。 二、各种PDF操作库 让我…

C++中多态的原理【精华】

虚函数表 通过一道题我们先感受一下编译器针对多态的处理 #include <iostream> using namespace std;class Base { public:virtual void Func1(){cout << "Func1()" << endl;} private:int _b 1;char _c };int main() {cout << sizeof(B…

智能井盖是什么?万宾科技智能井盖传感器有什么特点

智能井盖是一种基于物联网和人工智能技术的新型城市设施。它不仅具备传统井盖的功能&#xff0c;还能通过数字化、自动化的方式实现远程监控和智能管理&#xff0c;提升城市运行效率和服务水平。 WITBEE万宾智能井盖传感器EN100-C2是一款井盖异动监测的传感终端。对窨井盖状态(…

JVMGC复习

TLAB:默认给每一个线程开辟一块内存空间存放线程自己的对象 Class对象是存放在堆区的&#xff0c;不是方法区&#xff0c;类的元数据元数据并不是类的Class对象&#xff0c;Class对象是加载的最终产品&#xff0c;类的方法代码&#xff0c;变量名&#xff0c;方法名&#xff0c…