Nacos
1. 概述
nacos 是 alibaba开源的一个注册中心和配置中心
是分布式微服务的组件之一
2. 安装
2.1 下载
- 官网地址
- 选择版本:1.4.1
- 解压到 linux服务器 tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
2.2 启动
切换到nacos安装目录 cd /usr/local/nacos/bin
-
单机启动
-
./startup.sh -m standalone
-
-
集群启动
-
./startup.sh
-
-
登录
- 用户名:nacos
- 密码:nacos
-
关闭
-
./shutdown.sh
-
3. 工程环境搭建
3.1 父工程
nacos-parent
pom.xml 管理依赖版本
<?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.moyu</groupId>
<artifactId>cloud-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>common</module>
<module>nacos-provide</module>
</modules>
<dependencyManagement>
<dependencies>
<!--Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
3.2 公共模块
common
实体类 User
package com.moyu.pojo;
public class User {
private Integer id;
private String name;
private Integer age;
public User() {
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
4. 注册中心
4.1 作用
提供服务的注册(存放注册的服务的 ip 和 port)与发现
4.2 使用
-
创建服务提供者:nacos_porvider
-
pom.xml 引入依赖
-
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.moyu</groupId> <artifactId>common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
-
-
application.yml
-
server: port: 8081 spring: application: name: nacos-provide cloud: nacos: discovery: server-addr: 192.168.40.132:8849
-
-
NacosProvideApp
-
@SpringBootApplication @EnableDiscoveryClient public class NacosProvideApp { public static void main(String[] args) { SpringApplication.run(NacosProvideApp.class, args); } }
-
-
UserController
-
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/getUserById/{id}") public User getUserById(@PathVariable("id") Integer id) { return userService.getUserById(id); } }
-
-
-
创建服务消费者:nacos_consumer
-
pom.xml 引入依赖
-
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.moyu</groupId> <artifactId>common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
-
-
application.yml,注册服务
-
server: port: 80 spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: 192.168.40.132:8849
-
-
NacosProvideApp,开启服务发现
-
@SpringBootApplication @EnableDiscoveryClient public class NacosProvideApp { public static void main(String[] args) { SpringApplication.run(NacosProvideApp.class, args); } }
-
-
BeanConfig,注入RestTemplate类
-
@Configuration public class BeanConfig { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
-
UserController,服务调用处理
-
@RestController @RequestMapping("/user") public class UserController { @Resource private RestTemplate restTemplate; @Resource private DiscoveryClient discoveryClient; @GetMapping("/getUserById/{id}") public User getUserById(@PathVariable("id") Integer id) { ServiceInstance service = discoveryClient.getInstances("nacos-provide").get(0); String url = "http://"+service.getHost()+":"+service.getPort()+"/user/getUserById/"+id; return restTemplate.getForObject(url, User.class); } }
-
-
5. 配置中心
5.1 作用
- 项目所有配置集中存放统一管理
- 配置中心文件更新时,对应服务同步获取新的配置内容
5.2 实时更新原理
当配置中心配置发生改变,则其对应的md5也会变化,则nacos向使用此配置文件的客户端发送更新消息,服务端收到消息则重新拉取配置文件
5.2 使用
-
新建工程
-
nacos-config
-
pom.xml,引入依赖
-
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
-
-
ConfigController,获取配置信息
-
@RestController @RequestMapping("/config") @RefreshScope //配置文件实时更新 public class ConfigController { @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @GetMapping("/getDBConfig") public String getDBConfig(){ return driverClassName+"<br>"+url+"<br>"+username+"<br>" +password+"<br>"; } }
-
-
bootstrap.yml,配置文件,只需配置这一个配置文件即可,比application.yml 优先级更高,更先加载
-
spring: cloud: nacos: discovery: server-addr: 192.168.40.132:8849 config: server-addr: 192.168.40.132:8849 prefix: nacos-config #配置文件的前缀,默认是spring.application.name file-extension: yaml #配置文件的后缀,默认是properties #Data ID的语法:${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}
-
-
-
在nacos中新建配置文件
- 配置列表 -> + -> 编辑配置文件 -> 发布
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aECB6TU1-1665305934214)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221009163750015.png)]](/https://i-blog.csdnimg.cn/blog_migrate/530242cb18e44ba300c4df19fe30d79e.png)
-
server: port: 8082 spring: application: name: nacos-config nacos: discovery: server-addr: 192.168.40.132:8849 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false username: root password: 123
-
测试
-
访问链接:localhost:8082/config/getDBConfig
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ka6yo1Au-1665305934215)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221009164349952.png)]](/https://i-blog.csdnimg.cn/blog_migrate/11bd7bf848ff362cba274b5b12e77bf0.png)
-
修改配置文件:
-
spring: username: user password: 555
-
-
再次访问链接:localhost:8082/config/getDBConfig
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9A7YXgf-1665305934216)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221009164456111.png)]](/https://i-blog.csdnimg.cn/blog_migrate/d12a09962901491447f1223548ac92a4.png)
- 可见配置已动态改变
-
5.3 配置隔离
5.3.1 概述
通过Namespace、group,DataId 可准确定位到某一配置
- Namespace:环境级隔离,不同环境不同 Namespace,如public, dev, test…
- Group:项目级隔离,更细粒度的隔离
- DataId:工程级隔离,定位到某一配置文件
要准确定位到某一配置文件集需要指定:nacos服务地址,namespace(默认public),group(默认DEFAULT_GROUP),dataId
5.3.2 使用
-
新建命名空间 test, dev
-
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cT6myflN-1665398274784)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143049866.png)]](/https://i-blog.csdnimg.cn/blog_migrate/4c0ee72fb81455201acc13cda8d12be3.png)
-
同理创建dev
-
-
切换到test空间
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TyJB0skz-1665398274785)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143223670.png)]](/https://i-blog.csdnimg.cn/blog_migrate/01218bad9428d69f087347dd2b7fa42a.png)
-
新建配置文件,设置Data Id 为TestConfig,Group为TestGroup1
-
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mhWTWFiS-1665398274785)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143347822.png)]](/https://i-blog.csdnimg.cn/blog_migrate/08b32a49e8b68949b43c1bb77cb9f27a.png)
-
server: port: 8082 spring: application: name: nacos-config Namespace: test Group: TestGroup1 DataId: TestConfig
-
-
克隆TestConfig
-
到test.TestGroup2.TestConfig
-
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jF9z2sR7-1665398274786)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143741405.png)]](/https://i-blog.csdnimg.cn/blog_migrate/c3db4b92cabc27244f846f7b86eeda9b.png)
-
编辑TestGoup2中的TestConfig,修改Group为TestGroup2
-
-
到dev.DevGroup.DevConfig
-
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pk7EgoHn-1665398274787)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010150053005.png)]](/https://i-blog.csdnimg.cn/blog_migrate/7d4ff23ee3c353aac8dacbddd65d0fb0.png)
-
编辑DevConfig
-
server: port: 8082 spring: application: name: nacos-config Namespace: dev Group: DevGroup DataId: DevConfig
-
-
-
修改ConfigController
-
@RestController @RequestMapping("/config") @RefreshScope public class ConfigController { @Value("${Namespace}") private String namespace; @Value("${Group}") private String group; @Value("${DataId}") private String dataId; @GetMapping("/getConfig") public String getConfig() { return "Namespace: " + namespace + "<br>" + "<br>" + "Group: " + group + "<br>" + "Data Id: " + dataId + "<br>"; } }
-
-
测试test.TestGroup1.TestConfig
-
修改bootstrap.yml
-
spring: cloud: nacos: discovery: server-addr: 192.168.40.132:8849 config: server-addr: 192.168.40.132:8849 namespace: test group: TestGroup1 prefix: TestConfig #配置文件的前缀,默认是spring.application.name file-extension: yaml #配置文件的后缀,默认是properties
-
-
启动项目并访问链接:localhost:8082/config/getConfig
-
-
测试dev.DevGroup.DevConfig
-
修改bootstrap.yml
-
spring: cloud: nacos: discovery: server-addr: 192.168.40.132:8849 config: server-addr: 192.168.40.132:8849 namespace: dev group: DevGroup prefix: DevConfig #配置文件的前缀,默认是spring.application.name file-extension: yaml #配置文件的后缀,默认是properties
-
-
启动项目并访问链接:localhost:8082/config/getConfig
-
6. 集群搭建
6.1 持久化
搭建集群需要统一数据库来统一数据
6.1.1 修改配置来切换数据库
修改 application.properties 文件
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.40.33:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=333
6.1.2 新建nacos数据库
新建nacos数据库并使用 nacos/config/nacos-mysql.sql 文件导入sql
6.2 创建nacos集群文件
-
进入nacos/config/,复制并修改cluster.conf文件
-
cp ./cluster.conf.example ./cluster.conf -
192.168.40.132:8848 192.168.40.132:8849 192.168.40.132:8850
-
-
复制三份nacos
-
cd /usr/local mkdir nacos-cluster cp -r nacos ./nacos-cluster/nacos-8848 cp -r nacos ./nacos-cluster/nacos-8849 cp -r nacos ./nacos-cluster/nacos-8850
-
-
分别修改nacos-8849和nacos-8850端口
-
vi /usr/local/nacos-cluster/nacos-8849/conf/application.properties vi /usr/local/nacos-cluster/nacos-8850/conf/application.properties -
server.port=8849 server.port=8850
-
-
分别启动数据库和三台nacos并访问
-
新建命名空间dev,并创建组DevGroup,配置文件DevConfig,内容同上,则数据库出现数据
6.3 nginx代理
6.3.1 安装nginx
-
安装nginx依赖库
-
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
-
-
下载jar包
-
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
-
-
解压
-
tar -zxvf nginx-1.12.0.tar.gz
-
-
配置nginx安装包
-
cd nginx-1.12.0 ./configure --prefix=/usr/local/nginx
-
-
编译并安装
-
make && make install
-
6.3.2 修改配置文件
vi /usr/local/nginx/config/nginx.config
upstream nacos {
server 192.168.40.132:8848;
server 192.168.40.132:8849;
server 192.168.40.132:8850;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://nacos;
}
}
6.3.3 启动
-
启动nacos集群
-
/usr/local/nacos-cluster/nacos-8848/bin/startup.sh /usr/local/nacos-cluster/nacos-8849/bin/startup.sh /usr/local/nacos-cluster/nacos-8850/bin/startup.sh
-
-
启动nginx代理
-
/usr/local/nginx/sbin/nginx
-
-
修改bootstrap.yml并启动程序
-
spring: cloud: nacos: discovery: server-addr: 192.168.40.132 config: server-addr: 192.168.40.132 namespace: dev group: DevGroup prefix: DevConfig #配置文件的前缀,默认是spring.application.name file-extension: yaml #配置文件的后缀,默认是properties
-
-
访问:localhost:8082/config/getConfig
7. Nacos开机自启动(单机版)
7.1 新建开机自启文件
- 新建 nacos.service 文件
vim /lib/systemd/system/nacos.service
- 编辑内容
此处nacos的安装目录为/usr/local/nacos,若不同请更改
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
复制粘贴后,注意检查开头结尾是否缺少字母,补全
- 重新加载service
systemctl daemon-reload #重新加载服务配置
7.2 修改nacos的startup.sh
vim /usr/local/nacos/bin/startup.sh
修改第一行为本地jdk安装路径,注释后三行
此处jdk安装路径为 /usr/local/jdk1.8.0_191,若不同请更改
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
7.3 设置开启自启
设置开机自启
systemctl enable nacos.service #设置为开机启动
其他命令
systemctl start nacos.service #启动nacos服务
systemctl stop nacos.service #停止nacos服务
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8G8ckpg1-1665398274788)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010145448971.png)]](/https://i-blog.csdnimg.cn/blog_migrate/506e7c016330935d4b0e45916a24259a.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzQg6KMG-1665398274789)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010150831881.png)]](/https://i-blog.csdnimg.cn/blog_migrate/8ad5cfcaeb4f51d8ab59bf0c457cb2a6.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rLJXaqP-1665398274792)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010162507834.png)]](/https://i-blog.csdnimg.cn/blog_migrate/266d193cd761e1e064f88ee9c931270a.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StMmIcQb-1665398274795)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010175916633.png)]](/https://i-blog.csdnimg.cn/blog_migrate/bdd9cd2feb6d72af1eee681f9c55eabd.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhbTlS4m-1665398274797)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010175538249.png)]](/https://i-blog.csdnimg.cn/blog_migrate/fd1fb749818a6932846b918d41aa1421.png)

1345

被折叠的 条评论
为什么被折叠?



