SpringCloud多机部署,负载均衡-LoadBalance

一.负载均衡

1.1问题描述

//根据应用名称获取服务列表
List<ServiceInstance> instances=discoveryClient.getInstances("product-service");
//一个微服务可能有多个实例,获取第一个
EurekaServiceInstance instance=(EurekaServiceInstance)instances.get(0);

1.根据应用名称获取服务实例列表,然后从实例列表中选择一个其中一个实例

那要是一个服务对应多个实例,流量能否合理的分配到多个实例呢?

如下操作,一个服务弄出多个实例来:

我们在启动两个product-service实例:选中要启动的实例,右键选择copy configuration

在弹出的框中选择Modify options->Add VM options(添加虚拟机参数)

添加VM options:-Dserver.poort=9091(9091是服务启动的端口号,可以自己根据情况进行修改)(意思是在 Java 虚拟机启动参数中设置一个系统属性,这里具体是将服务器的端口设置为 9091。)

像这样一共启动三个服务(把原来的那个改名为ProductServicrApplication-9090:

启动服务,访问eureka会发现product-service有三个实例,如下:

访问127.0.0.1:8080/order/1,访问结果为:

多次访问,再观察日志:

通过日志可以观察到,请求多次访问,都是同一台机器(这个信息是下面这个截图看到的)

这肯定不是我们想要看到的,我们希望三个实例可以分担请求的负荷,那么如何实现呢?

解决方案:

使用原子类中的整数,防止多线程下的线程安全问题

这里将atomicinteger提出来当成静态成员变量,那么同一个工程中就是共用一个integer,每访问一次就加一,而不是每次访问都是从一开始。

同理,将instances列表拿出来当成成员变量,就是防止每一次访问都重新获取服务实例列表。而对于getInstances方法,它的返回结果不是按顺序的,而是每一次都不一样,如果将getInstances方法放到selectOrderInfoById中,那么每一次发起请求就会重新获取服务实例列表,前三次获取的实例顺序可能是a b c,可能是b a c,也可能是a c b.然后每次都对原子整数取模,得到的下标是按顺序的,也就是1 2 3,那么就不是均衡的获取了

在方法中进行实例获取时,可以使用轮询获取

这次进行多次访问,再观察日志,就会发现这三个服务实例是轮着来的

1.2什么是负载均衡

负载均衡(LoadBalance,简称LB),是高并发,高可用系统必不可少的关键组件。

当服务流量增大时,通常会采用增加机器的方式进行扩容,负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载。

1.3负载均衡的一些实现

上述例子只是简单的轮询机制,但真实场景会更加复杂,比如根据机器的配置进行负载分配,配置高端分配的流量高,配置低的分配的流量低。

类似于企业员工:能力强的员工可以多承担一些工作。

服务多机部署时,开发人员都需要考虑负载均衡的实现,所以也出现了一些负载均衡器来帮我们实现负载均衡。

负载均衡分为服务端负载均衡和客户端负载均衡。

服务器端负载均衡

订单服务调用商品服务,商品服务就是服务端,服务端这里通过一定的算法将收到的请求分配到莫一台机器上,这就是服务端负载均衡。最常见的服务器端负载均衡器就是Nginx负载均衡器,然后通过负载均衡算法,在多个服务器之间选择一个进行访问。

客户端负载均衡器

在客户端负载均衡中,负载均衡的逻辑由客户端自己实现。客户端知道所有可用的服务实例,并根据一定的算法选择一个合适的服务实例来发起请求。

二.SpringCloud LoadBalancer

2.1给RestTemplate这个Bean添加@LoadBalancer

这里使用了@LoadBalanced注解,是的该RestTemaplate对象有了负载均衡功能,并且默认的负载均衡算法是轮询的负载均衡

2.2修改端口号为服务名称

2.3启动多个product-service实例并测试负载均衡

连续多次发起请求:127.0.0.1:8080/order/1

观察product-service的日志,就会发现请求被分配到了这三个实例上

2.4负载均衡策略

1.轮询:轮询策略是指服务器轮流处理用户的请求。这是最简单最常用的策略

2.随机选择:随机选择一个后端服务器来处理请求。

三.自定义负载均衡器

SpringCloud LoadBalancer默认的负载均衡策略是轮询策略,是现实RoundRobinLoadBalancer。现在我们来实现一个采用随机策略的负载均衡器

3.1定义随机算法对象,通过@Bean将其加载到Spring中

此处使用SpringCloudLoadBalancer提供的RandomLoadBalancer

package com.bite.order.config;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;public class LoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBanlancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory){String name=environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);System.out.println("============="+name);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

@Bean注解:适用于告诉Spring容器,该方法将要返回一个bean对象,可以被其他组件注入和使用。在这里,该方法是返回一个ReactorLoadBalancer<ServiceInstance>接口的负载均衡器bean

可以看到,有两个类实现了这个接口,这两个类也就是我们所说的随机负载均衡器和轮询负载均衡器。这个接口的ServiceInstance表示该负载均衡器的操作对象是服务实例列表

Environment:Spring 的Environment接口提供了对应用程序环境的访问。在这里,可以通过它来获取应用程序的配置属性。getProperty就是获取属性的意思

LoadBalanceClientFactory:是一个用于创建负载均衡客户端的工厂类。它可以提供一些方法来配置负载均衡器

最后返回的是一个随机负载均衡器的实例对象

总的来说,这段代码定义了一个方法,该方法在 Spring 容器中创建并返回一个随机负载均衡器 bean。这个负载均衡器可以根据服务实例列表选择一个随机的服务实例来处理请求,并且可以通过配置属性进行定制。

注意:该类要满足:1.不使用@Configuration注释  2.在组件扫描范围内

为什么不使用@Configuration注释?首先,如果使用了@Configuration注释,那么就会在Spring启动时将该类中被@Bean标记的方法中的bean对象创建出来,而不是在什么时候使用时再创建,这样就不具有灵活性。其次,假设有两个类都有@Configuration注释,而且两个类中都有使用@Bean注入同类型的负载均衡器,那么俩个负载均衡器都会在Spring启动时创建出来,当在某个地方使用时,编译器就不知道要使用哪一个负载均衡器了

组件扫描范围指什么:设置端口参数 - 豆包

只有放到组件扫描范围内了,这个类才能被Spring容器发现并且管理。其中定义的@Bean方法才有可能被拿出来创建Bean。如果这个类不在组件扫描范围内,这个bean的定义就没办法被发现,就无法创建Bean

3.2使用@LoadBalancerClient或者@LoadBalancerClients注解

在RestTemplate配置类上方,使用@LoadBalancerClinet或@LoadBalancerClients注解,可以对不同的服务方提供配置不同的客户端负载均衡算法策略

这样的话,就能够返回一个带有负载均衡功能的http处理工具RestTemplate实例对象

上面的@LoadBalancerClient中name制定了该负载均衡算法对哪个服务起作用,configuration标识了使用哪个类的对象作为负载均衡器。

四.服务部署

3.1准备数据

在linux终端登录mysql进行建库建表操作

修改配置文件中数据库的密码,改成linux系统中的数据库密码

product和order的都要改

3.2服务构建打包

要分别对eureka-server、product-service、order-service打包

1.pom.xml配置

<properties>项目属性和变量:定义项目中可能用到的常量或变量值,可在整个文件中被引用,也可在其他配置文件中被引用。

 

<profiles>元素用于定义不同的构建配置文件,构建配置文件通常用于定义软件项目在构建过程中的各种参数和设置,以实现不同环境下的定制化构建。可以针对开发(dev)、测试(test)、生产(prod)等不同环境设置不同的构建参数。

每个配置文件都有一个唯一的 ID 和一组属性。在这个例子中,每个配置文件只有一个属性 profile.name,分别设置为 “dev” 和 “prod”。

在 Maven 项目中,配置文件可以用于在不同的环境中设置不同的构建参数、资源过滤、插件配置等。例如,可以根据不同的环境设置不同的数据库连接信息、服务器地址等。

由于product-service和order-service都涉及到数据库密码的修改,所以这段配置要添加到这两个子项目的pom文件中

2.备份并修改yml配置文件

将prod环境的yml文件中的数据库密码改成linux文件下的MySQL密码

然后在每个项目的主配置文件application.yml加下面的配置:

​
spring:profiles:active: @profile.name@​

这里的profile.name就是去maven中读取这个变量

项目启动后,并不是只选择其中一个配置文件进行操作。首先,application.yml通常作为基础配置文件,其中可以包含一些通用的配置属性

然后,根据激活的环境(通过spring.profiles.active属性指定),会加载相应的特定环境配置文件。例如:如激活的是开发环境,那么application-dev.yml中的配置会与application.yml中的配置合并,共同生效。

那要是在多个配置文件中有相同的属性,特定环境配置文件中的属性会覆盖application.yml中的属性

总之,在SpringBoot项目中,项目启动时多个配置文件(application.yml,application-dev.yml,application-prod.yml等)都会被扫描,但会根据环境选择特定的配置文件与基础配置文件合并生效,以满足不同环境下的配置需求。

pom.xml与applicatiom.yml的区别与用途:https://www.doubao.com/thread/wc88d3dc72ec47658

3.依次对三个项目打包

和SpringBoot项目的打包方式一样,依次对三个项目进行package即可

先点一下clean(当执行 “clean” 阶段时,Maven 会删除项目的 target 目录。这个目录通常包含编译后的字节码文件、打包生成的文件(如 JAR、WAR 文件)、测试报告等在构建过程中生成的临时文件。)“clean” 阶段为后续的构建阶段创造了一个干净的环境。这意味着在执行其他构建阶段(如 compile、test、package 等)之前,项目的构建状态被重置,确保构建结果的准确性和一致性。例如,如果在上一次构建中出现了错误或者需要进行重大的更改,执行 “clean” 阶段可以确保所有的临时文件和旧的构建产物都被删除,以便进行新的构建。

clean完再打包

3.3启动服务

1.上传Jar包到云服务器上

第一次上传需要安装lrzsz(lrzsz是一款在 Linux 系统中常用的文件传输工具。)

apt install lrzsz

直接拖动文件到xshell窗口,上传成功(上传之前可以建一个springcloud的文件夹,具体操作如下)

2.启动服务

启动服务后,我们希望看到日志,所以可以先创建一个日志目录:

进行eureka-server,product-service,order-service的启动

#后台启动eureka-server,并设置输出日志到logs/erueka.log
nohup java -jar eureka-server-1.0-SNAPSHOT.jar >logs/eureka.log &
#后台启动product-service,并设置输出日志到logs/product.log
nohup java -jar product-serivce-1.0-SNAPSHOT.jar >logs/product.log &
#后台启动order-service,并设置输出日志到logs/order.log
nohup java -jar order-service-1.0-SNAPSHOT.jar >logs/order.log &

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

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

相关文章

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

软考-信息安全-网络安全体系与网络安全模型

4.1 网络安全体系概述 网络安全保障是一项复杂的系统工程&#xff0c;是安全策略&#xff0c;多种技术&#xff0c;管理方法和人员安全素质的综合。 4.1.1 网络安全体系概念 现代的网络安全问题变化莫测&#xff0c;要保障网络系统的安全&#xff0c;应当把相应的安全策略&a…

CSS基础选择器与div布局

基础选择器一 全局选择器 可以与任何元素匹配&#xff0c;优先级最低&#xff0c;不推荐使用 *{margin: 0;padding: 0;}元素选择器 HTML文档中的元素&#xff0c;p、b、div、a、img、body等。 标签选择器&#xff0c;选择的是页面上所有这种类型的标签&#xff0c;所以经常…

Python毕业设计选题:基于Spark的国漫推荐系统的设计与实现-django+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统登录 管理员功能界面 漫画数据管理 看板界面 系统管理 摘要 系统的设计主要包括…

Linux 链式与层级中断控制器讲解:原理与驱动开发

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…

“数字化”让党建更“智慧”:帆软塑造党建发展新动能

智慧党建是新时代党的建设的重要创新&#xff0c;它通过互联网、大数据、云计算和人工智能等现代信息技术&#xff0c;实现了党建工作的数字化、智能化。帆软公司的Fine产品线&#xff0c;包括FineDataLink、FineReport、FineVis和FineBI&#xff0c;提供了一个全面的大数据分析…

利用c语言详细介绍下冒泡排序

软件开发过程中&#xff0c;排序算法是常规且使用众多的方法之一&#xff0c;而冒泡算法又是排序算法中最常规且基本的算法。今天我们利用c语言&#xff0c;图文详细介绍下冒泡算法。 一、图文介绍 我们输入一个数组&#xff0c;数组为【10&#xff0c;5&#xff0c;3&#xf…

小程序-基于java+SpringBoot+Vue的实习生管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

全新升级抗性宏基因组,直击病毒和毒力因子分析!

基于宏基因组测序的抗性基因分析是目前抗性基因分析的重要手段。为了协助研究工作者对抗性基因开展更深入且全面的探研&#xff0c;凌恩生物技术团队致力于技术研发&#xff0c;推出了全新升级版的宏基因组抗性基因分析流程。此流程采用五大数据库进行详尽的注释分析&#xff0…

算法--“汽车加油”问题.

def greedy():n 100 # 汽车满油后可行驶的最大距离d [50, 80, 39, 60, 40, 32] # 加油站的距离k len(d) # 加油站的数量# 检查是否有加油站距离超过汽车的最大行驶距离for dist in d:if dist > n:print(no solution)returnnum 0 # 加油次数current_position 0 # 当…

细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的方法

目录 一、DMA基础知识 1、DMA简介 (1)DMA控制器 (2)DMA流 (3)DMA请求 (4)仲裁器 (5)DMA传输属性 2、源地址和目标地址 3、DMA传输模式 4、传输数据量的大小 5、数据宽度 6、地址指针递增 7、DMA工作模式 8、DMA流的优先级别 9、FIFO或直接模式 10、单次传输或突…

HTTP 缓存策略

文章目录 一、HTTP的缓存的过程是怎样的&#xff1f;二、什么时候触发强缓存或协商缓存强缓存ExpiresCache-Control 协商缓存 三、服务器如何判断资源是否新鲜Last-Modified/If-Modified-SinceETag/If-None-Match 四、整体缓存过程 一、HTTP的缓存的过程是怎样的&#xff1f; …

Leetcode234.回文链表(HOT100)

链接 代码&#xff1a; class Solution { public:bool isPalindrome(ListNode* head) {ListNode* slow head;ListNode* fast head;// while(slow&&fast){// slow slow->next;// fast fast->next;// if(fast)// {// fast fast->…

【Unity Dots之Ecs原理分析(无入门代码示例)】

Unity Ecs原理分析 前言一、ECS是什么&#xff1f;Entity是什么&#xff1f;Component是什么&#xff1f;System是什么&#xff1f;不得不提的Archetype为什么时16kb&#xff1f; 什么是Structural Change&#xff1f;ASpect有关ECS使用时的安全性Conversion World & Shado…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

【大模型推理】all-reduce

https://andrew.gibiansky.com/blog/machine-learning/baidu-allreduce/#ref-4 1. ALL reduce , reduce, broadcast 概念 Introduction 在过去的几年中&#xff0c;神经网络已经被证明是解决各种问题的令人难以置信的有效工具&#xff0c;并且在规模和计算需求上都迅速增长。…

opencv(c++)---自带的卷积运算filter2D以及应用

opencv(c)—自带的卷积运算filter2D以及应用 #include <opencv2/opencv.hpp> #include<iostream>using namespace cv; using namespace std;int main() {Mat imgin, imgout;imgin imread("D:/1234.png");if (imgin.empty()){cout << "Could …

C++20中的Concepts与TypeScript

C20中的Concepts与TypeScript 大家好&#xff01;上一篇聊了C20中概念&#xff08;Concepts&#xff09;&#xff0c;这是一个非常赞的特性&#xff0c;极大简化了模板编程&#xff0c;但是如果跳出C去查看一下其他编程语言的特性&#xff0c;就会发现&#xff0c;这样类似的特…

联想thinkpad笔记本哪些配置可以安装win7_联想thinkpad笔记本装win7解析(支持新旧机型)

联想thinkpad笔记本哪些配置可以安装win7&#xff1f;联想ThinkPad L14在安装win7后usb键盘不能使用&#xff0c;并且bios中要关闭安全启动和开启CSM兼容模式&#xff0c;那么联想ThinkPad L14要怎么安装win7系统呢&#xff1f;下面小编就给大家介绍详细的联想ThinkPad L14装wi…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…