Nacos是Spring Cloud Alibaba提供的一个软件
这个软件主要具有注册中心和配置中心(课程最后讲解)的功能
我们先学习它注册中心的功能
微服务中所有项目都必须注册到注册中心才能成为微服务的一部分
注册中心和企业中的人力资源管理部门有相似

当前微服务项目中所有的模块,在启动前,必须添加注册到Nacos的配置
所谓注册,就是将自己的信息,提交到Nacos来保存
https://github.com/alibaba/nacos/releases/download/1.4.3/nacos-server-1.4.3.zip
因为Nacos是java开发的
我们要启动Nacos必须保证当前系统配置了java环境变量
简单来说就是要环境变量中,有JAVA_HOME的配置,指向安装jdk的路径
确定了支持java后,就可以启动Nacos了
将nacos-server-1.4.2.zip压缩包解压
双击打开解压得到的文件夹后,再双击打开其中的bin目录

cmd结尾的文件是windows版本的
sh结尾的文件是linux和mac版本的
startup是启动文件,shutdown是停止文件
Windows下启动Nacos不能直接双击cmd文件
需要在dos窗口运行
在当前资源管理器地址栏输入cmd
E:\tools\nacos\bin>startup.cmd -m standalone
startup.cmd:windows启动nacos的命令文件
-m 表示要设置启动参数
standalone:翻译为标准的孤独的,意思是正常的使用单机模式启动
运行成功默认占用8848端口,并且在代码中提示
如果不输入standalone运行会失败
如果报了
"please set JAVA_HOME......."
表示当前项目没有配置java环境变量(主要是没有设置JAVA_HOME)
如果运行没有报错
打开浏览器输入地址
http://localhost:8848/nacos
如果是首次访问,会出现这个界面
登录系统
用户名:nacos
密码:nacos
登录之后可以进入后台列表
不能关闭启动nacos的dos窗口
我们要让我们编写的项目注册到Nacos,才能真正是微服务项目
创建项目名称csmall
我们微服务开发过程中,一般都会使用一个Idea中包含多个项目的形式
这个形式就是先创建一个"父项目",再向这个父项目中创建多个子项目的操作
我们首先创建一个项目:csmall
注意细节的修改
不要选择springBoot 3.0.x,要选择2开头的版本

上面图片next之后直接点击finish即可
首先,将当前csmall项目修剪为父项目的格式
最终csmall的pom文件如下
4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.9 cn.tedu csmall 0.0.1-SNAPSHOT csmall Demo project for Spring Boot 1.8 pom
创建csmall-stock项目
我们每次创建一个子项目之后
都要进行"父子相认"
在父项目的pom文件中,编写子项目的存在
pom
csmall-stock
还需要在子项目的pom文件中对父项目进行继承操作
父项目的第11行到第13行
复制到子项目的第6行到第8行
子项目pom文件修改后
4.0.0 cn.tedu csmall 0.0.1-SNAPSHOT cn.tedu csmall-stock 0.0.1-SNAPSHOT csmall-stock Demo project for Spring Boot org.springframework.boot spring-boot-starter
父子相认完成
这样当前子项目就可以读取父项目中的pom文件信息了
删除stock模块src\test文件夹
在我们现在使用maven添加依赖的认知中
有些依赖时必须添加版本号才能执行
有些依赖则不必添加版本号
原因是我们继承的SpringBoot(2.5.9)父项目中,定义了一些常用依赖的版本号
如果我们自己编写的父项目想定义我们项目中需要的依赖版本号的话,也是可以实现的
这样做可以统一所有子项目的版本,在更新版本时,只需要修改父项目中定义的版本号即可
父项目的pom文件添加如下内容
csmall-stock
1.8 2.2.0
org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.version}
子项目中如果需要mybatis的依赖只需要添加如下内容即可,无需再指定版本号
org.mybatis.spring.boot mybatis-spring-boot-starter
上面的操作也称之为"锁版本"
因为我们学习微服务的过程中需要很多微服务相关的依赖
这些依赖都需要在父项目中进行版本的管理的
所以我们直接使用分享给大家的完整版项目的父项目pom文件即可
父项目完整最终pom文件如下
4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.9 cn.tedu csmall 0.0.1-SNAPSHOT csmall Demo project for Spring Boot pom csmall-stock 1.8 2020.0.3 2.2.2.RELEASE 2.5.4 2.3.0.RELEASE 1.0.10.RELEASE 2.2.0 3.4.1 1.4.0 8.0.26 1.18.20 2.0.9 2.3.10 5.5.2 1.2.45 1.1.20 0.9.0 1.4.2 org.projectlombok lombok io.seata seata-all ${seata-server.version} org.projectlombok lombok ${lombok.version} mysql mysql-connector-java ${mysql.version} runtime com.alibaba druid ${druid.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis-spring-boot.version} com.baomidou mybatis-plus-boot-starter ${mybaits-plus.version} com.baomidou mybatis-plus-generator ${mybaits-plus.version} com.github.pagehelper pagehelper-spring-boot-starter ${pagehelper-spring-boot.version} org.springframework.boot spring-boot-starter ${spring-boot.version} org.springframework.boot spring-boot-starter-web ${spring-boot.version} org.springframework.boot spring-boot-starter-freemarker ${spring-boot.version} org.springframework.boot spring-boot-starter-validation ${spring-boot.version} org.springframework.boot spring-boot-starter-security ${spring-boot.version} org.springframework.boot spring-boot-starter-oauth2-client ${spring-boot.version} org.springframework.boot spring-boot-configuration-processor ${spring-boot-configuration-processor.version} org.springframework.security spring-security-jwt ${spring-security-jwt.version} com.github.xiaoymin knife4j-spring-boot-starter ${knife4j-spring-boot.version} org.springframework.boot spring-boot-starter-data-redis ${spring-boot.version} org.springframework.boot spring-boot-starter-data-mongodb ${spring-boot.version} org.springframework.boot spring-boot-starter-data-elasticsearch ${spring-boot.version} org.springframework.boot spring-boot-starter-amqp ${spring-boot.version} org.springframework.boot spring-boot-starter-actuator ${spring-boot.version} org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} pom import com.alibaba fastjson ${fastjson.version} io.jsonwebtoken jjwt ${jjwt.version} org.springframework.boot spring-boot-starter-test ${spring-boot.version} test org.springframework.amqp spring-rabbit-test ${spring-rabbit-test.version} test org.springframework.security spring-security-test ${spring-security-test.version} test io.seata seata-spring-boot-starter ${seata-server.version}
配置yml文件内容
server:port: 20000
#公共配置
mybatis:configuration:cache-enabled: false # 不启用mybatis缓存map-underscore-to-camel-case: true # 映射支持驼峰命名法log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 将运行的sql输出到控制台
knife4j:# 开启增强配置enable: true# 生产环境屏蔽,开启将禁止访问在线API文档production: false# Basic认证功能,即是否需要通过用户名、密码验证后才可以访问在线API文档basic:# 是否开启Basic认证enable: false# 用户名,如果开启Basic认证却未配置用户名与密码,默认是:admin/123321username: root# 密码password: root
spring:profiles:active: dev
上面的配置含义是让SpringBoot读取额外配置文件
我们参数值编写的是dev,是可以随意修改的,这里定义的名称,就是指定配置文件的名称
例如当前我们编写的dev,SpringBoot就会额外加载名称为application-dev.yml文件
我们创建application-dev.yml文件,以备添加配置
我们已经讲过,一个项目要想成为微服务项目体系的一部分
必须将当前项目的信息注册到Nacos
我们要添加一些配置,实现business模块启动时注册到Nacos的效果
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
我们在创建好的application-dev.yml中编写对nacos注册的配置信息
spring:application:# 设置当前应用的名称,这个名字会提交到Nacos,作为当前微服务模块的名称name: nacos-businesscloud:nacos:discovery:# 配置nacos的位置,用于提交当前项目的注册信息server-addr: localhost:8848
按照学习Nacos时的方式,启动一下nacos
启动之后,
重启business模块,如果启动也正常,就应该将当前项目的信息提交给Nacos
在Nacos的服务管理->服务列表中,能看到nacos-business的名称

常见面试题
心跳:周期性的操作,来表示自己是健康可用的机制
注册到Nacos的微服务项目(模块)都是会遵循这个心跳机制的
心跳机制的目的
1.是表示当前微服务模块运行状态正常的手段
2.是表示当前微服务模块和Nacos保持沟通和交换信息的机制
默认情况下,服务启动开始每隔5秒会向Nacos发送一个"心跳包",这个心跳包中包含了当前服务的基本信息
Nacos接收到这个心跳包,首先检查当前服务在不在注册列表中,如果不在按新服务的业务进行注册,如果在,表示当前这个服务是健康状态
如果一个服务连续3次心跳(默认15秒)没有和Nacos进行信息的交互,就会将当前服务标记为不健康的状态
如果一个服务连续6次心跳(默认30秒)没有和Nacos进行信息的交互,Nacos会将这个服务从注册列表中剔除
这些时间都是可以通过配置修改的
实例类型分类
实际上Nacos的服务类型还有分类
默认每个服务都是临时实例
如果想标记一个服务为永久实例
cloud:nacos:discovery:# ephemeral设置当前项目启动时注册到nacos的类型 true(默认):临时实例 false:永久实例ephemeral: false
持久化实例启动时向nacos注册,nacos会对这个实例进行持久化处理
心跳包的规则和临时实例一致,只是不会将该服务从列表中剔除
一般情况下,我们创建的服务都是临时实例
只有项目的主干业务才会设置为永久实例
之前我们启动Nacos都是使用dos命令行
启动过程比较复杂,命令比较长
Idea实际上支持我们更加方便的启动Nacos
步骤1:

步骤2:

步骤3: 
配置成功之后
Nacos就会出现在idea的启动选项中了
这种方法实际上只是为了简便大家启动nacos的操作,还是需要掌握命令行的启动方式的!
创建csmall-cart子项目
父子相认
子项目pom文件为:
4.0.0 cn.tedu csmall 0.0.1-SNAPSHOT cn.tedu csmall-cart 0.0.1-SNAPSHOT csmall-cart Demo project for Spring Boot org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter com.alibaba druid mysql mysql-connector-java cn.tedu csmall-commons 0.0.1-SNAPSHOT com.github.xiaoymin knife4j-spring-boot-starter com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
创建application.yml文件,内容如下,注意修改了端口号20001
server:port: 20001
#公共配置
mybatis:configuration:cache-enabled: false # 不启用mybatis缓存map-underscore-to-camel-case: true # 映射支持驼峰命名法log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 将运行的sql输出到控制台
knife4j:# 开启增强配置enable: true# 生产环境屏蔽,开启将禁止访问在线API文档production: false# Basic认证功能,即是否需要通过用户名、密码验证后才可以访问在线API文档basic:# 是否开启Basic认证enable: false# 用户名,如果开启Basic认证却未配置用户名与密码,默认是:admin/123321username: root# 密码password: root
spring:profiles:active: dev
创建application-dev.yml
spring:application:# 设置当前应用的名称,这个名字会提交到Nacos,作为当前微服务模块的名称name: nacos-cartcloud:nacos:discovery:# 配置nacos的位置,用于提交当前项目的注册信息server-addr: localhost:8848datasource:url: jdbc:mysql://localhost:3306/csmall_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=trueusername: rootpassword: root
上一篇:高可用架构和系统设计经验