学习目标
-
nacos是什么
-
nacos的作用
-
nacos-server部署
-
nacos集成springboot
-
nacos集成springcloud
-
nacos常用api的使用
-
nacos集群部署
第1章 概述
官网:home
1.1 Nacos是什么
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
上面这段话就是官网给的解释,实际上说白了,Nacos就是一个做注册中心的和配置中心的。
1.2 Nacos架构
Nacos的整体架构还是比较清晰的,我们可以从下面这个官方提供的架构图进行简单分析。
事实上Nacos就是一个springboot的web项目,它提供了注册和配置的相关核心功能,然后对外暴露了各种接口;我相信做过javaweb开发的同学都知道,怎么对外提供接口呢?无非就是通过controller层暴露一些RequestMapping嘛,这点,咱们可以通过源码去验证。
nacos具体暴露哪些接口调用可以参考:Open API 指南。
到这一步,我们大概明白了nacos的架构了,但是有一个问题,虽然nacos提供了各种接口,但是我们要使用它的话,不能我们自己去封装各种http调用工具去调用它的接口吧?如果是要我们自己通过业务代码去封装工具的话,那nacos的价值也不会很高,所以,为了让我们使用起来更加方便,nacos的设计者肯定是要帮我们做一些事情的,这个时候nacos就分为了两个模块:nacos-server(主要提供注册和配置的核心功能)和nacos-client端(这里面实际上就是封装了http调用的一些工具,让使用者不需要自己去封装,只要调用方法就好了)。
nacos-client封装了哪些方法可以参考:Java SDK。
到这一步,事实上还是不够,我们一起来想想,虽然nacos-client端给我们封装了工具,但是我业务代码还是得去手动调用这些方法,还是对我的业务代码有侵入性,这样的话还是不够简洁。这个时候怎么办呢?我们会想到springboot的自动装配,通过springboot去帮我们完成对象的实例化,然后在适当的时机自动帮我们调用核心api。
这个时候好事之人帮我们对nacos-client包又进行了封装,有注册的jar包:nacos-discovery-spring-boot-starter和配置的jar包:nacos-config-spring-boot-starter,但是事实上这两个jar包功能还不够强大,因为无法做到自动注册,而且动态刷新配置的时候需要加一些注解,那好事之人又出现了,对nacos-client做了更进一步封装:spring-cloud-starter-alibaba-nacos-discovery和spring-cloud-starter-alibaba-nacos-config。后面会具体介绍如何使用。
第2章 Nacos应用
2.1 Nacos-server启动
我们需要先启动Nacos服务,启动服务有两种方式,一种是直接下载已经编译好的包直接运行。另一种是通过源码来构建。
2.1.1 直接启动
上传到服务器 cd /usr/local/eclipse2019
解压:tar -zxvf nacos-server-1.4.2.tar.gz
进入/usr/local/eclipse2019/nacos/bin目录下执行
./startup.sh -m standalone或sh startup.sh -m standalone 命令启动单机模式nacos
关闭firewall:systemctl stop firewalld.service
禁止firewall开机启动:systemctl disable firewalld.service
nacos设置开机自启动
1.添加nacos.service文件
vim /lib/systemd/system/nacos.service
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
Environment=“JAVA_HOME=/usr/local/eclipse2019/java"
ExecStart=/usr/local/eclipse2019/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/eclipse2019/nacos/bin/shutdown.sh
ExecStop=/usr/local/eclipse2019/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2.加入nacos服务
systemctl daemon-reload
3.设置开机自启
systemctl enable nacos.service
4.查看该service是否开机启用
systemctl is-enabled nacos.service
5.启动nacos服务和关闭服务
systemctl start nacos.service
systemctl stop nacos.service
6.查看该服务状态
systemctl status nacos.service
如果开启自启报which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
错误,解决方案:
vim /usr/local/eclipse2019/nacos/bin/startup.sh
JAVA_HOME=/usr/local/eclipse2019/java
2.1.2 docker启动
Nacos也可以直接通过docker安装。
docker run -d --name nacos-server-8848 -p 8848:8848 --privileged=true --network=host -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /opt/nacos/logs:/home/nacos/logs --restart=always -e MODE=standalone -e PREFER_HOST_MODE=hostname nacos/nacos-server:1.1.0
开放8848端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload #重启firewall
2.1.3 基于源码构建
1)从GitHub上下载源码
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos clean install -U
ls -al distribution/target/
cd distribution/target/nacos-server-$version/nacos/bin
2)启动服务
linux系统下: sh startup.sh -m standalone
window系统: cmd startup.cmd
3)如果是源码启动
-
下载源码到本地,然后通过ideal打开:
-
如果编译nacos源码失败com.alibaba.nacos.consistency.entity
-
下载Release Protocol Buffers v3.16.0 · protocolbuffers/protobuf · GitHub
-
在Path中添加D:\Program Files\protoc-3.16.0-win64\bin
-
进入到源码的这个consistency/src/main/proto/路径下,使用cmd命令,运行如下指令
protoc --java_out=../java/ ./consistency.proto
protoc --java_out=../java/ ./Data.proto
命令执行完,就能编译成功了
-
-
进入到console包下修改配置文件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.8.74:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=123456
-
添加启动配置
-
然后执行main方法
2.1.4 访问nacos
默认的帐号密码是:nacos/nacos
2.2 Nacos-client应用
2.2.1 集成springboot
2.2.1.1 动态配置
官方提供代码案例见nacos-spring-boot-example/nacos-spring-boot-config-example
下面我们自己实现一下
-
创建spring boot应用
-
添加nacos配置中心的依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>springboot-eclipse2019-nacos-config</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-eclipse2019-nacos-config</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.7</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
创建一个controller作为测试
@RestController @NacosPropertySource(dataId = "example-dev.properties",autoRefreshed = true) public class TestController { @NacosValue(value="${eclipse2019:woman}",autoRefreshed = true) private String eclipse2019; @GetMapping("/get") public String get(){ return "eclipse2019是个"+eclipse2019; } }
-
修改application.properties文件
nacos.config.server-addr=192.168.8.74:8848
2.2.1.2 注册中心
官方提供代码案例见nacos-spring-boot-example/nacos-spring-boot-discovery-example
springboot集成nacos自身没有提供自动注册的api,需要手动实现
-
简单注册实现
-
添加jar包依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>springboot-eclipse2019-nacos-discovery</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-eclipse2019-nacos-discovery</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-discovery-spring-boot-starter</artifactId> <version>0.2.7</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
创建一个测试类,用户返回当前nacos服务器上注册的服务列表
@RestController public class ServiceController { @NacosInjected private NamingService namingService; @GetMapping("/discovery") public List<Instance> get(@RequestParam String serviceName) throws NacosException { return namingService.getAllInstances(serviceName); } @PostMapping("/registry") public void registry(@RequestBody RegistryInstance registryInstance) throws NacosException { namingService.registerInstance(registryInstance.getSeriveName(),registryInstance.getIp(), registryInstance.getPort(),registryInstance.getGroupName()); } }
-
修改application.properties文件
nacos.discovery.server-addr=192.168.8.74:8848
-
先调用registry这个接口,向nacos注册服务
-
再访问 http://localhost:8080/discovery?serviceName=example 获取指定服务的实例信息
-
也可以通过直接调用nacos server的服务注册接口进行服务注册
http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080
-
-
自动注册实现
-
pom文件中增加
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.7</version> </dependency>
-
application.properties中添加以下配置
# springApplicationName spring.application.name=nacos-server # 应用端口以及地址 server.port=8088 server.ip=192.168.8.20 # nacos配置中心地址 nacos.config.server-addr=192.168.8.74:8848
-
然后在项目中增加配置类
@Configuration @NacosPropertySource(dataId = "springboot-eclipse2019-nacos-discovery",autoRefreshed = true) public class NacosConfig { @Value("${server.port}") private int serverPort; @Value("${server.ip}") private String ip; @Value("${spring.application.name}") private String applicationName; @NacosInjected private NamingService namingService; /** * 开机自动注册服务 * * @throws NacosException */ @PostConstruct public void registerInstance() throws NacosException { namingService.registerInstance(applicationName, ip, serverPort); } }
这种方式不够友好,会存在bean实例化的时候去注册服务,但是此时服务并不一定百分百启动成功。所以自动注册还可以通过下面这种方式
-
通过事件监听的方式实现自动注册
@Component public class AutoReigsterDemo implements ApplicationListener { @Value("${server.port}") private int serverPort; @Value("${server.ip}") private String ip; @Value("${spring.application.name}") private String applicationName; @NacosInjected private NamingService namingService; @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { try { namingService.registerInstance(applicationName, ip, serverPort); } catch (NacosException e) { e.printStackTrace(); } } }
-
2.2.2 集成springcloud
2.2.2.1 注册中心
接下来,我们通过一个案例来演示一下spring cloud alibaba下使用nacos实现配置中心以及服务注册的功能。
官方代码见nacos-examples-master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example
下面我们自己实现一下
-
maven父工程
springcloud-eclipse2019-nacos-discovery
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> <spring-boot.version>2.2.5.RELEASE</spring-boot.version> </properties> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>nacos-api</module> <module>nacos-provider</module> <module>nacos-consumer</module> </modules> <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>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
-
接口端
创建maven的quickstart项目,nacos-api
-
pom文件替换
<parent> <groupId>com.example</groupId> <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>nacos-api</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign-core</artifactId> <version>2.0.0.RELEASE</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </pluginManagement> </build>
-
创建接口UserService
public interface UserService { @GetMapping("/users") String users(); @PostMapping("/user") String insert(@RequestBody UserDto userDto); }
-
创建UserDto
public class UserDto { private String name; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
-
创建UserServiceClient
@FeignClient("nacos-provider")//这里要跟服务提供端注册的名字一样 public interface UserServiceClient extends UserService { }
-
-
服务提供端
创建springboot项目nacos-provider
- 替换pom
<parent> <groupId>com.example</groupId> <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>nacos-provider</artifactId> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>nacos-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
- 创建接口实现类
@RestController public class UserServiceImpl implements UserService { @Value("${server.port}") private int port; @Override public String users() { return "获取"+port+"端口上的user成功"; } @Override public String insert(UserDto userDto) { return port+"端口上:"+userDto.getName()+","+ userDto.getAge()+","+userDto.getSex()+"插入成功"; } }
- 启动类增加注解
@SpringBootApplication @EnableDiscoveryClient public class NacosProviderApplication { public static void main(String[] args) { SpringApplication.run(NacosProviderApplication.class, args); } }
- 配置文件
spring.application.name=nacos-provider server.port=8088 spring.cloud.nacos.discovery.server-addr=192.168.8.74:8848 # 注册到 nacos 的指定 namespace,默认为 public #spring.cloud.nacos.discovery.namespace=dbaf147f-cf53-4d0b-8b17-d4313c17beb9
- 替换pom
-
服务消费端
-
创建springboot项目nacos-consumer
-
替换pom
<parent> <groupId>com.example</groupId> <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>nacos-consumer</artifactId> <properties> <spring-cloud-openfeign.version>2.0.0.RELEASE</spring-cloud-openfeign.version> <spring-cloud-netflix.version>2.0.0.RELEASE</spring-cloud-netflix.version> </properties> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>nacos-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>${spring-cloud-netflix.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>${spring-cloud-openfeign.version}</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
-
创建controller
@RestController public class TestController { @Autowired UserServiceClient userServiceClient; @GetMapping("/user") public String users(){ int a = 0; return userServiceClient.users(); } @PostMapping("/user") public String user(@RequestBody UserDto userDto){ return userServiceClient.insert(userDto); } }
-
启动类增加注解
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients(basePackages = "com.example.clients")//这里的地址要跟api中的client地址一样 public class NacosConsumerApplication { public static void main(String[] args) { SpringApplication.run(NacosConsumerApplication.class, args); } }
-
配置文件
spring.application.name=nacos-consumer server.port=8080 spring.cloud.nacos.discovery.server-addr=192.168.8.74:8848
-
2.2.2.2 配置中心
在Nacos中,实现动态配置管理,相对于Spring Cloud中的Config来说,友好太多了,先给大家简单演示一下
代码见nacos-examples-master/nacos-spring-cloud-example/nacos-spring-cloud-config-example
下面我们自己实现一下
springcloud-eclipse2019-nacos-config
-
配置pom
<modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>springcloud-eclipse2019-nacos-config</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud-eclipse2019-nacos-config</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </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> <version>2.2.1.RELEASE</version> </dependency> </dependencies>
-
bootstrap.properties
spring.cloud.nacos.config.server-addr=192.168.8.74:8848 spring.application.name=nacos-config
需要注意,配置中心的ip,需要放在bootstrap.properties文件中,因为需要保证优先级。
-
TestController
@RestController @RequestMapping("/config") @RefreshScope public class TestController { @Value("${eclipse2019:girl}") private String eclipse2019; @RequestMapping("/get") public String get(){ return eclipse2019; } }
-
测试过程
-
启动服务,访问http://localhost:8080/config/get,浏览器会显示eclipse2019的默认值,因为这个时候nacos还没有配置eclipse2019的key
-
进入控制台,增加配置,dataid=nacos-config.properties,group=default_group, 并且增加 eclipse2019= xx的value属性 再次刷新url,就可以读取到值的变化
-
-
关于Nacos Config配置解释
在 Nacos Spring Cloud 中, dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
-
prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix 来配置。
-
spring.profiles.active 即为当前环境对应的 profile,详情可以参考 。 注意:当spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
-
file-exetension 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
-
2.3 Nacos的集群搭建
5分钟
在前面的课程讲解过程中,我们部署的Nacos是一个standalone的模式。Nacos是可以支持集群部署的,我们可以配置三台服务器做一个简单的测试
2.3.1 环境准备
准备三台服务器
-
192.168.8.74
-
192.168.8.75
-
192.168.8.76
2.3.2 下载编译好的包
https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
2.3.3 配置数据源
需要注意的是,Nacos默认采用的是一个derby的内置数据库,在实际过程中,不建议使用这种数据源。建议采用高可用数据库,比如我们使用mysql构建主从。
那我们可以使用mysql作为数据源来进行服务的配置。
导入mysql数据库脚本
每台nacos服务都连各自的数据库
/*
* 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');
修改nacos中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://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=nacos
db.password=nacos
2.3.4 启动nacos服务
启动nacos服务之前,需要配置集群
在nacos/conf目录下,有一个cluster.conf配置文件,在这个配置文件中配置这三个节点的ip和端口
192.168.8.74:8848
192.168.8.75:8848
192.168.8.76:8848
三种不同启动方式命令
外部数据源
#我们使用的外部数据源,所以用这个命令启动,三台服务器都需要启动
sh startup.sh
内存数据源
sh startup.sh -p embedded
当然,Nacos也可以支持单机运行
sh startup.sh -m standalone
2.4 Nacos server监控
2.4.1 Prometheus
Prometheus是一个开源的监控系统,起源于SoundCloud。它由以下几个核心组件构成:
-
数据爬虫:根据配置的时间定期的通过HTTP抓去metrics数据。
-
time-series 数据库:存储所有的metrics数据。
-
简单的用户交互接口:可视化、查询和监控所有的metrics。
2.4.2 Grafana
Grafana使你能够把来自不同数据源比如Elasticsearch, Prometheus, Graphite, influxDB等多样的数据以绚丽的图标展示出来。
它也能基于你的metrics数据发出告警。当一个告警状态改变时,它能通知你通过email,slack或者其他途径。
值得注意的是,Prometheus仪表盘也有简单的图标。但是Grafana的图表表现的更好。这也是为什么,我们需要整合Grafana和Pormetheus来可视化metrics数据。
2.4.3 Nacos server接入到监控
-
修改${NACOS_HOME}/conf/application.properties
-
访问这个地址: http://192.168.216.128:8848/nacos/actuator/prometheus 可以看到服务监控信息
修改prometheus.yml,添加Nacos的采集任务
-
修改prometheus.yml
- job_name: 'nacos' metrics_path: '/nacos/actuator/prometheus' static_configs: - targets: ["192.168.216.128:8848","192.168.216.129:8848","192.168.216.130:8848"]
-
job_name:任务名称
-
metrics_path: 指标路径
-
targets:实例地址/项目地址,可配置多个
-
scrape_interval: 多久采集一次
-
scrape_timeout: 采集超时时间
-
-
启动prometheus服务
./prometheus --config.file="prometheus.yml" [root@localhost prometheus-2.17.1.linux-amd64]# nohup ./prometheus --config.file=prometheus.yml --web.enable-lifecycle > prometheus.log 2>&1 &
-
访问:http://192.168.216.128:9090/
-
在搜索栏中搜索 nacos_monitor,如果可以看到nacos的数据,说明采集成功
-
在status菜单的service discovery中,可以看到nacos这个job
-
2.4.4 采用grafana图形化展示metrics数据
-
下载Grafana:Download Grafana | Grafana Labs
wget https://dl.grafana.com/oss/release/grafana-7.0.3-1.x86_64.rpm sudo yum install grafana-7.0.3-1.x86_64.rpm
-
启动Grafana, service grafana-server start / $GRAFANA_HOME/bin/grafana-server
-
访问Grafana , http://localhost:3000 , 默认的帐号密码 admin/admin
-
菜单选择 Configuration -> Data Source -> Add Data Source -> 名字:prometheus
-
导入nacos的面板数据 .nacos-granfa.json
下文预告
-
Nacos中有哪几种节点,它们的区别是什么
-
Nacos作为注册中心用的是什么一致性协议,不同的节点分别用的是什么协议
-
Nacos中一致性协议有什么区别
-
Nacos配置中心用的是Push模型还是Pull模型又或者是其他的模型?
-
不同模型的区别及优劣
-
Nacos的节点是如何保证存活的
-
Nacos注册的流程
-
Nacos配置的流程