Eureka、LoadBalance和Nacos

news2025/5/11 3:32:38

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):当出现网络分区后,系统仍然能够对外提供服务

举一个栗子:一个部门全国各地都有岗位,这时候,总部下发了⼀个通知,由于通知需要开会周知全员,当有客户咨询时:

  1. 所有成员对客户的回应结果都是一致的(一致性)
  2. 客户咨询时,⼀定有回应(可用性)
  3. 当其中⼀个成员休假时,这个部门的其他成员也可以对客户提供咨询服务(分区容错性)

CAP 理论告诉我们:
一个分布式系统不可能同时满足数据⼀致性。服务可用性和分区容错性这三个基本需求,最多只能同时满足其中的两个.

CP架构:为了保证分布式系统对外的数据⼀致性,于是选择不返回任何数据
AP架构:为了保证分布式系统的可用性,节点2返回V0版本的数据(即使这个数据不正确)
更多参考

在这里插入图片描述

在分布式系统中,系统间的网络不能100%保证健康,服务⼜必须对外保证服务。因此Partition Tolerance不可避免。那就只能在C和A中选择⼀个。也就是CP或者AP架构。

正常情况下:在这里插入图片描述

网络异常:

在这里插入图片描述

3.常见的注册中心

  1. Zookeeper
    Zookeeper的官方并没有说它是一个注册中心,但是国内Java体系,大部分的集群环境都是依赖
    Zookeeper来完成注册中心的功能。
  2. Eureka
    Eureka是Netflix开发的基于REST的服务发现框架,主要用于服务注册,管理,负载均衡和服务故障
    转移。
    官方声明在Eureka2.0版本停止维护,不建议使用。但是Eureka是SpringCloud服务注册/发现的默认
    实现,所以目前还是有很多公司在使用。
  3. Nacos
    Nacos是Spring Cloud Alibaba架构中重要的组件,除了服务注册,服务发现功能之外,Nacos还支持
    配置管理,流量管理,DNS,动态DNS等多种特性。

在这里插入图片描述

Eureka 和Zookeeper区别
Eureka和Zookeeper都是用于服务注册和发现的工具,区别如下:

  1. Eureka是Netflix开源的项目,而Zookeeper是Apache开源的项目。
  2. Eureka 基于AP原则,保证高可用,Zookeeper基于CP原则,保证数据⼀致性。
  3. 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: localhost
  client:
    fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是  ⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为false
    register-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于当前应⽤就是Eureka Server,故⽽设置为false.
    service-url:
      # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

写启动类:
在这里插入图片描述

查看Erueka
在这里插入图片描述

2.搭建服务注册

  1. 加入依赖:在这里插入图片描述

  2. 修改配置文件:
    在这里插入图片描述

  3. 成功后:在这里插入图片描述

3.服务发现

服务发现和服务注册是一样配置的,只讲述不同的地方:在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三.负载均衡LoadBalance

1.问题引入

  1. 点开services:
    在这里插入图片描述

  2. 添加SpringBoot:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 重命名和设置Modify options:
    在这里插入图片描述
    在这里插入图片描述

  4. 设置VM:
    在这里插入图片描述
    在这里插入图片描述

  5. 再复制一个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).快速上手

  1. 添加注解:
    在这里插入图片描述
  2. 修改远程调用代码:在这里插入图片描述

2)负载均衡策略

负载均衡策略是⼀种思想,无论是哪种负载均衡器,它们的负载均衡策略都是相似的。Spring Cloud
LoadBalancer 仅支持两种负载均衡策略:轮询策略 和 随机策略

  1. 轮询(Round Robin):轮询策略是指服务器轮流处理用户的请求。这是⼀种实现最简单,也最常⽤的
    策略。
  2. 随机选择(Random):随机选择策略是指随机选择⼀个后端服务器来处理新的请求。

3)自定义负载均衡策略

Spring Cloud LoadBalancer 默认负载均衡策略是 轮询策略,实现是 RoundRobinLoadBalancer,如果
服务的消费者如果想采用随机的负载均衡策略,也非常简单。(参考官网地址)
在这里插入图片描述

在这里插入图片描述

4)LoadBalancer 原理

LoadBalancer 的实现,主要是 LoadBalancerInterceptor,这个类会对 RestTemplate 的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

通过intercept方法进行拦截:
在这里插入图片描述
进入execute方法:在这里插入图片描述
进入choose:
在这里插入图片描述
继续进入choose:
在这里插入图片描述
随机实现:在这里插入图片描述
getInstanceResponse方法:
在这里插入图片描述

随机下标:
在这里插入图片描述

轮询:
在这里插入图片描述

5)服务部署

  1. 部署MySQL
  2. 数据初始化
  3. 修改配置文件(dev和prod环境)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 打包(每一个都要打包Erueka、order、product)
    在这里插入图片描述
    在这里插入图片描述
  2. 上传jar包,三个都要上传,第一次上传需要安装Lrzsz,命令:apt install lrzsz
  3. 启动实例:在这里插入图片描述
    在这里插入图片描述
  4. 在云服务器 的安全组或者防火墙上开通端口号
  5. 通过公网访问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环境

  1. 在Linux上创建自己的目录:在这里插入图片描述

  2. 直接将下载好的zip文件拖到Linux中后,在输入:unzip 压缩文件名进行解压,但是在第一次进行压缩时需要先安装unzip安装的命令:apt-get install unzip:
    在这里插入图片描述
    在这里插入图片描述

  3. 修改端口号:
    在这里插入图片描述
    在这里插入图片描述

  4. 后续就是将nacos设置成单机模式,通过命令:bash startup.sh -m standalone进入后,修改为单机模式,如果能进入nacos的页面,则代表成功了:
    在这里插入图片描述
    在这里插入图片描述

2.快速上手

  1. 在父项目中引入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>
  1. 子项目加上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>
  1. 修改配置,使用nacos服务器地址
spring:
	application:
		name: 
	cloud:
		nacos:
			discovery:
				server-addr: 110.41.51.65:10020
  1. 启动之前的订单和产品类(需将之前Erueka的配置和依赖删去,不然会和nacos冲突),启动后nacos的网页服务列表中就会出现信息
    n/direct/a5d901ce25284f47b371cf007da7d25a.png)

  2. 测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五.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:8848
        cluster-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.环境隔离

企业开发中,一个服务会分为开发环境,测试环境和生产环境。

  1. 开发环境:开发⼈员用于开发的服务器,是最基础的环境。一般日志级别设置较低,可能会开启⼀些
    调试信息。
  2. 测试环境:测试人员用来进行测试的服务器,是开发环境到生产环境的过渡环境。
  3. 生产环境:正式提供对外服务的环境,通常关掉调试信息。
    通常情况下,这几个环境是不能互相通信的。Nacos提供了namespace(命名空间)来实现环境的隔离。不同的namaspace的服务不可见。

创建环境

  1. 在nacos的页面上的命名空间中进行新建:
    在这里插入图片描述
    在这里插入图片描述

  2. 通过命名空间的id来加入到项目的配置文件中即可:在这里插入图片描述

spring:
	cloud:
		nacos:
		discovery:
			namespace: 51152a13-7911-49e3-bbdc-16fd5670a257
  1. 重启order项目(在重启之前将实例永久性的配置删去,并按照上述的方法删除对应的文件后,重启nacos,再进行重启order项目):在这里插入图片描述
    在这里插入图片描述
  2. 环境不同是没办法进行远程调用的:在这里插入图片描述
  3. 将prodcut也放入同样的环境当中就可以使用了:在这里插入图片描述
    在这里插入图片描述

六.Nacos的配置中心

除了注册中心和负载均衡之外,Nacos还是⼀个配置中心,具备配置管理的功能。Namespace 的常用场景之一是不同环境的配置区分隔离。例如开发测试环境和生产环境的配置隔离.

1.配置中心的需求

当前项目的配置都在代码中,会存在以下问题:

  1. 配置文件修改时,服务需要重新部署。微服务架构中,一个服务可能有成百个实例,挨个部署比较麻烦,且容易出错。
  2. 多人开发时,配置文件可能需要经常修改,使用同一个配置文件容易冲突。配置中心就是对这些配置项进行统一管理。通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置问件。提高效率的同时,也降低了出错的风险

在这里插入图片描述
3. 服务启动时,从配置中心读取配置项的内容,进行初始化。
4. 配置项修改时,通知微服务,实现配置的更新加载。

2.快速上手

  1. 添加配置
    在这里插入图片描述
    在这里插入图片描述

  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>
  1. 在product-service的项目中添加一个bootstrap.properties配置文件
spring:
  application:
    name: product-service
  cloud:
    nacos:
      config:
        server-addr: nacos网页URL
  1. 写一个Controller获取nacos配置项中的nacos.config值:
@RestController
public class NacosController {
    @Value("${nacos.config}")
    private String nacosConfig;

    @RequestMapping("/getConfig")
    public String getConfig() {
        return "从Nacos获取配置项nacos.config: " + nacosConfig;
    }
}

在这里插入图片描述

  1. 如果添加一个@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=false
    username: root
    password: "071711"
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    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.StdOutImpl
    map-underscore-to-camel-case: true  #自动驼峰转换

prod环境:

server:
  port: 9090
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=false
    username: root
    password: 云服务器上数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    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.StdOutImpl
    map-underscore-to-camel-case: true  #自动驼峰转换

普通yml:

spring:
  application:
    name: product-service
  profiles:
    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=false
    username: root
    password: "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=false
    username: root
    password: 
    driver-class-name: com.mysql.cj.jdbc.Driver

普通的yml文件:

server:
  port: 8080
spring:
  application:
    name: order-service
  profiles:
    active: @profile.name@
  cloud:
    nacos:
      discovery:
        server-addr: 1.95.194.117:8848
#        cluster-name: BJ
#        ephemeral: false #非临时实例
#        namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87
    loadbalancer:
      nacos:
        enabled: true
# 设置 Mybatis 的 xml 保存路径
mybatis:
  configuration: # 配置打印 MyBatis 执行的 SQL
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true  #自动驼峰转换

打包上传云服务器:

在这里插入图片描述
在这里插入图片描述
后台启动:
在这里插入图片描述
成功:在这里插入图片描述

七.Nacos与Eureka的区别

1.共同点

都支持服务注册和服务拉取

2.区别

  1. 功能
    Nacos除了服务发现和注册之外,还提供了配置中心,流量管理和DNS服务等功能。
  2. CAP理论
    Eureka遵循AP原则,Nacos可以切换AP和CP模式,默认AP。
    Nacos 根据配置识别CP或者AP模式。如果注册Nacos的Client的节点是临时节点,那么Nacos对这个
    Client节点的效果就是AP,反之是CP。AP和CP可以同时混合存在。
  3. 服务发现
    Eureka:基于拉模式。Eureka Client会定期从Server拉取服务信息,有缓存,默认每30秒拉取⼀次。
    Nacos:基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接.

Nacos:在这里插入图片描述在这里插入图片描述

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

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

相关文章

【Linux网络】构建基于UDP的简单聊天室系统

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

【每天一个知识点】大模型的幻觉问题

“大模型的幻觉问题”是指大语言模型&#xff08;如GPT系列、BERT衍生模型等&#xff09;在生成内容时&#xff0c;产生不符合事实或逻辑的虚假信息&#xff0c;即所谓的“幻觉”&#xff08;hallucination&#xff09;。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…

[大模型]什么是function calling?

什么是function calling&#xff1f; 大模型的 ​​Function Calling​​&#xff08;函数调用&#xff09;是一种让大语言模型&#xff08;如 GPT、Claude 等&#xff09;与外部工具、API 或自定义函数交互的机制。 它的核心目的是让模型能够根据用户的需求&#xff0c;​​…

Java高频面试之并发编程-05

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;线程有哪些调度方法&#xff1f; 在Java中&#xff0c;线程的调用方法主要包括以下几种方式&#xff0c;每种方式适用于…

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Linux】47.高级IO(1)

文章目录 1. 高级IO1.1 五种IO模型1.2 高级IO重要概念1.2.1 同步通信 vs 异步通信1.2.2 阻塞 vs 非阻塞 1.3非阻塞IO1.3.1 fcntl1.3.2 实现函数SetNoBlock1.3.3 轮询方式读取标准输入1.3.4 I/O多路转接之select1.3.4.1 初识select&#xff1a;1.3.4.2 select函数原型1.3.4.3 理…

notepad++技巧:查找和替换:扩展 or 正则表达式

notepad 有很多优点&#xff1a;多标签&#xff0c;代码高亮&#xff0c;我最喜欢的是查找和替换。 除了可以一次性查找所有打开文件&#xff0c;还可以使用 扩展 or 正则表达式。 例如&#xff1a; 去掉空行&#xff1a;正则表达式&#xff1a; ^\s*$\r\n ^ 表示行首。\s*…

【图像标注技巧】目标检测图像标注技巧

介绍一些图像标注技巧。之前引用过别人的文章 yolo目标检测 技巧 trick 提升模型性能&#xff0c;deep research检测调研报告也可以进行参考。 拉框类的标注&#xff0c;如果你不确定哪种方法好&#xff0c;你可以把所标注区域的都剪切出来&#xff0c;然后站在屏幕一米之外眯…

MuJoCo中的机器人状态获取

UR5e机器人xml文件模型 <mujoco model"ur5e"><compiler angle"radian" meshdir"assets" autolimits"true"/><option integrator"implicitfast"/><default><default class"ur5e">&…

测试第四课---------性能测试工具

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【C++】新手入门指南(下)

文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南&#xff08;上&#xff09;&#xff0c;继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…

前后端分离项目在未部署条件下如何跨设备通信

其实我此前也不知道这个问题怎么解决&#xff0c;也没有想过—因为做的项目大部分都是前后端分离的&#xff0c;前端直接用后端的部署好的环境就行了。最近也是有点心高气傲开始独立开发&#xff0c;一个人又写前端又写后端也是蛮累的&#xff0c;即使有强有力的cursor也很累很…

基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例

多光谱遥感数据包含可见光至红外波段的光谱信息&#xff0c;Python凭借其丰富的科学计算库&#xff08;如rasterio、scikit-learn、GDAL&#xff09;&#xff0c;已成为处理此类数据的核心工具。本文以Landsat-8数据为例&#xff0c;演示‌辐射校正→特征提取→监督分类→精度评…

vscode python 代码无法函数跳转的问题

TL; DR; python.languageServer 配置成了 None 导致 vscode python 代码无法函数跳转 详细信息 mac 环境下 vscode 正常 command 鼠标左键 可以跳转到定义或者使用位置&#xff0c;但是我的为何不知道失效了 我一开始以为是热键冲突&#xff0c;结果发现 mac 好像没办法定…

Unity 脚本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询&#xff08;spatial queries&#xff09;&#xff0c;例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本&#xff0c;并调整寻路和避免的全局行为。 静态属性&#xff0…

从项目真实场景中理解二分算法的细节(附图解和模板)

遇到一个真实场景里使用二分算法的问题&#xff0c;本以为可以放心交给小师弟去做&#xff0c;结果出现了各种问题&#xff0c;在此梳理下二分算法的核心思想和使用细节。 文章目录 1.场景描述2.场景分析3.二分算法的精髓3.1 核心模板3.2 二分过程图解3.3 各种区间写法3.3.1 闭…

Jetson Orin NX 16G 配置GO1强化学习运行环境

这一次收到了Jrtson Orin NX, 可以进行部署了。上一次在nano上的失败经验 Jetson nano配置Docker和torch运行环境_jetson docker-CSDN博客 本次的目的是配置cuda-torch-python38环境离机运行策略。 Jetson Orin NX SUPER 1. 烧录镜像 参考链接在ubuntu系统中安装sdk manag…

深度学习3.5 图像分类数据集

%matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l代码执行流程图 #mermaid-svg-WWhBmQvijswiICpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…

js原型链prototype解释

function Person(){} var personnew Person() console.log(啊啊,Person instanceof Function);//true console.log(,Person.__proto__Function.prototype);//true console.log(,Person.prototype.__proto__ Object.prototype);//true console.log(,Function.prototype.__prot…

【知识】性能优化和内存优化的主要方向

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 前言 现在有很多论文&#xff0c;乍一看很高级&#xff0c;实际上一搜全是现有技术的堆砌&#xff0c;但是这种裁缝式的论文依然能发表在很好的会议和期…