Eureka、LoadBalance和Nacos
Eureka、LoadBalance和Nacos
- 一.Eureka引入
- 1.注册中心
- 2.CAP理论
- 3.常见的注册中心
- 二.Eureka介绍
- 1.搭建Eureka Server 注册中心
- 2.搭建服务注册
- 3.服务发现
- 三.负载均衡LoadBalance
- 1.问题引入
- 2.服务端负载均衡
- 3.客户端负载均衡
- 4.Spring Cloud LoadBalancer
- 1).快速上手
- 2)负载均衡策略
- 3)自定义负载均衡策略
- 4)LoadBalancer 原理
- 5)服务部署
- 四.Nacos
- 1.安装
- 1)window环境
- 2)Linux环境
- 2.快速上手
- 五.Nacos负载均衡
- 1.服务器下线
- 修改权重报错
- 2.同集群优先访问
- 配置集群的名称
- 3.健康检查
- nacos服务器实例
- 4.环境隔离
- 创建环境
- 六.Nacos的配置中心
- 1.配置中心的需求
- 2.快速上手
- 3.配置中心详解
- data id说明
- 4.部署nacos
- 七.Nacos与Eureka的区别
- 1.共同点
- 2.区别
一.Eureka引入
在环境搭建中,远程调用使用的url是写死的,当更换机器,或者新增机器时,这个URL就需要跟着变更,就需要去通知所有的相关服务去修改。随之而来的就是各个项目的配置文件反复更新,各个项目的频繁部署。
此时就引入了注册中心和服务发现,服务启动/变更时,向注册中心报道。注册中心记录应用和IP的关系。调用方调用时,先去注册中心获取服务方的IP,再去服务方进行调用。
1.注册中心
在最初的架构体系中,集群的概念还不那么流行,且机器数量也比较少,此时直接使用DNS+Nginx就可以满足几乎所有服务的发现。相关的注册信息直接配置在Nginx。
但是随着微服务的流行与流量的激增,机器规模逐渐变大,并且机器会有频繁的上下线行为,这种时候需要运维⼿动地去维护这个配置信息是⼀个很麻烦的操作。
所以开发者们开始希望有这么⼀个东西,它能维护⼀个服务列表,哪个机器上线了,哪个机器宕机了,这些信息都会自动更新到服务列表上,客户端拿到这个列表,直接进行服务调用即可。这个就是注册中心。
注册中心主要有三种角色:
- 服务提供者(Server):一次业务中,被其它微服务调用的服务。也就是提供接口给其它微服务.
- 服务消费者(Client):一次业务中,调用其它微服务的服务。也就是调⽤其它微服务提供的接口.
- 服务注册中心(Registry):用于保存Server 的注册信息,当Server 节点发生变更时,Registry 会同步变更。服务与注册中心使用⼀定机制通信,如果注册中心与某服务长时间无法通信,就会注销该实例。
他们之间的关系以及工作内容,可以通过两个概念来描述:
服务注册:服务提供者在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状
态。
服务发现: 服务消费者从注册中心查询服务提供者的地址,并通过该地址调⽤服务提供者的接口。服务发现的⼀个重要作用就是提供给服务消费者⼀个可用的服务列表。
2.CAP理论
CAP理论是分布式系统设计中的核心原则,由计算机科学家Eric Brewer于2000年提出,用于描述分布式数据存储系统在面临网络分区时需做出的权衡。其核心观点为:在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)三者中,最多只能同时满足两项。
- 一致性(Consistency) :CAP理论中的一致性,指的是强一致性。所有节点在同一时间具有相同的数据
- 可用性(Availability):保证每个请求都有响应(响应结果可能不对)
- 分区容错性(Partition Tolerance):当出现网络分区后,系统仍然能够对外提供服务
举一个栗子:一个部门全国各地都有岗位,这时候,总部下发了⼀个通知,由于通知需要开会周知全员,当有客户咨询时:
- 所有成员对客户的回应结果都是一致的(一致性)
- 客户咨询时,⼀定有回应(可用性)
- 当其中⼀个成员休假时,这个部门的其他成员也可以对客户提供咨询服务(分区容错性)
CAP 理论告诉我们:
一个分布式系统不可能同时满足数据⼀致性。服务可用性和分区容错性这三个基本需求,最多只能同时满足其中的两个.
CP架构:为了保证分布式系统对外的数据⼀致性,于是选择不返回任何数据
AP架构:为了保证分布式系统的可用性,节点2返回V0版本的数据(即使这个数据不正确)
更多参考
在分布式系统中,系统间的网络不能100%保证健康,服务⼜必须对外保证服务。因此Partition Tolerance不可避免。那就只能在C和A中选择⼀个。也就是CP或者AP架构。
正常情况下:
网络异常:
3.常见的注册中心
- Zookeeper
Zookeeper的官方并没有说它是一个注册中心,但是国内Java体系,大部分的集群环境都是依赖
Zookeeper来完成注册中心的功能。 - Eureka
Eureka是Netflix开发的基于REST的服务发现框架,主要用于服务注册,管理,负载均衡和服务故障
转移。
官方声明在Eureka2.0版本停止维护,不建议使用。但是Eureka是SpringCloud服务注册/发现的默认
实现,所以目前还是有很多公司在使用。 - Nacos
Nacos是Spring Cloud Alibaba架构中重要的组件,除了服务注册,服务发现功能之外,Nacos还支持
配置管理,流量管理,DNS,动态DNS等多种特性。
Eureka 和Zookeeper区别
Eureka和Zookeeper都是用于服务注册和发现的工具,区别如下:
- Eureka是Netflix开源的项目,而Zookeeper是Apache开源的项目。
- Eureka 基于AP原则,保证高可用,Zookeeper基于CP原则,保证数据⼀致性。
- Eureka 每个节点 都是均等的,Zookeeper的节点区分Leader 和Followe 或 Observer,也正因为这
个原因,如果Zookeeper的Leader发生故障时,需要重新选举,选举过程集群会有短暂时间的不可用
二.Eureka介绍
Eureka是Netflix OSS套件中关于服务注册和发现的解决方案。Spring Cloud对Eureka进行了集成,并
作为优先推荐方案进行宣传,虽然目前Eureka 2.0已经停止维护,新的微服务架构设计中,也不再建议使用,但是目前依然有大量公司的微服务系统使用Eureka作为注册中心。官方文档
Eureka主要分为两个部分:
- Eureka Server:作为注册中心Server端向微服务应用程序提供服务注册,发现,健康检查等能力.
- Eureka Client:服务提供者,服务启动时,会向Eureka Server 注册自己的信息(IP,端口,服务信息等),Eureka Server 会存储这些信息
1.搭建Eureka Server 注册中心
环境搭建和之前类似,就继续使用上次的文件进行搭建Eureka Server:
*手动添加依赖:
添加配置文件:
server:port: 10010
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是 ⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为falseregister-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于当前应⽤就是Eureka Server,故⽽设置为false.service-url:# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
写启动类:
查看Erueka
2.搭建服务注册
-
加入依赖:
-
修改配置文件:
-
成功后:
3.服务发现
服务发现和服务注册是一样配置的,只讲述不同的地方:
三.负载均衡LoadBalance
1.问题引入
-
点开services:
-
添加SpringBoot:
-
重命名和设置Modify options:
-
设置VM:
-
再复制一个9092后将两个都启动:
发请了多次请求后,只有9090product被使用,其他两个并没有参与使用:
此时为了解决这个问题,将代码重新组织后,就会只有一个product被使用了,这就是负责均衡的作用:
负载均衡:
负载均衡(Load Balance,简称 LB), 是高并发,高可用系统必不可少的关键组件。当服务流量增大时,通常会采用增加机器的方式进行扩容,负载均衡就是用来在多个机器或者其他资源中,按照⼀定的规则合理分配负载。
上面的例子中,我们只是简单的对实例进行了轮询,但真实的业务场景会更加复杂。比如根据机器的配置进行负载分配,配置高的分配的流量高,配置低的分配流量低等。
服务多机部署时,开发⼈员都需要考虑负载均衡的实现,所以也出现了一些负载均衡器,来帮助我们实现负载均衡。
2.服务端负载均衡
在服务端进行负载均衡的算法分配。比较有名的服务端负载均衡器是Nginx。请求先到达Nginx负载均衡器,然后通过负载均衡算法,在多个服务器之间选择⼀个进行访问。
3.客户端负载均衡
在客户端进行负载均衡的算法分配。把负载均衡的功能以库的方式集成到客户端,而不再是由一台指定的负载均衡设备集中提供。
比如Spring Cloud的Ribbon,请求发送到客户端,客户端从注册中心(比如Eureka)获取服务列表,在发
送请求前通过负载均衡算法选择⼀个服务器,然后进行访问。
Ribbon是Spring Cloud早期的默认实现,由于不维护了,所以最新版本的Spring Cloud负载均衡集成的
是Spring Cloud LoadBalancer(Spring Cloud官方维护)
4.Spring Cloud LoadBalancer
1).快速上手
- 添加注解:
- 修改远程调用代码:
2)负载均衡策略
负载均衡策略是⼀种思想,无论是哪种负载均衡器,它们的负载均衡策略都是相似的。Spring Cloud
LoadBalancer 仅支持两种负载均衡策略:轮询策略 和 随机策略
- 轮询(Round Robin):轮询策略是指服务器轮流处理用户的请求。这是⼀种实现最简单,也最常⽤的
策略。 - 随机选择(Random):随机选择策略是指随机选择⼀个后端服务器来处理新的请求。
3)自定义负载均衡策略
Spring Cloud LoadBalancer 默认负载均衡策略是 轮询策略,实现是 RoundRobinLoadBalancer,如果
服务的消费者如果想采用随机的负载均衡策略,也非常简单。(参考官网地址)
4)LoadBalancer 原理
LoadBalancer 的实现,主要是 LoadBalancerInterceptor,这个类会对 RestTemplate 的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。
通过intercept方法进行拦截:
进入execute方法:
进入choose:
继续进入choose:
随机实现:
getInstanceResponse方法:
随机下标:
轮询:
5)服务部署
- 部署MySQL
- 数据初始化
- 修改配置文件(dev和prod环境)
- 打包(每一个都要打包Erueka、order、product)
- 上传jar包,三个都要上传,第一次上传需要安装Lrzsz,命令:apt install lrzsz
- 启动实例:
- 在云服务器 的安全组或者防火墙上开通端口号
- 通过公网访问Erueka和之前的order
四.Nacos
1.安装
下载地址
二选一即可:
1)window环境
Nacos的启动模式是默认的集群模式,需要通过startup.cmd文件来改成单机模式:
改完后启动startup.cmd文件:
通过127.0.0.1:8848:nacos进入:
如果此时8848的端口号被占用,使用cmd命令框进行查找该端口号的进程并且杀死该进程,或者通过修改Nacos的端口号:
35436就是进程ID:
通过红框命令杀死进程:
修改端口号的话,先进入conf的文件:
打开properties的这个文件:
修改此处的端口号即可:
2)Linux环境
-
在Linux上创建自己的目录:
-
直接将下载好的zip文件拖到Linux中后,在输入:unzip 压缩文件名进行解压,但是在第一次进行压缩时需要先安装unzip安装的命令:apt-get install unzip:
-
修改端口号:
-
后续就是将nacos设置成单机模式,通过命令:bash startup.sh -m standalone进入后,修改为单机模式,如果能进入nacos的页面,则代表成功了:
2.快速上手
- 在父项目中引入Spring-Cloud- Alibaba依赖
<properties>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 子项目加上nacos和LoadBalance的依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
- 修改配置,使用nacos服务器地址
spring:application:name: cloud:nacos:discovery:server-addr: 110.41.51.65:10020
-
启动之前的订单和产品类(需将之前Erueka的配置和依赖删去,不然会和nacos冲突),启动后nacos的网页服务列表中就会出现信息
-
测试
五.Nacos负载均衡
1.服务器下线
点击下方红色框进入服务器详情:
其中有下线操作,直接点击下线操作后,这个服务器之后就不会接收请求了,请求被其他两个服务器进行接收:
通过编辑修改服务器的权重:
想使用到这个权重,需要订单order的项目在配置文件中配置nacos的负载均衡策略:
cloud:loadbalancer:nacos:enabled: true
测试:
修改权重报错
windows环境下直接删除data下的protocol文件,Linux环境的话,也是找到对应的文件删除即可:
2.同集群优先访问
Nacos把同一个机房内的实例,划分为一个集群。所以同集群优先访问,在一定程度上也可以理解为同机房优先访问。
微服务架构中,一个服务通常有多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器可以分布在不同的机房,比如product-service:
实例1:分布在上海机房
实例2:分布在上海机房
实例3:分布在北京机房
实例4:分布在北京机房
微服务访问时,应尽量访问同机房的实例。当本机房内实例不可用时,才访问其他机房的实例。比如order-service 在上海机房,product-service 在北京和上海机房都有实例,那我们希望可以优先访问上海机房,如果上海机房没有实例,或者实例不可用,再访问北京机房的实例。通常情况下,因为同一个机房的机器属于一个局域网,局域网访问速度更快一点.
配置集群的名称
cloud:nacos:discovery:server-addr: 1.95.194.117:8848cluster-name: BJ
其他端口号的Product服务器也需要更改:
复制后,再粘贴上去
此时只有9090的Product的服务器才能接收,其他都接收不到:
如果此时9090下线后,其他另一个集群的机器就能够接收了:
3.健康检查
两种健康检查机制:
Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务。Nacos 中提供了两种健康检查机制:
客户端主动上报机制:
- 客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,默认心跳间隔5秒;
- nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除
服务器端反向探测机制: - nacos主动探知客户端健康状态,默认间隔为20秒
- 健康检查失败后实例会被标记为不健康,不会被立即删除
nacos服务器实例
Nacos的服务实例(注册的节点)分为临时实例和非临时实例
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认类型.
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
Nacos对临时实例,采取的是 客户端主动上报机制,对非临时实例,采取服务器端反向探测机制。
配置⼀个服务实例为永久实例
spring:cloud:nacos:discovery:ephemeral: false # 设置为⾮临时实例
修改实例是永久性还是非永久性,无法在原先的基础上进行修改,只能将之前的protocol文件中的raft删除后,进行修改:
先进入nacos文件中:
再找到nacos的进程ID,杀死后,才能进行修改,修改后再重新启动nacos进程:
此时才能够成功重启Order项目:
关闭Order项目的启动类后,健康状态为false,但是不会立刻删除实例:
4.环境隔离
企业开发中,一个服务会分为开发环境,测试环境和生产环境。
- 开发环境:开发⼈员用于开发的服务器,是最基础的环境。一般日志级别设置较低,可能会开启⼀些
调试信息。 - 测试环境:测试人员用来进行测试的服务器,是开发环境到生产环境的过渡环境。
- 生产环境:正式提供对外服务的环境,通常关掉调试信息。
通常情况下,这几个环境是不能互相通信的。Nacos提供了namespace(命名空间)来实现环境的隔离。不同的namaspace的服务不可见。
创建环境
-
在nacos的页面上的命名空间中进行新建:
-
通过命名空间的id来加入到项目的配置文件中即可:
spring:cloud:nacos:discovery:namespace: 51152a13-7911-49e3-bbdc-16fd5670a257
- 重启order项目(在重启之前将实例永久性的配置删去,并按照上述的方法删除对应的文件后,重启nacos,再进行重启order项目):
- 环境不同是没办法进行远程调用的:
- 将prodcut也放入同样的环境当中就可以使用了:
六.Nacos的配置中心
除了注册中心和负载均衡之外,Nacos还是⼀个配置中心,具备配置管理的功能。Namespace 的常用场景之一是不同环境的配置区分隔离。例如开发测试环境和生产环境的配置隔离.
1.配置中心的需求
当前项目的配置都在代码中,会存在以下问题:
- 配置文件修改时,服务需要重新部署。微服务架构中,一个服务可能有成百个实例,挨个部署比较麻烦,且容易出错。
- 多人开发时,配置文件可能需要经常修改,使用同一个配置文件容易冲突。配置中心就是对这些配置项进行统一管理。通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置问件。提高效率的同时,也降低了出错的风险
3. 服务启动时,从配置中心读取配置项的内容,进行初始化。
4. 配置项修改时,通知微服务,实现配置的更新加载。
2.快速上手
-
添加配置
-
product-service中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- 在product-service的项目中添加一个bootstrap.properties配置文件
spring:application:name: product-servicecloud:nacos:config:server-addr: nacos网页URL
- 写一个Controller获取nacos配置项中的nacos.config值:
@RestController
public class NacosController {@Value("${nacos.config}")private String nacosConfig;@RequestMapping("/getConfig")public String getConfig() {return "从Nacos获取配置项nacos.config: " + nacosConfig;}
}
- 如果添加一个@RefreshScope注解,此时就会跟随nacos的配置文件里面的内容一起更新:
3.配置中心详解
配置中心的配置都在bootstrap.yml文件中,此时再bootstrap中加入命名空间的id,就能获取对应配置的信息:
data id说明
启动类时,增加了三个监听,此时可以通过nacos管理页面中添加三个配置来进行查看:
最先读取的是:
此时删除这个配置项后观察其他两个的优先级:
此时是product-service.properties:
最后只剩下一个则是最低的优先级:
4.部署nacos
Product-Service项目的POM文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring-cloud-nacos</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>product-service</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud 2020.*之后版本需要引⼊bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency></dependencies><profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><properties><profile.name>prod</profile.name></properties></profile></profiles><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources></build></project>
Product-Service的yml配置文件:
dev环境:
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=falseusername: rootpassword: "071711"driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: 1.95.194.117:8848
# cluster-name: BJ
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87 #服务管理的命名空间# 设置 Mybatis 的 xml 保存路径
mybatis:configuration: # 配置打印 MyBatis 执行的 SQL
# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #自动驼峰转换
prod环境:
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=falseusername: rootpassword: 云服务器上数据库密码driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: 1.95.194.117:8848
# cluster-name: BJ
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87 #服务管理的命名空间# 设置 Mybatis 的 xml 保存路径
mybatis:configuration: # 配置打印 MyBatis 执行的 SQL
# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #自动驼峰转换
普通yml:
spring:application:name: product-serviceprofiles:active: @profile.name@cloud:nacos:config:server-addr: 1.95.194.117:8848
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87 #配置中心的命名空间
Order-Service的pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring-cloud-nacos</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>order-service</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies><profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><properties><profile.name>prod</profile.name></properties></profile></profiles><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
dev的yml文件:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: "071711"driver-class-name: com.mysql.cj.jdbc.Driver
prod的yml文件:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: driver-class-name: com.mysql.cj.jdbc.Driver
普通的yml文件:
server:port: 8080
spring:application:name: order-serviceprofiles:active: @profile.name@cloud:nacos:discovery:server-addr: 1.95.194.117:8848
# cluster-name: BJ
# ephemeral: false #非临时实例
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87loadbalancer:nacos:enabled: true
# 设置 Mybatis 的 xml 保存路径
mybatis:configuration: # 配置打印 MyBatis 执行的 SQL
# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #自动驼峰转换
打包上传云服务器:
后台启动:
成功:
七.Nacos与Eureka的区别
1.共同点
都支持服务注册和服务拉取
2.区别
- 功能
Nacos除了服务发现和注册之外,还提供了配置中心,流量管理和DNS服务等功能。 - CAP理论
Eureka遵循AP原则,Nacos可以切换AP和CP模式,默认AP。
Nacos 根据配置识别CP或者AP模式。如果注册Nacos的Client的节点是临时节点,那么Nacos对这个
Client节点的效果就是AP,反之是CP。AP和CP可以同时混合存在。 - 服务发现
Eureka:基于拉模式。Eureka Client会定期从Server拉取服务信息,有缓存,默认每30秒拉取⼀次。
Nacos:基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接.
Nacos:
相关文章:
Eureka、LoadBalance和Nacos
Eureka、LoadBalance和Nacos 一.Eureka引入1.注册中心2.CAP理论3.常见的注册中心 二.Eureka介绍1.搭建Eureka Server 注册中心2.搭建服务注册3.服务发现 三.负载均衡LoadBalance1.问题引入2.服务端负载均衡3.客户端负载均衡4.Spring Cloud LoadBalancer1).快速上手2)负载均衡策…...
智能体MCP 实现数据可视化分析
参考: 在线体验 https://www.doubao.com/chat/ 下载安装离线体验 WPS软件上的表格分析 云上创建 阿里mcp:https://developer.aliyun.com/article/1661198 (搜索加可视化) 案例 用cline 或者cherry studio实现 mcp server:excel-mcp-server、quickchart-mcp-server...
3小时速通Python-Python学习总部署、总预览(一)
目录 Python的关键字有哪些: 编辑 代码:1-5: 代码:6-10: 代码:11-15: 代码:16-20: 代码:21-25: 代码:26-27: Pyt…...
机器学习基础 - 分类模型之决策树
决策树 文章目录 决策树简介决策树三要素1. 特征的选择1. ID32. C4.53. CART2. 剪枝处理0. 剪枝的作用1. 预剪枝2. 后剪枝QA1. ID3, C4.5, CART 这三种决策树的区别2. 树形结构为何不需要归一化?3. 分类决策树与回归决策树的区别4. 为何信息增益会偏向多取值特征?4. 为何信息…...
Java面向对象的三大特性
## 1. 封装(Encapsulation) 封装是将数据和操作数据的方法绑定在一起,对外部隐藏对象的具体实现细节。通过访问修饰符来实现封装。 示例代码: java public class Student { // 私有属性 private String name; private int age; …...
【Pandas】pandas DataFrame truediv
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
GTS-400 系列运动控制器板(六)----修改编码器计数方向
运动控制器函数库的使用 运动控制器驱动程序、 dll 文件、例程、 Demo 等相关文件请通过固高科技官网下载,网 址为: www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提…...
卷积神经网络迁移学习:原理与实践指南
引言 在深度学习领域,卷积神经网络(CNN)已经在计算机视觉任务中取得了巨大成功。然而,从头开始训练一个高性能的CNN模型需要大量标注数据和计算资源。迁移学习(Transfer Learning)技术为我们提供了一种高效解决方案,它能够将预训练模型的知识…...
Django 入门实战:从环境搭建到构建你的第一个 Web 应用
Django 入门实战:从环境搭建到构建你的第一个 Web 应用 恭喜你选择 Django 作为你学习 Python Web 开发的起点!Django 是一个强大、成熟且功能齐全的框架,非常适合构建中大型的 Web 应用程序。本篇将通过一个简单的例子,带你走完…...
【后端】构建简洁的音频转写系统:基于火山引擎ASR实现
在当今数字化时代,语音识别技术已经成为许多应用不可或缺的一部分。无论是会议记录、语音助手还是内容字幕,将语音转化为文本的能力对提升用户体验和工作效率至关重要。本文将介绍如何构建一个简洁的音频转写系统,专注于文件上传、云存储以及…...
http通信之axios vs fecth该如何选择?
在HTTP通信中,axios和fetch都是常用的库或原生API用于发起网络请求。两者各有特点,适用于不同的场景。下面详细介绍它们的差异和各自的优势: fetch 特点: 原生支持:fetch是现代浏览器内置的API,不需要额外…...
iostat指令介绍
文章目录 1. 功能介绍2. 语法介绍3. 应用场景4. 示例分析 1. 功能介绍 iostat (input/output statistics),是 Linux/Unix 系统中用于监控 CPU 使用率和 磁盘 I/O 性能的核心工具,可实时展示设备负载、吞吐量、队列状态等关键指标。 可以使用 man iostat查…...
NLP高频面试题(五十)——大模型(LLMs)分词(Tokenizer)详解
在自然语言处理(NLP)任务中,将文本转换为模型可处理的数字序列是必不可少的一步。这一步通常称为分词(tokenization),即把原始文本拆分成一个个词元(token)。对于**大型语言模型(LLM,Large Language Model,大型语言模型)**而言,选择合适的分词方案至关重要:分词的…...
桌面我的电脑图标不见了怎么恢复 恢复方法指南
在Windows操作系统中,“我的电脑”或在较新版本中称为“此电脑”的图标,是访问硬盘驱动器、外部存储设备和系统文件的重要入口。然而,有些用户可能会发现桌面上缺少了这个图标,这可能是由于误操作、系统设置更改或是不小心删除造成…...
【Qt】控件的理解 和 基础控件 QWidget 属性详解(通俗易懂+附源码+思维导图框架)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 通过上一章对信号槽的理解相信你对Qt的认识肯定有了很大的进步,下面将通过本篇文章带你深入的认识Widget控件(主窗口࿰…...
oracle将表字段逗号分隔的值进行拆分,并替换值
需求背景:需要源数据变动,需要对历史表已存的字段值根据源数据进行更新。如果是单字段存值,直接根据映射表关联修改即可。但字段里面若存的值是以逗号分割,比如旧值:‘old1,old2,old3’,要根据映射关系调整…...
用c语言实现——一个带头节点的链队列,支持用户输入交互界面、初始化、入队、出队、查找、判空判满、显示队列、遍历计算长度等功能
一、知识介绍 带头节点的链队列是一种基于链表实现的队列结构,它在链表的头部添加了一个特殊的节点,称为头节点。头节点不存储实际的数据元素,主要作用是作为链表的起点,简化队列的操作和边界条件处理。 1.节点结构 链队列的每…...
webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)
目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化(单独提取css代码)7、优化(压缩过程)8、打包less代码9、打包图片10、搭建开发环境(webpack-dev-server…...
【项目】基于MCP+Tabelstore架构实现知识库答疑系统
基于MCPTabelstore架构实现知识库答疑系统 整体流程设计(一)Agent 架构(二)知识库存储(1)向量数据库Tablestore(2)MCP Server (三)知识库构建(1&a…...
C语言高频面试题——malloc 和 calloc区别
在 C 语言中,malloc 和 calloc 都是用于动态内存分配的函数,但它们在 内存初始化、参数形式 和 使用场景 上有显著区别。以下是详细的对比分析: 1. 函数原型 malloc void* malloc(size_t size);功能:分配 未初始化 的连续内存块…...
深入探讨JavaScript性能瓶颈与优化实战指南
JavaScript作为现代Web开发的核心语言,其性能直接影响用户体验与业务指标。随着2025年前端应用的复杂性持续增加,性能优化已成为开发者必须掌握的核心技能。本文将从性能瓶颈分析、优化策略、工具使用三个维度,结合实战案例,系统梳理JavaScript性能优化的关键路径。 一、Ja…...
[创业之路-376]:企业法务 - 创业,不同的企业形态,个人承担的风险、收益、税费、成本不同
在企业法务领域,创业时选择不同的企业形态,个人在风险承担、收益分配、税费负担及运营成本方面存在显著差异。以下从个人独资企业、合伙企业、有限责任公司、股份有限公司四种常见形态展开分析: 一、个人承担的风险 个人独资企业 风险类型&…...
【Lua】Lua 入门知识点总结
Lua 入门学习笔记 本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用,包括全局变量和局部变量的区别,以及nil类型的概念、数值型、字符串和函数的基本操作,包括16进制表示、科学计数法、字符串连接、函数声明…...
低空经济 WebGIS 无人机配送 | 图扑数字孪生
2024 年,”低空经济” 首次写入政府工作报告,在政策驱动下各地纷纷把握政策机遇,从基建网络、场景创新、产业生态、政策激励等方面,构建 “规划-建设-应用-赋能” 的系统性布局,作为新质生产力的重要体现,推…...
【程序员 NLP 入门】词嵌入 - 如何基于计数的方法表示文本? (★小白必会版★)
🌟 嗨,你好,我是 青松 ! 🌈 希望用我的经验,让“程序猿”的AI学习之路走的更容易些,若我的经验能为你前行的道路增添一丝轻松,我将倍感荣幸!共勉~ 【程序员 NLP 入门】词…...
基于机器学习的多光谱遥感图像分类方法研究与定量评估
多光谱遥感技术通过获取可见光至红外波段的光谱信息,为地质勘探、农业监测、环境调查等领域提供了重要支持。与普通数码相机相比,多光谱成像能记录更丰富的波段数据(如近红外、短波红外等),从而更精准地识别地物特征。…...
BEVDepth: Acquisition of Reliable Depth for Multi-View 3D Object Detection
背景 基于多视角图片的3D感知被LSS证明是可行的,它使用估计的深度将图像特征转化为3D视椎,再将其压缩到BEV平面上。对于这个得到的BEV特征图,它支持端到端训练以及各种下游任务。但是对于深度估计这一块学习的深度质量如何,到目前为止没有相关工作研究。 贡献 本文的贡献…...
【Linux】静态库 动态库
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、👑静态库和动态库 静态库: 动态库: 🌠手动制作静态库 && 手动调用一下我们自己写的静态库 1> 安装到系统里面 ✨生成静…...
Java转Go日记(六):TCP黏包
服务端代码如下: // socket_stick/server/main.gofunc process(conn net.Conn) {defer conn.Close()reader : bufio.NewReader(conn)var buf [1024]bytefor {n, err : reader.Read(buf[:])if err io.EOF {break}if err ! nil {fmt.Println("read from client…...
(51单片机)LCD显示温度(DS18B20教程)(LCD1602教程)(延时函数教程)(单总线教程)
演示视频: LCD显示温度 源代码 如上图将9个文放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频: 【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.…...
【通过Docker快速部署Tomcat9.0】
文章目录 前言一、部署docker二、部署Tomcat2.1 创建存储卷2.2 运行tomcat容器2.3 查看tomcat容器2.4 查看端口是否监听2.5 防火墙开放端口 三、访问Tomcat 前言 Tomcat介绍 Tomcat 是由 Apache 软件基金会(Apache Software Foundation)开发的一个开源 …...
云原生--基础篇-3--云原生概述(云、原生、云计算、核心组成、核心特点)
1、什么是云和原生 (1)、什么是云? “云”指的是云计算环境,代表应用运行的基础设施和资源。依赖并充分利用云计算的弹性、分布式和资源池化能力。 核心含义: 1、云计算基础设施 云原生应用的设计和运行完全基于云…...
Spark-Streaming
Spark-Streaming概述 DStream实操 案例一:WordCount案例 需求:使用 netcat 工具向 9999 端口不断的发送数据,通过 SparkStreaming 读取端口数据并统计不同单词出现的次数 实验步骤: 添加依赖 <dependency> <gro…...
乐视系列玩机------乐视2 x620红灯 黑砖刷写教程以及新版刷写工具的详细释义
乐视x620在上期解析了普通黑砖情况下的救砖刷机过程。但在一些例外的情况下。使用上面的步骤会一直刷写报错 。此种情况就需要另外一种强制刷写方法来救砖 通过博文了解💝💝💝 1💝💝💝-----详细解析乐视2 x620系列 红灯 黑砖线刷救砖的步骤 2💝💝💝----图…...
若依SpringCloud项目-定制微服务模块
若依SpringCloud项目-定制微服务模块 关于微服务先不过多介绍,刚开始熟悉并不能讲的很彻底,成熟的微服务项目-若依SpringCloud就是一个典型的微服务架构工程(网上有很多教程了,不明白的可以学习一下)。 我正在看的视…...
【扫描件批量改名】批量识别扫描件PDF指定区域内容,用识别的内容修改PDF文件名,基于C++和腾讯OCR的实现方案,超详细
批量识别扫描件PDF指定区域内容并重命名文件方案 应用场景 本方案适用于以下场景: 企业档案数字化管理:批量处理扫描的合同、发票等文件,按内容自动分类命名财务票据处理:自动识别票据上的关键信息(如发票号码、日期)用于归档医疗记录管理:从扫描的检查报告中提取患者I…...
学习Docker遇到的问题
目录 1、拉取hello-world镜像报错 1. 检查网络连接 排查: 2. 配置 Docker 镜像加速器(推荐) 具体解决步骤: 1.在服务器上创建并修改配置文件,添加Docker镜像加速器地址: 2. 重启Docker 3. 拉取hello-world镜像 2、删除镜像出现异常 3、 容器内部不能运行ping命令 …...
Docker 数据卷
目录 一、数据卷(Data Volume) 二、使用 1、单独建立数据卷 2、挂载主机数据卷 3、数据卷容器挂载 基本语法: 工作原理: 主要用途: 使用事例: 一、数据卷(Data Volume) 数据卷的使用,类似于 Linux 下对目录或文件进行 mount 数据卷(Data Volume)是一个可供一个或多…...
【数据结构】励志大厂版·初级(二刷复习)双链表
前引:今天学习的双链表属于链表结构中最复杂的一种(带头双向循环链表),按照安排,我们会先进行复习,如何实现双链表,如基本的头插、头删、尾删、尾插,掌握每个细节,随后进…...
通过dogssl申请ssl免费证书
SSL证书作为实现HTTPS加密的核心工具,能够确保用户与网站之间的数据传输安全。尤其是在小程序之类的开发时,要求必须通过https发起请求的情况下。学会如何免费申请一个ssl证书就很有必要了。这里我分享一下,我通过dogssl如何申请ssl的。 一&…...
路由与路由器
路由的概念 路由是指在网络通讯中,从源设备到目标设备路径的选择过程。路由器是实现这一过程的关键设备,它通过转发数据包来实现网络的互联。路由工作在OSI参考模型的第三层,‘网络层’。 路由器的基本原理 路由器通过维护一张路由表来决定…...
Docker底层原理浅析 | namespace+cgroups+文件系统
本文目录 1. Linux NamespaceLinux系统里是否只能有一个pid为1的进程?namespace机制查看namespacenamespace机制测试使用Docker验证namespace机制 2. Dcoerk网络模式3.Control groups4.文件系统(联合文件系统)5. 容器格式 1. Linux Namespace…...
【无人机】使用扩展卡尔曼滤波 (EKF) 算法来处理传感器测量,各传感器的参数设置,高度数据融合、不同传感器融合模式
目录 #1、IMU #2、磁力计 #3、高度 #典型配置 #4、气压计 #静压位置误差修正 #气压计偏置补偿 #5、全球导航系统/全球定位系统--GNSS/GPS #位置和速度测量 #偏航测量 #GPS 速度的偏航 #双接收器 #GNSS 性能要求 #6、测距 #条件范围辅助-Conditional range aidin…...
常见的raid有哪些,使用场景是什么?
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理硬盘组合成一个逻辑硬盘的技术,目的是通过数据冗余和/或并行访问提高性能、容错能力和存储容量。不同的 RAID 级别有不同的实现方式和应用场景。以下…...
《 C++ 点滴漫谈: 三十四 》从重复到泛型,C++ 函数模板的诞生之路
一、引言 在 C 编程的世界里,类型是一切的基础。我们为 int 写一个求最大值的函数,为 double 写一个相似的函数,为 std::string 又写一个……看似合理的行为,逐渐堆积成了难以维护的 “函数墙”。这些函数逻辑几乎一致࿰…...
EasyRTC打造无人机低延迟高清实时通信监控全场景解决方案
一、方案背景 随着无人机技术的飞速发展,其在航拍、物流配送、农业监测、应急救援等多个领域的应用日益广泛。然而,无人机在实际作业过程中面临着诸多挑战,如通信延迟、数据传输不稳定、监控范围有限等。EasyRTC作为一种高效、低延迟的实时通…...
【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)
【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出) 引言 本文使用状态空间模型实现失业率递归预测,状态空间模型(State Space Model, SSM)是一种用于描述动态系统行为的…...
关于大数据的基础知识(三)——数据安全与合规
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于大数据的基础知识(三&a…...
从信息泄露到内网控制
0x01 背景 之前常见用rce、文件上传等漏洞获取webshell,偶然遇到一次敏感信息泄露获取权限的渗透,简单记录一下过程。 0x02 信息泄露 发现系统某端口部署了minio服务,经过探测发现存在minio存储桶遍历 使用利用工具把泄露的文件全部整理一…...
【Qt】QDialog类
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 对话框 - QDialog 🦋 基本介绍🦋 对话框分类🦋 Qt 内置对话框🎀 QMessageBox -消息对话框🎀 QColo…...