SpringCloudAlibaba之Nacos
测试环境搭建
1.1 创建提供者程 工程 01-provider-8081
(1)创建工程
创建一个 Spring Initializr 工程,并命名为 01-provider-8081。导入 Lombok、Web、JPA 及MySQL 驱动依赖。
(2)导入Druid依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 修改 MySQL 驱动版本 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
(3)定义实体类
(4)定义 Repository 接口
(5)定义 Service 接口
(6)定义 Service 实现类
A 、 添加数据
B 、 删除数据
##### C 、 修改数据
D 、根据 id 查询
E 、 查询所有
(7)定义处理器
(8)修改配置文件
1.2 创建消费者工程 01-consumer-8080
(1)创建工程
创建一个 Spring Initializr 工程,并命名为 01-consumer-8080,导入 Lombok 与 Web 依赖。
(2)定义实体类
(3)定义 JavaConfig 容器类
(4)定义处理器类
A 、 添加数据
B 、 删除与修改数据
C 、 两个查询
Nacos服务注册与发现
2.1注册中心
2.1.1Nacos简介
Nacos = 服务注册中心 + 服务配置中心
Nacos = Eureka + Spring Cloud Config + Spring Cloud Bus
Nacos,Dynamic Naming and Configuration Service,动态的命名与配置服务。
2.1.2 Nacos下载与安装
(1) 下载
(2)配置
这里下载 nacos-server-1.3.1.zip 这个打过包的 Server。解压到 H盘根目录。
1.1.3 Nacos启动
在nacos/bin目录下有启动的文件
其中 cmd 是 Windows 系统中的命令,sh 是 Linux 系统中的命令。
直接双击 startup.cmd 即可运行,并马上可以看到如下内容。
当看到如下日志时,表示启动成功
2.2 定义提供者 02-provider-nacos-8081
2.2.1 定义工程
复制 01-provider-8081 工程,并重命名为 02-provider-nacos-8081。
2.2.2 修改 pom
添加上 Spring Cloud、Spring Cloud Alibaba 与 Nacos Discovery 依赖。
(1)添加 spring cloud 依赖管理及依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)添加 spring cloud alibaba 依赖管理及依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<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>
</dependencies>
</dependencyManagement>
(3)添加 Nacos Discovery 依赖
<!--nacos discovery 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.abc</groupId>
<artifactId>02-nacos-provider-8081</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!--nacos discovery依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--修改MySQL驱动版本-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2.3修改配置文件
添加如下配置,指定 nacos server 的地址及微服务名称。
2.3 定义消费 定义消费者 者 02-consumer-nacos-8080
2.3.2 修改 pom
与定义 provider 时的相同,consumer 的 pom 也做了如下几处的修改:
- 添加 spring cloud alibaba 依赖
- 添加 nacos-discovery 依赖
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kaikeba</groupId>
<artifactId>02-nacos-consumer-8080</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!--nacos discovery依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.3.3 修改配置文件
2.3.4 修改处理器类
2.3.5 修改 JavaConfig 类
Nacos Config 服务配置中心
集群中每一台主机的配置文件都是相同的,对配置文件的更新维护就成为了一个棘手的问题,Nacos 是可以对 Spring Cloud 中各个微服务配置文件进行统一维护管理的配置中心。
3.1原理
3.1.1 Spring Cloud Config 工作原理
3.1.2 Nacos Config 工作原理
3.1.3 对比
Nacos config 比 Spring Cloud Config 的用户体验更好,系统效率更高。主要表现在这么几个方面:
- Nacos Config 无需消息总线系统。系统搭建成本、系统复杂的较较 Spring Cloud Config 低很多。
- Nacos Config 采用长连接轮询Pull 模型
- Nacos Config 不存在羊群效应
3.2 基本用法
所谓基本用法,就是 Nacos Config Server 直接管理 Nacos Config Client 的配置文件。
3.2.1 定义提供者 03-provider-nacos-config-8081
(1)定义工程
复制 02-provider-nacos-8081 工程,并重命名为 03-provider-nacos-config-8081。
(2)修改 pom
在 pom 中添加如下依赖。
<!--nacos config 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(3)定义 bootstrap.yml
删除原有的 application.yml 文件,新建 bootstrap.yml。
3.2.2 Nacos启动与配置
启动 Nacos,然后打开 nacos 页面。
Data ID 用于指定在 nacos config 中保存的配置文件的名称。该文件可以是 yml 或properties,但名称必须为微服务名称,即 bootstrap.yml 文件中设置的 spring.application.name的值。应用在启动时就是通过这个微服务名称在 nacos config 中查找相应的配置文件的。
将原来 application.yml 中的全部内容复制到该页面,并将原来的 spring.application.name属性删除(在 bootstrap.yml 中已经配置过了)。
server:
port: 8081
spring:
application:
name: msc-provider-depart # 微服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8847,localhost:8848,localhost:8849 # nacos discovery地址
jpa:
generate-ddl: true
show-sql: true
hibernate:
ddl-auto: none
# 配置数据源
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///test?useUnicode=true&characterEncoding=utf8
username: root
password: 1098756313
# 配置日志
logging:
pattern:
console: level-%level %msg%n
level:
root: info
org.hibernate: info
# 以下两种设置的前提都是show-sql: true
# 显示动态参数值
org.hibernate.type.descriptor.sql.BasicBinder: trace
# 显示查询结果(如果是查询的话)
org.hibernate.type.descriptor.sql.BasicExtractor: trace
com.abc.provider: debug
注意要选择上配置格式为 YAML。
发布,返回后,就可看到如下清单了。
3.2.3 运行访问
启动 03-provider-nacos-config-8081,页面正常访问即可。
3.3动态更新配置
3.3.1修改 Nacos 配置数据
直接在 nacos config 配置页面修改配置信息,例如添加一个 depart.name 属性。修改完毕后,再次发布即可。
3.3.2 定义提供者 03-provider-nacos-config-refresh-8081
(1)定义工程
复制03-provider-nacos-config-8081工程,重命名为03-provider-nacos-config-refresh-8081。
(2)修改 DepartServiceImpl 类
在该类上添加@RefreshScope 注解,实现数据的动态更新
完成动态更新配置
3.3.3 长轮询制 机制 Pull 模型
Nacos Config Server 中配置数据的变更,Nacos Config Client 是如何知道的呢?Nacos 采用的是长轮询机制的 Pull 模型。
长轮询的 Pull 模型整合了 Push 与 Pull 模型的优势。Client 仍定时发起 Pull 请求,查看Server 端数据是否更新。若发生了更新,则 Server 立即将更新数据以响应的形式发送给 Client端;若没有发生更新,Server 端并不立即向 Client 返回响应,而是临时性的保持住这个连接一段时间。若在此时间段内,Server 端数据发生了变更,则立即将变更数据返回给 Client。若仍未发生变更,则放弃这个连接。等待着下一次 Client 的 Pull 请求。
长轮询 Pull 模型,是 Push 与 Pull 模型的整合,既降低了 Push 模型中长时间占用长连接的问题,又降低了 Push 模型实时性较低的问题。
3.4 多环境选择的实现
3.4.1 新增多环 境配置文件
(1)克隆文件
在 Nacos config 服务器中克隆两个配置文件。
注意,多环境选择配置文件的文件名中,后面必须是-{profile}
(2)修改配置文件内容
3.4.2 修改应用的配置文件
修改 03-provider-nacos-config-refresh-8081 工程的 bootstrap.yml 文件。在其中添加多环境选择配置。
3.5将数据持久到外置MySQL中
默认情况下,Nacos 中的配置数据是被持久到到内置的 MySQL 数据库中的,注意,服务注册与发现中的数据没有写在这个 MySQL 数据库中。使用内置数据库,存在很多明显问题。所以,生产环境下,Nacos 一般会连接外置的MySQL。当然,目前 Nacos 仅支持 MySQL,并且要求是 5.6.5 及其以上版本。
3.5.1 查找 SQL 脚本文件
若要连接外置 MySQL,则外置 MySQL 中就要有相应的数据库及表。这些表的创建语句Nacos 官方已经给出了 SQL 的脚本文件,在 Nacos 解压目录的 config 子目录中。
修改sql文件,在该文件中添加如下的 DB 创建语句
3.5.2 运行脚本文件
此处直接在navicat中运行SQL文件
3.5.3 修改 Nacos 配置
打开 Nacos 安装目录下的 conf/application.properties 文件,添加以下内容:
3.6 Nacos集群搭建
无论是 Nacos Discovery 还是 Nacos Config,单机版 Nacos 都存在单点问题。所以需要搭建高可用的 Nacos 集群。
3.6.1 搭建三台 Nacos
(1)修改配置并复制目录
首先随意创建一个目录,用于存放三个Nacos服务器。例如在H盘创建一个nacos_cluster目录。然后再复制原来配置好的单机版的 Nacos 到这个目录,并重命名为 nacos8847。将来要这里要存放三个子目录,分别为 nacos8847、nacos8848、nacos8849。
打开 nacos8847/conf,重命名其中的 cluster.conf.example 为 cluster.conf。然后打开该文件,在其中写入三个 nacos 的 ip:port。
然后再打开 nacos8847/conf/application.properties 文件,修改端口号为 8847。
然后再将 nacos8847 目录复制三份,分别命名为 nacos8848、nacos8849。并重新指定端口号分别为 8848 与 8849
(2) 启动集群
我们当前为 Nacos1.3.1 版本,若让其以集群方式启动,则需要通过命令行方式进行。startup.cmd -m cluster 表示以集群方式启动
这个 Nacos is starting…会持续较长时间,最终看到如下日志时,表示启动成功。
3.6.2 Client 连接 Nacos 集群 3.6.2
直接将03-provider-nacos-config-refresh-8081的 bootstrap.yml中的 nacos config 地址更换为 Nacos 集群地址即可
当然,也可以将 Nacos 配置中心中存放的 Nacos Discovery 的地址更换为 Nacos 集群。这样也就实现了 Nacos 注册中心的高可用。