文章目录
一、nacos是什么?
Nacos是一个配置中心 也是一个服务注册与发现中心
为什么需要配置中心?
-
配置数据脱敏
-
防止出错,方便管理
-
在当微服务架构中,当实例越来越多,达到数十、数百时,去逐个修改每1个微服务的配置就会让人抓狂,而且很容易出错。这时我们就需要1个可以集中保存微服务配置的配置中心。
为什么需要服务注册与发现中心?
-
方便服务集中管理
-
各种服务相互调用可以通过服务名去调用
二、nacos版本说明
Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Dubbo Version | Seata Version |
---|---|---|---|---|---|
2.2.9.RELEASE | 1.8.5 | 2.1.0 | 4.9.4 | ~ | 1.5.2 |
2021.0.4.0 | 1.8.5 | 2.0.4 | 4.9.4 | ~ | 1.5.2 |
2.2.8.RELEASE | 1.8.4 | 2.1.0 | 4.9.3 | ~ | 1.5.1 |
2021.0.1.0 | 1.8.3 | 1.4.2 | 4.9.2 | ~ | 1.4.2 |
2.2.7.RELEASE | 1.8.1 | 2.0.3 | 4.6.1 | 2.7.13 | 1.3.0 |
2.2.6.RELEASE | 1.8.1 | 1.4.2 | 4.4.0 | 2.7.8 | 1.3.0 |
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE | 1.8.0 | 1.4.1 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE | 1.8.0 | 1.3.3 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE | 1.7.1 | 1.2.1 | 4.4.0 | 2.7.6 | 1.2.0 |
2.2.0.RELEASE | 1.7.1 | 1.1.4 | 4.4.0 | 2.7.4.1 | 1.0.0 |
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE | 1.7.0 | 1.1.4 | 4.4.0 | 2.7.3 | 0.9.0 |
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE | 1.6.3 | 1.1.1 | 4.4.0 | 2.7.3 | 0.7.1 |
三、Springboot与Springcloud版本对应
官方对应关系:https://start.spring.io/actuator/info
"spring-cloud": {
"Hoxton.SR12": "Spring Boot >=2.2.0.RELEASE and <2.4.0.M1",
"2020.0.6": "Spring Boot >=2.4.0.M1 and <2.6.0-M1",
"2021.0.0-M1": "Spring Boot >=2.6.0-M1 and <2.6.0-M3",
"2021.0.0-M3": "Spring Boot >=2.6.0-M3 and <2.6.0-RC1",
"2021.0.0-RC1": "Spring Boot >=2.6.0-RC1 and <2.6.1",
"2021.0.4": "Spring Boot >=2.6.1 and <3.0.0-M1",
"2022.0.0-M1": "Spring Boot >=3.0.0-M1 and <3.0.0-M2",
"2022.0.0-M2": "Spring Boot >=3.0.0-M2 and <3.0.0-M3",
"2022.0.0-M3": "Spring Boot >=3.0.0-M3 and <3.0.0-M4",
"2022.0.0-M4": "Spring Boot >=3.0.0-M4 and <3.0.0-M5",
"2022.0.0-M5": "Spring Boot >=3.0.0-M5 and <3.1.0-M1"
},
四、nacos的下载与安装
Nacos下载地址 :https://github.com/alibaba/nacos/releases
Nacos安装:
-
解压安装包
-
打开配置文件(nacos安装目录 -> conf -> application.properties)
-修改数据源配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
-修改端口号
\### Default web context path:
server.servlet.contextPath=/nacos
\### Default web server port:
server.port=8848
-
执行sql文件(nacos安装目录 -> conf ->nacos-mysql.sql)
-
通过修改nacos.core.auth.enabled为true,就可以开启nacos认证。开启后客户端必须配置username、password。
五、Nacos原理
用户端在nacos注册自身服务,并自动将nacos服务列表拉取到本地服务列表。同时通过心跳定时检测nacos服务列表,若列表有更新,则客户端自动拉取nacos服务列表到本地。客户端通过本地服务列表连接到相应服务。
5.2配置中心原理
先来了解SpringBoot/SpringCloud中几个关键类。
MapPropertySource:这个是spring中属性配置的数据源,所有的配置文件都要转成这样的形式。
RefreshEvent:发送该事件,可以类似调用RefreshEndpoint#refresh,也就是通知spring刷新配置文件。
EnvironmentChangeEvent:发送该事件,会通知环境已经发生变化。
ContextRefresher:刷新管理类。
NacosContextRefresher:nacos配置上下文管理类。
RefreshScope:该注解会把bean加入到’refresh’的scope中。
ClientWorker:nacos配置中心客户端,会定时http请求服务器。
1.在nacos上修改配置。
2.nacos客户端中ClientWorker会每隔10ms异步读取一次配置中心文件md5值。
3.和本地md5值比较,有变化的从服务器拉取。
4.将文件保存/缓存到本地。
5.通知NacosContextRefresher配置文件有变化。
6.NacosContextRefresher判断是否需要更新配置。
7.发送事件通知ContextRefresher去更新。
8.这里是更新配置的关键步骤。
9.准备一份before配置,然后通过构建新的Environment的方式拿到新的配置,接着比较变化,得到有变化的keys。
10.构建Environment时会去读取配置文件,文件优先读本地,如果本地没有通过Http请求服务商。
11.构建NacosPropertiesSource,并重新生成ConfigurationProperties对象。
12.通知RefreshScope去更新。
13.销毁scope='refresh’的bean。
14.通知bean容器去构建新的bean(懒加载)。
15.将属性(@Value注解)注入到新的bean。
六、Nacos的启动
5.1单机模式启动
在nacs安装目录下的bin目录中运行命令,默认是集群模式启动,单机模式启动需要指定模式。
Windows命令:startup.cmd -m standalone
Linux命令:sh startup.sh -m standalone
命令运行成功后直接访问:http://localhost:8848/nacos
默认账号密码都是:nacos
5.2集群模式启动
1.修改cluster.conf文件
进入nacos的conf目录(即配置目录),将配置文件cluster.conf.example重命名为cluster.conf。
然后进入cluster.conf文件,修改以下位置的ip地址(这里我用本机真实ip地址或者127.0.0.1,在后面均可正常启动,但还是推荐使用本机真实ip地址)
修改ip地址
2.修改application.properties文件
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=你的数据库用户名
db.password.0=你的数据库密码
3.复制nacos文件夹并修改配置文件
将前面配置好的nacos文件夹复制成三份,并分别命名为nacos1,nacos2,nacos3。
然后分别进入三个文件夹中的application.properties文件中进行修改,将端口号分别改为 8811、8812、8813
4.启动nacos
入nacos文件夹的bin目录中,在地址栏输入cmd进入命令行窗口。
在命令行窗口中输入命令:startup.cmd即可启动,启动成功如下图所示:
5.可以进行nginx反向代理实现负载均衡(可选项)
- 下载nginx安装包
- 进入conf目录,修改其中的nginx.conf文件,将以下配置复制到http{}内(注意:复制到http语句块的任意位置都可以,但一定要在http语句块以内,这里我粗心了导致检查了很久!)
upstream nacos-cluster {
server 127.0.0.1:8811;
server 127.0.0.1:8812;
server 127.0.0.1:8813;
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
6.测试
访问http://localhost/nacos即可,如果访问成功说明配置成功。
六、Nacos服务注册
6.1引入父工程依赖,这里定义了springCloudAlibaba依赖的版本号
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
6.2项目中引入nacos discovery依赖
<!-- nacos服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
6.3编写项目bootstrap.properties文件
在bootstrap.properties文件中(后面实现nacos配置中心就可以放在配置中心上了),添加以下信息:
#nacos服务注册与发现
#服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#服务所在的命名空间id
spring.cloud.nacos.discovery.namespace=7b05dab7-7dc1-480a-a218-5832cb4e8d0e
#分组
spring.cloud.nacos.discovery.group=consume
#深圳
spring.cloud.nacos.discovery.cluster-name=SZ
6.4在springboot的启动类上添加注解,开启nacos
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Description: 启动类
*/
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumeApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumeApplication.class,args);
}
}
6.5测试
测试通过:
七、Nacos配置中心
7.1引入父工程依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
7.2项目中引入nacos配置中心依赖
<!--nacos的配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
7.3编写项目bootstrap.properties文件
#nacos配置中心
spring.profiles.active=dev
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=public
spring.cloud.nacos.config.group=DEFAULT_GROUP
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.refreshable-dataids=true
7.4在springboot的启动类添加注解,开启nacos
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Description: 启动类
*/
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumeApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumeApplication.class,args);
}
}
7.5在nacos页面编写配置文件
注意:consume-service-dev.properties是${spring.application.name}-环境标识.properties
7.6编写controller层,并测试
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashSet;
/**
* @Description: 用户服务的Controller
*/
@RestController
@RequestMapping("/consume")
@Api(value = "用户服务的Controller",tags = "Consume",description = "用户服务API")
public class ConsumeController {
@Value("${username}")
private String userName;
@ApiOperation("测试hello")
@GetMapping(path = "/hello")
public String hello(){
System.out.println("!1");
return userName;
}
}
测试通过: