Nacos 注册中心和配置中心

  1. 1. Nacos 注册中心和配置中心
    1. 1.1. 1、Nacos简介
      1. 1.1.1. 1.1、Nacos是什么
    2. 1.2. 2、Nacos安装
    3. 1.3. 3、Nacos注册中心(存放服务的ip和port)
      1. 1.3.1. 3.1、创建服务提供者:nacos_provider
      2. 1.3.2. 3.2、创建服务消费者:nacos_consumer
    4. 1.4. 4、nacos配置中心(存放配制文件)
      1. 1.4.1. 4.1、新增工程
      2. 1.4.2. 4.2、在nacos中新建配置文件
      3. 1.4.3. 4.3、配置隔离
        1. 1.4.3.1. 4.3.1、Nacos配置管理模型
        2. 1.4.3.2. 4.3.2、namespace隔离
          1. 1.4.3.2.1. 1.新建namespace
          2. 1.4.3.2.2. 2.克隆配置文件
          3. 1.4.3.2.3. 3.读取配置文件
        3. 1.4.3.3. 4.3.3、group隔离
          1. 1.4.3.3.1. 1.新建配置文件
          2. 1.4.3.3.2. 2.读取配置文件
      4. 1.4.4. 4.4.服务隔离
        1. 1.4.4.1. 4.4.1.修改配置文件
        2. 1.4.4.2. 4.4.2.测试
    5. 1.5. 5.Nacos集群和持久化
      1. 1.5.1. 5.1、持久化
        1. 1.5.1.1. 5.1.1、为什么要持久化?
        2. 1.5.1.2. 5.1.2、持久化步骤(切换数据库)
        3. 1.5.1.3. 5.1.2、初始化数据库
        4. 1.5.1.4. 5.1.3、测试
      2. 1.5.2. 5.2、集群
        1. 1.5.2.1. 5.2.1、部署架构图:
        2. 1.5.2.2. 5.2.2、节点规划
        3. 1.5.2.3. 5.3.3、集群搭建
      3. 1.5.3. 5.3、配置代理服务
        1. 1.5.3.1. 5.3.1、安装nginx
        2. 1.5.3.2. 5.3.2.配置nginx代理nacos
      4. 1.5.4. 5.4.测试
    6. 1.6. 6、Nacos开机自启
      1. 1.6.1. 6.1、添加开机自启动文件
      2. 1.6.2. 6.2、修改nacos的startup.sh
      3. 1.6.3. 6.3、设置开机自启

Nacos 注册中心和配置中心

1、Nacos简介

Nacos:Dynamic Naming and Configuration Service

前四个字母分别为Namic和Configuration的前两个字母,最后的s为Service。

1.1、Nacos是什么

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,是注册中心+配置中心的组合。

作用:1.替代Eureka做服务注册中心

​ 2.替代Config做服务配置中心

2、Nacos安装

[root@localhost ~]# cd /usr/upload
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
  • 启动和关闭:
# 启动
[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
# 关闭
[root@localhost bin]# ./shutdown.sh

3、Nacos注册中心(存放服务的ip和port)

注册中心主要有三部分组成:

  • Nacos-Server:注册中心 ———— 提供服务的注册和发现
  • Nacos-Provider:服务提供方 ———— 把自身的服务实例注册到 Nacos Server 中
  • Nacos-Consumer:服务调用方 ———— 通过Nacos Server获取服务列表,消费服务

3.1、创建服务提供者:nacos_provider

pom.xml

<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml

spring:
cloud:
nacos:
discovery:
server-addr: 192.168.150.132:8848
application:
name: nacos-provider

NacosProviderApp

@SpringBootApplication
@EnableDiscoveryClient //注册自己并发现其他服务
public class NacosProviderApp {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApp.class, args);
}
}

测试:

3.2、创建服务消费者:nacos_consumer

pom.xml

<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml

server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.150.132:8848 #注册中心的地址
application:
name: nacos-consumer #注册到nacos的服务名

NacosConsumerApp

@SpringBootApplication
@EnableDiscoveryClient //注册自己并发现其他服务
public class NacosConsumerApp {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class, args);
}
}

controller

@RestController
@RequestMapping("/consumer")
public class UserController {

@Autowired
private RestTemplate restTemplate;
//springcloud提供的工具类,作用:发现服务
@Autowired
private DiscoveryClient discoveryClient;

@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
//获得所有的服务名
List<String> serviceList = discoveryClient.getServices();
for (String serviceName : serviceList) {
System.out.println(serviceName);
}

//调用nacos_provider服务
//缺点:1、ip和port硬编码 2、不能实现负载均衡
ServiceInstance service = discoveryClient.getInstances("nacos-provider").get(0);
String url = "http://"+ service.getHost() +":"+ service.getPort() +"/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);
}
}

测试:

4、nacos配置中心(存放配制文件)

4.1、新增工程

创建nacos_config

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">
<parent>
<artifactId>springcloud_parent</artifactId>
<groupId>com.code</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>nacos_config</artifactId>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<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>
</project>

bootstrap.yml

  • bootstrap.ymlapplicaton.yml 优先加载,应用于系统级别参数配置,一般不会变动;
  • application.yml应用于SpringBoot项目的自动化配置

注:客户端配置文件的名称必须为bootstrap.yml

spring:
cloud:
nacos:
config:
server-addr: 192.168.150.132:8848 #注册中心的地址#配置文件的前缀
prefix: nacos-config #配置文件的前缀,默认是spring.application.name
file-extension: yaml #配置文件的后缀,默认是properties

NacosConfigApp

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApp.class);
}
}

controller

@RestController
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
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;
@Value("${spring.datasource.type}")
private String type;

@GetMapping("/config/info")
public String getConfigInfo() {
System.out.println(this);
String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
+password+"<br>"+type;
return configInfo;
}
}

4.2、在nacos中新建配置文件

配置内容:

server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.150.132:8848 #注册中心的地址
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.150.130:3306/ican?characterEncoding=UTF-8
username: root
password: 5555
type: com.alibaba.druid.pool.DruidDataSource
application:
name: nacos-config #注册到nacos的服务名

测试:

  1. 启动时加载配置文件

  2. 修改配置文件后nacos监听到MD5有变化则推送消息给客户端,客户端收到消息后会拉取最新配置(参考配置管理->监听查询菜单)

3.浏览器访问:http://127.0.0.1:8081/config/info

4.3、配置隔离

4.3.1、Nacos配置管理模型

通过Namespace、group、Data ID能够定位到一个配置集。

  • Namespace: 代表不同的环境的配置隔离, 如: 开发、测试、生产等
  • Group: 代表某个项目, 如XX医疗项目, XX电商项目
  • DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件

  • 获取配置集需要指定:

    1. nacos服务地址,必须指定

    2. namespace,如不指定默认public

    3. group,如不指定默认DEFAULT_GROUP

    4. dataId,必须指定

4.3.2、namespace隔离

命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。

1.新建namespace

建立好所有namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace的选项卡,如下图:

2.克隆配置文件

点击左下角克隆按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace。

3.读取配置文件
spring:
cloud:
nacos:
config:
server-addr: 192.168.204.129:8848
file-extension: yaml
prefix: nacos-config
namespace: a66ca122-fb24-46ba-bde0-58508c2d6689 #开发环境

4.3.3、group隔离

1.新建配置文件

新建配置文件并修改Group名

不同的配置分组下可以有相同的配置

2.读取配置文件
spring:
cloud:
nacos:
config:
server-addr: 192.168.150.132:8848 #注册中心的地址#配置文件的前缀
prefix: nacos-config #配置文件的前缀,默认是spring.application.name
file-extension: yaml #配置文件的后缀,默认是properties
namespace: test
group: NACOS_GROUP #nacos项目

4.4.服务隔离

4.4.1.修改配置文件

server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.150.132:8848 #注册中心的地址
namespace: test
group: nacos_group
application:
name: nacos-consumer #注册到nacos的服务名

4.4.2.测试

5.Nacos集群和持久化

5.1、持久化

5.1.1、为什么要持久化?

nacos默认使用自带的嵌入式数据库derby,集群模式下会导致每台nacos的配置文件不一样

5.1.2、持久化步骤(切换数据库)

修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)

### 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.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1111

5.1.2、初始化数据库

创建nacos数据库并导入sql

5.1.3、测试

重启nacos测试nacos所有写到嵌入式数据库的数据是否都写到了mysql:

5.2、集群

5.2.1、部署架构图:

5.2.2、节点规划

节点 端口
192.168.150.132 8848
192.168.150.132 8849
192.168.150.132 8850

5.3.3、集群搭建

3台原因:投票超过半数
投票原因:选leader
选leader:同步数据

  1. 找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,并将内容改为如下:
# ip:port
192.168.150.132:8848
192.168.150.132:8849
192.168.150.132:8850
  1. 复制三份Nacos
[root@localhost bin]# cd /usr/local
[root@localhost java]# mkdir nacos_cluster
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8850
  1. conf/application.properties 中的端口号分别改为:
server.port=8848
server.port=8849
server.port=8850

5.3、配置代理服务

5.3.1、安装nginx

  • 安装nginx的依赖库
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
  • 下载nginx
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

注意:./configure配置nginx安装到/usr/java/nginx目录下

  • 编译并安装
make && make install

5.3.2.配置nginx代理nacos

upstream nacosList {
192.168.150.132:8848
192.168.150.132:8849
192.168.150.132:8850
}

server {
listen 80;
server_name localhost;
location / {
proxy_pass http://nacosList;
}
}

5.4.测试

1.启动nacos集群(把虚拟机内存调至3g)

[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh

2.启动nginx

[root@localhost nginx]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx

3.将微服务注册到Nacos集群

4.访问nacos集群

启动nacos-config服务,并通过nginx访问nacos集群:http://192.168.150.132/nacos

6、Nacos开机自启

6.1、添加开机自启动文件

vim /lib/systemd/system/nacos.service:

nacos.service文件内容:

[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

6.2、修改nacos的startup.sh

修改JAVA_HOME路径

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191 

注销JAVA_HOME路径下面的3行配置

#[ ! -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

6.3、设置开机自启

systemctl daemon-reload #重新加载开机启动脚本
systemctl start nacos.service #开启nacos
systemctl stop nacos.service #停止nacos
systemctl status nacos.service #查看状态
systemctl enable nacos.service #设置开机启动