Nacos 学习笔记

1. Nacos是什么?

Nacos:注册中心配置中心的组件

功能点:动态服务发现服务配置服务元数据流量管理

高阶功能:Nacos实现 APCP 两种模式,可以通过配置来修改

实现协议:DistroRaft分布式共识 两种协议

版本:Nacos 2.x

2.0 :长连接

2.1 :项目结构优化、XDS协议插件

2.2 :流控插件、可观侧性抽象、配置加解密插件

2.3 :鉴权插件、多数据源插件、基本插件化

3.x :MESH支持

注意⚠️:Nacos 2.x的版本引入gRPC实现了长连接,性能上要远远高于Nacos1.x的版本,建议慢慢的转移到Nacos 2x版本

2.Nacos服务构建

Nacos 代码地址:https://github.com/alibaba/naocs.git

执行命令:git clone -b 2.0.0 https://github.com/alibaba/naocs.git

进入项目目录执行以下命令

mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

执行完以上命令之后,找到 distribution\target子目录中生成的是 nacos-server-2.0.0.zip以及nacos-server-2.0.0.tar.gz

解压到任意目录打开目录:nacos/bin 会有多个启动脚本

  • windows:startup.cmdshutdown.cmd
  • Liunx/Mac:startup.shshutdown.sh

单机版启动命令如下

./startup.sh -m standalone 

如果上述命令执行不成功,打开. Startup.sh 和 shutdown.sh 脚本

set ff = dos  ⨉
set ff = unix ⩗ 

启动成功监听端口:8848 上下文地址: /nacos

打开浏览器输入:http://localhost:8848/nacos

端口:由于 Nacos 2x版本引入了gRPC,它会额外占用其他三个端口

7848:实现Nacos集群通信,一致性选举,心跳检测等功能

8848:Nacos主端口,对外提供服务的Http端口

9848:客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求,该端口的配置为:主端口(8848)+ 1000 偏移量

9849:服务端gRPC请求服务端端口,用于服务间同步等,该端口的配置为:主端口 + 1001偏移量

注意⚠️:Nacos是作为内网的注册中心使用的,这个注册中心绝不能暴露在公网之中,也可以直接下载官方已经打包好的压缩包,以上仅仅是提供源码编译的步骤

地址:https://github.com/alibaba/nacos/releases

3.Nacos整合Mysql服务

1.数据库导入

  1. 创建数据库 :nacos
  2. 导入数据库脚本:/conf/nacos-mysql.sql,脚本如下
/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY,
	`password` varchar(500) NOT NULL,
	`enabled` boolean NOT NULL
);

CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL,
	`role` varchar(50) NOT NULL,
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

2.Nacos 配置

  1. 找到 Nacos Server 配置文件 application.properties
  2. 打开配置:
    1. 打开数据库配置开关:spring.datasource.platform=mysql
    2. 填写正确的数据库实例数量:db.num=[nums 实际数量]
  3. 配置自己的数据库连接账户及密码

3.Nacos领域模型

Nacos 学习笔记_第1张图片

Nacos 根据数据归类存储提供了不同的模型结构

模型概念 描述
命名空间(NameSpace) 对不同的应用环境进行隔离,例如:开发环境、测试环境、生产环境
分组(Group) 将若干个服务或配置集归位一组,推荐命名格式:“产品名_分组名称”
服务(Service) 指的就是具体的一种服务,例如:部门微服务
集群(Cluster) 是一个逻辑概念,可以区分不同的服务节点所处的网络环境
实例(Instance) 保存具体的微服务注册数据,每一个服务节点对应一个实例数据
配置数据ID(DataId) 自定义的配置数据集,推荐命名格式:“包名称.类名称(小写字母)”

4.配置数据管理

参考官方提供的代码代码示例

/*
* Demo for Nacos
* pom.xml
    
        com.alibaba.nacos
        nacos-client
        ${version}
    
*/
package com.alibaba.nacos.example;

import java.util.Properties;
import java.util.concurrent.Executor;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

/**
 * Config service example
 *
 * @author Nacos
 *
 */
public class ConfigExample {

	public static void main(String[] args) throws NacosException, InterruptedException {
		String serverAddr = "localhost";
		String dataId = "test.config";
		String group = "TEST_GROUP";
		Properties properties = new Properties();
		properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
		ConfigService configService = NacosFactory.createConfigService(properties);
		String content = configService.getConfig(dataId, group, 5000);
		System.out.println(content);
		configService.addListener(dataId, group, new Listener() {
			@Override
			public void receiveConfigInfo(String configInfo) {
				System.out.println("recieve:" + configInfo);
			}

			@Override
			public Executor getExecutor() {
				return null;
			}
		});

		boolean isPublishOk = configService.publishConfig(dataId, group, "content");
		System.out.println(isPublishOk);

		Thread.sleep(3000);
		content = configService.getConfig(dataId, group, 5000);
		System.out.println(content);

		boolean isRemoveOk = configService.removeConfig(dataId, group);
		System.out.println(isRemoveOk);
		Thread.sleep(3000);

		content = configService.getConfig(dataId, group, 5000);
		System.out.println(content);
		Thread.sleep(300000);

	}
}

编程步骤:

  1. 声明Nacos Server 地址
  2. 声明NameSpace
  3. 声明Group组名称
  4. 声明DataId
  5. NacosFactory.createConfigService(properties);

通过工厂创建出ConfigService配置对象实例,此为核心API,通过ConfigService可以直接获取配置文件当中的数据,通过使用ConfigService#getConfig()指定好DataId、Group即可获取配置的数据

ConfigService#addListener():可以实时的监听配置文件是否修改

ConfigService#publishConfig():发布一个新配置项

ConfigService#removeConfig():移除配置项

5.服务实例管理

Nacos 学习笔记_第2张图片

1.API服务注册编程开发步骤

参考官方代码示例

/* Refer to document: https://github.com/alibaba/nacos/blob/master/example/src/main/java/com/alibaba/nacos/example
*  pom.xml
    
        com.alibaba.nacos
        nacos-client
        ${latest.version}
    
*/
package com.alibaba.nacos.example;

import java.util.Properties;

import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.EventListener;
import com.alibaba.nacos.api.naming.listener.NamingEvent;

/**
 * @author nkorange
 */
public class NamingExample {

    public static void main(String[] args) throws NacosException {

        Properties properties = new Properties();
        properties.setProperty("serverAddr", System.getProperty("serverAddr"));
        properties.setProperty("namespace", System.getProperty("namespace"));

        NamingService naming = NamingFactory.createNamingService(properties);

        naming.registerInstance("testss", "11.11.11.11", 8888, "TEST1");

        naming.registerInstance("testss", "2.2.2.2", 9999, "DEFAULT");

        System.out.println(naming.getAllInstances("testss"));

        naming.deregisterInstance("testss", "2.2.2.2", 9999, "DEFAULT");

        System.out.println(naming.getAllInstances("testss"));

        naming.subscribe("testss", new EventListener() {
            @Override
            public void onEvent(Event event) {
                System.out.println(((NamingEvent)event).getServiceName());
                System.out.println(((NamingEvent)event).getInstances());
            }
        });
    }
}

编程步骤:

  1. 声明Nacos Server 地址
  2. 声明NameSpace
  3. 声明Group组名称
  4. 声明INSTANCE_ID
  5. NamingFactory.createNamingService(properties);

通过工厂创建出NamingService配置对象实例,此为核心API,通过NamingService可以直接注册服务,通过使用NamingService#registerInstance()指定好NAMESPACE、Group、IP、PORT 即可注册服务

NamingService#registerInstance():注册服务

NamingService#deregisterInstance():下线

注意事项:

Nacos 1.x版本中的心跳需要频繁 建立连接关闭连接,性能较低 Nacos 2.x版本为了解决这一短板引入了gRPC,心跳服务以长连接的方式来提高性能

2.SpringBoot使用

编程步骤:Nacos 2.x版本的使用需要两个配置文件 boostrap.yml application.yml文件;其中 Nacos Config 需要使用 bootstrap.yml文件。Nacos Server 需要使用application.yml

编写配置文件

# bootstrap.yml 将 nacos config的相关配置写在这里
spring:
	cloud:
		nacos:
			config:
				server-addr: localhost:8848
				namespace: xxx-xxxx-xxxx-xxx
				group: APPLICATION_GROUP 
				cluster-name:	 xxxxCluster

---
# application.yml 将 nacos server相关的配置写在这里
spring:
	application:
		name: APPLICATION_NAME
	cloud:
		nacos:
			discovery:
				service: ${spring.application.name}
				server-addr: localhost:8848
				namespace: xxx-xxxx-xxxx-xxx
				group: APPLICATION_GROUP 
				cluster-name:	 xxxxCluster
        metatdata: # 自定义的一些属性值,任意添加
        	version: 1.0
        	xxx: xxx

本地服务启动,即可观察控制台查看是否注册成功

观察服务注册成功,会有如下信息体现

Instance 对象就是服务的实例,其包含

字段名 描述
instanceId 实例ID
ip 提供服务的IP地址
port 提供服务实例的端口号
weight 权重,默认1.0
healthy 健康状态
enabled 服务的状态,启用/下线
ephemeral 瞬时节点
clusterName 集群名称(逻辑概念,机房标记)
serviceName 服务名称
metadata 服务注册时提供的元数据

以上内容为个人学习笔记,勿喷哈~

你可能感兴趣的:(微服务,学习,java)