Nacos
Table of Contents generated with DocToc (opens new window)
# Nacos
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2
3
4
5
6
7
8
9
10
11
Nacos 服务注册与配置中心首先需要引入spring-cloud-alibaba-dependencies依赖管理
# Nacos简介
# 为什么叫Nacos
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service
# 是什么
- 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
- Nacos:Dynamic Naming and Configuration Service,即注册中心与配置中心的组合
# 能干嘛
- 替代Eureka作为注册中心
- 替代Config作为配置中心
# 安装并运行Nacos
- 从GitHub下载nacos-server-2.1.2.zip,(.tar.gz是Linux的)
- 压解安装包,直接运行bin目录下的startup.cmd
- 命令运行成功后直接访问:http://localhost:8848/nacos
这里要注意,运行时需要增加命令参数-m standalone
,否则运行失败
startup.cmd -m standalone # 单机模式启动 因为默认是集群模式
# Nacos作为服务注册中心演示
# 服务提供者
新建cloudalibaba-provider-payment9001模块
# pom
前面的父pom中要加cloud alibaba的父依赖,这里子pom相较以前,删除eureka的依赖,增加nacos的依赖
<dependencies>
<!-- 通用的依赖-->
<dependency>
<groupId>com.zdk</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- nacos依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# yaml
yaml主要就是配置nacos注册中心地址和actuator监控管理
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001{
public static void main(String[] args){
SpringApplication.run(PaymentMain9001.class,args);
}
}
2
3
4
5
6
7
# Controller
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry, serverPort:"+serverPort+"\t id:"+id;
}
}
2
3
4
5
6
7
8
9
10
11
最后启动此9001服务,可以在nacos控制台中查看到服务注册情况
最后,为了演示后面的nacos负载均衡功能,参照9001再建一个9002模块,步骤不再赘述,启动后可以发现nacos控制台
nacos-payment-provider
服务实例数量已变为2
# 服务消费者
新建消费者模块cloudalibaba-consumer-nacos-order83
# pom
将provider的pom复制过来,新增
spring-cloud-starter-loadbanlacer
的依赖这里要注意,我是用的2021.0.4.0版本cloud alibaba的nacos-discovery包中,已经去除掉了loadbanlacer的依赖,所以不能再直接进行rest+服务名的调用,且不支持了负载均衡,所以这里要测试的话还需要再将loadbanlacer的包进行引入,并且记得注入RestTemplate时加上
@LoadBalanced
注解
<!-- nacos依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- loadbalancer依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2
3
4
5
6
7
8
9
10
# yaml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 用来在代码中获取provider服务地址
service-url:
nacos-user-service: http://nacos-payment-provider
2
3
4
5
6
7
8
9
10
11
12
13
14
15
主启动类不多赘述
因为这里使用到了ribbon,所以需要注入一个RestTemplate的Bean
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //必须加这个注解 才能使用服务名走注册中心进行rest调用
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2
3
4
5
6
7
8
# 业务类
@RestController
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serviceUrl;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(serviceUrl+"/payemnt/nacos/"+id, String.class);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
最后启动此消费者,nacos控制台出现它的信息即可
# 测试
三个服务均启动好,访问http://localhost:83/consumer/payment/nacos/1
我们可以发现对于两个provider,是轮询访问
这里其实就是引入一个负载均衡来测试注册中心,2021.1版本的nacos本身已不带有负载均衡
# 注册中心对比
nacos支持CP、AP模型的切换
nacos与其他注册中心特性对比
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP、AP均可 | AP | CP | / | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | / | Client Beat |
负载均衡 | 权重/DSL/metadata/CMDB | Ribbon | Fabio | RR | / |
雪崩保护 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS/UDP | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
Spring Cloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
# AP、CP切换
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,
如果不需要存储服务级别的信息且服务实例是通过racos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud和Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
可以通过下面的命令修改模式
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
# Nacos作为服务配置中心演示
# 基础配置
新建cloudalibaba-config-nacos-client3377
模块
# pom
依赖相较于前面的服务注册模块,除了保留discovery外,还要新增一个config依赖
<!-- nacos config依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2
3
4
5
# yaml
这里需要两个配置文件,一个是原来的
application.yaml
,另一个是bootstrap.yaml
。Nacos同SpringCloud-Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。 SpringBoot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
application.yaml
spring:
profiles:
active: dev # 表示开发环境
2
3
bootstrap.yaml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml # 指定在configServer上找yaml格式的文件
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377{
public static void main(String[] args){
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}
2
3
4
5
6
7
# Controller
@RestController
@RefreshScope //支持nacos的动态刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping(value = "/config/info")
public String getConfigInfo(){
return configInfo;
}
}
2
3
4
5
6
7
8
9
10
11
# 在Nacos中添加配置信息
# Nacos中的匹配规则
- Nacos中的DataId的组成格式以及与SpringBoot配置文件中的匹配规则
说明:之所以需要配置spring.application.name
,是因为它是构成Nacos管理配置dataId
字段的一部分。
在Nacos Spring Cloud中,dataId
的完整格式如下
#{prefix}-${spring.profile.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置spring.profile.active
即为当前环境对应的profile,详情参考Spring Boot文档。注意,当spring.profile.active
为空时,对应的连接符-也将不存在,dataId的拼接格式变为#{prefix}.${file-extension}
file-extension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置,目前只支持properties
和yaml
类型- 通过Spring Cloud原生注解
@RrefreshScope
实现配置自动更新
所以最后的公式:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 在nacos进行添加配置
# 测试
添加配置后,启动3377项目会发现启动报错,这篇文章指出了原因:
https://blog.csdn.net/wyz0923/article/details/118303072,即cloud2020版本后,已不会再自动先加载bootstrap.yaml
文件了,所以我们需要和在Spring Cloud Config中一样,手动添加上bootstrap的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2
3
4
调用接口获取配置文件测试正常
在nacos控制台进行配置修改,然后再次获取,发现已立刻刷新
# 分类配置
为了解决大型微服务项目中存在多个子项目,且每个子项目又有开发、测试、预发布、正式环境等环境,所需要的配置文件难以管理的问题,Nacos的配置中心采用Namespace+Group+DataId的设计
# 为什么这样设计?
此设计类似于java中的概念,即package名和类名
最外层的namespace是可以用于区分部署环境的,Group和DataId逻辑上区分两个目标对象
三者情况:
默认情况下:
Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT
Nacos默认的命名空间是public,Namespace主要用来实现隔离。 比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务;一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房, 这时就可以给杭州机房的Service微服务起一个集群名称(HZ) , 给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后是Instance,就是微服务的实例。
# 三种方案加载配置
# DataId方案
- 指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
- 默认空间+默认分组+新建dev和test啷个DataID
- 通过spring.profile.active设为dev或test实现多环境下配置文件的读取
由于先前已经新增了dev的配置文件,现在新增一个test即可
修改spring.profiles.active为test,访问配置测试接口:成功获取到
# Group方案
新建两个配置,配置的DataId都是nacos-config-client-info.yaml
,但是Group不相同,一个是DEV_GROUP
,一个是TEST_GROUP
,内容为:config:info:nacos-config-client-info.yaml,TEST(DEV)_GROUP
然后是对bootstrap.yaml进行配置,在spring.cloud.nacos.config下增加group属性,值即为新建的配置的group,然后application.yaml的spring.profiles.active改为info
在不同group下进行进行测试:
# Namespace方案
首先,新建命名空间
低版本的nacos中,命名空间id是不能自定义的,目前我使用的版本是可以自定义的,但我们还是先用它的自动生成即可
创建完命名空间后,回到配置列表,可以发现,可以选择我们刚才创建命名空间了
切换以后会发现没有配置
这个时候就可以创建配置了,在哪个空间下创建配置,这个配置就是属于这个命名空间的,与其他命名空间是隔离的,这里我们两个环境都创建一个配置
如何使其能够被访问到也和group的配置差不多:
对bootstrap.yaml进行配置,在spring.cloud.nacos.config下增加namespace属性,值为上面的命名空间ID,这样再结合上面的group配置、spring.profiles.active配置,即可访问配置文件,就不再进行测试了
# Nacos集群和持久化配置(重要)
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
# 将单体Nacos数据库迁移到MySQL
步骤:
首先先在MySQL中创建名为
nacos_config
的数据库然后导入nacos/conf/mysql-schema.sql文件
然后找到application.properties文件,在最后增加以下内容
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos_config?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 db.user.0=root db.password.0=root
1
2
3
4
5然后重新运行nacos,可以发现我们之前新建的配置全部消失了,说明切换成功
可以进行测试,现在新增一条配置,看看MySQL中的数据情况
# Linux版Nacos+MySQL生产环境配置
预计需要:一个nginx+3个nacos注册中心(因为要3个或以上nacos节点才能构成集群)+1一个MySQL
Linux版nacos server的包(tar.gz
后缀)的下载赘述,下面直接到集群配置步骤
# Linux安装步骤
首先将安装包上传到Linux服务器,我这里是
/usr/local/software/nacos/applicaion
,目录运行命令解压
tar -zxvf nacos-server-2.1.2.tar.gz
1
同级目录下就会出现一个名为nacos的文件夹,里面的内容和我们在win里面测试时的一样
# 集群配置步骤(重点)
# MySQL
首先是MySQL的准备,由于我虚拟机上的MySQL还是5.1的版本,这里就直接使用本机上的MySQL,步骤和上面一样,改一下
application.properties
spring.datasource.platform=mysql db.num=1 # 这里注意ip改一下就行 db.url.0=jdbc:mysql://192.168.0.110:3306/nacos_config?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 db.user.0=root db.password.0=root
1
2
3
4
5
6
这里启动nacos还遇到问题,即No Datasource set
,原因是我这里是虚拟机连接本机的MySQL,而本机MySQL没有设置远程连接的权限,所以需要设置一下,设置好以后重新连接一下即可
# 以下命令适用于MySQL8.0+
USE mysql; #一定要使用mysql表,因为授权只能在这个表里授权。
select host,user from user; #查看当前用户的权限表
update user set host='%' where user='root'; #修改权限
flush privileges; # 刷新权限
# 如果是8.0以下,使用以下语句
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
All : 表示所有操作,比如select,update,insert等操作
*.* :表示所有库的所有表(test.*则表示test库的所有表)。
root :表示授权的用户名。
% :表示可以从任意地方登录,如改成192.168.0.999,则表示只能从ip地址为192.168.0.999的机器登录
123456 :表示授权的用户名的密码。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# cluster.conf
这里要增加nacos的集群配置文件
cluster.conf
可以看到conf文件夹里有一个cluster.conf.example文件,我们将它copy一份,名为cluster.conf
cp cluster.conf.example cluster.conf
1
编辑cluster.conf
的内容:
192.168.0.112:3333
192.168.0.112:4444
192.168.0.112:5555
# ip是虚拟机的ip 后面的是nacos实例的端口
2
3
4
注意:这个ip不能是127.0.0.1,必须是Linux命令
hostname -I
能够识别的ip,执行这个命令后出现的第一个ip即是要填的ip
到这里cluster.conf已完成
# startup.sh脚本
这一步需要编辑nacos的启动脚本
startup.sh
,使它能够接受不同的启动端口
集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例。 命令: bash startup.sh -p 3333表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致。
#!/bin/bash
# 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.
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac
error_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -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
if [ -z "$JAVA_HOME" ]; then
if $darwin; then
if [ -x '/usr/libexec/java_home' ] ; then
export JAVA_HOME=`/usr/libexec/java_home`
elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
fi
else
JAVA_PATH=`dirname $(readlink -f $(which javac))`
if [ "x$JAVA_PATH" != "x" ]; then
export JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`
fi
fi
if [ -z "$JAVA_HOME" ]; then
error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!"
fi
fi
export SERVER="nacos-server"
export MODE="cluster"
export FUNCTION_MODE="all"
export MEMBER_LIST=""
export EMBEDDED_STORAGE=""
while getopts ":m:f:s:c:p:o:" opt
do
case $opt in
m)
MODE=$OPTARG;;
f)
FUNCTION_MODE=$OPTARG;;
s)
SERVER=$OPTARG;;
c)
MEMBER_LIST=$OPTARG;;
p)
EMBEDDED_STORAGE=$OPTARG;;
o)
PORT=$OPTARG;;
?)
echo "Unknown parameter"
exit 1;;
esac
done
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=`cd $(dirname $0)/..; pwd`
export CUSTOM_SEARCH_LOCATIONS=file:${BASE_DIR}/conf/
#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi
if [[ "${FUNCTION_MODE}" == "config" ]]; then
JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config"
elif [[ "${FUNCTION_MODE}" == "naming" ]]; then
JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming"
fi
JAVA_OPT="${JAVA_OPT} -Dnacos.member.list=${MEMBER_LIST}"
JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then
JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400"
else
JAVA_OPT_EXT_FIX="-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext"
JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
fi
JAVA_OPT="${JAVA_OPT} -Dloader.path=${BASE_DIR}/plugins,${BASE_DIR}/plugins/health,${BASE_DIR}/plugins/cmdb,${BASE_DIR}/plugins/selector"
JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}"
JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/target/${SERVER}.jar"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} --spring.config.additional-location=${CUSTOM_SEARCH_LOCATIONS}"
JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/nacos-logback.xml"
JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288"
if [ ! -d "${BASE_DIR}/logs" ]; then
mkdir ${BASE_DIR}/logs
fi
echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}"
if [[ "${MODE}" == "standalone" ]]; then
echo "nacos is starting with standalone"
else
echo "nacos is starting with cluster"
fi
# check the start.out log output file
if [ ! -f "${BASE_DIR}/logs/start.out" ]; then
touch "${BASE_DIR}/logs/start.out"
fi
# start
echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
if [[ "$JAVA_OPT_EXT_FIX" == "" ]]; then
nohup "$JAVA" -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
else
nohup "$JAVA" -Dserver.port=${PORT} "$JAVA_OPT_EXT_FIX" ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
fi
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
这里经过尝试 无论怎么都只能启动一个端口的实例,所以这里直接再拷贝两个nacos,分别启动startup.sh来启动集群
这是startcluster.sh
#!/bin/bash
bash /usr/local/software/nacos/application/nacos/bin/startup.sh -o 3333
bash /usr/local/software/nacos/application/nacos4444/bin/startup.sh -o 4444
bash /usr/local/software/nacos/application/nacos5555/bin/startup.sh -o 5555
2
3
4
5
这里还是需要将startup.sh修改为能够指定端口启动后,再copy出来
这是shutdowncluster.sh
#!/bin/bash
bash /usr/local/software/nacos/application/nacos/bin/shutdown.sh
bash /usr/local/software/nacos/application/nacos4444/bin/shutdown.sh
bash /usr/local/software/nacos/application/nacos5555/bin/shutdown.sh
2
3
4
5
执行startcluster.sh后,进入任意一个节点的console可以看到集群节点情况
也可以使用ps -ef|grep nacos|grep -v grep | wc -l
命令获取nacos的数量来查看
# nginx配置
编辑nginx的配置,由它作为负载均衡器
下载nginx
压解
tar -zxvf xxx.tar.gzr
安装gcc环境
yum install gcc-c++
安装pcre pcre-devel
yum install pcre pcre-devel
安装zlib
yum install zlib zlib-devel
安装openssl
yum install -y openssl openssl-devel
使用默认配置,在nginx根目录下执行3个命令
./configure make make install
1
2
3查找nginx安装目录
whereis nginx
- /usr/local/nginx
现在来修改nginx配置文件:
upstream cluster{
server 127.0.0.1:3333;
server 127.0.0.1:4444;
server 127.0.0.1:5555;
}
server {
listen 1111;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://cluster;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
主要是添加upstream,其中包含三个nacos实例的ip:端口;
然后是修改server监听的端口为1111,且修改location
location / { proxy_pass http://cluster; }
最后启动nginx:
- 进入/usr/local/nginx/sbin目录,运行命令
./nginx -c /usr/local/nginx/conf/nginx.conf
# 测试
到这里,3个nacos实例和nginx均已启动,我们通过nginx(1111端口)来访问nacos进行测试
访问:http://192.168.0.112:1111/nacos
,发现是可以进入到的
然后新增一个配置进行测试
# 测试注册功能
将9002payment服务注册进nacos集群进行测试:
server-addr: 192.168.0.112:1111
# nginx暴露
启动9002,查看控制台