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: 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.搭建服务注册
-  加入依赖:  
-  修改配置文件: 
  
-  成功后:  
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: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.环境隔离
企业开发中,一个服务会分为开发环境,测试环境和生产环境。
- 开发环境:开发⼈员用于开发的服务器,是最基础的环境。一般日志级别设置较低,可能会开启⼀些
 调试信息。
- 测试环境:测试人员用来进行测试的服务器,是开发环境到生产环境的过渡环境。
- 生产环境:正式提供对外服务的环境,通常关掉调试信息。
 通常情况下,这几个环境是不能互相通信的。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-service
  cloud:
    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=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.区别
- 功能
 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:



![[大模型]什么是function calling?](https://i-blog.csdnimg.cn/direct/b49475b7556145699a37128b08d173eb.png)
















