
因最近要上微服务,采用spring-cloud-alibaba,组件如下:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
更多组件请参考 Roadmap。
最近先上Nacos,这里记录一下笔记。
官网:https://nacos.io/
GitHub:https://github.com/alibaba/nacos
DockerHub:https://hub.docker.com/r/nacos/nacos-server
Docker:https://github.com/nacos-group/nacos-docker
Nacos On Kubernetes:https://github.com/nacos-group/nacos-k8s
Nacos 简介
具体请参考:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
Kubernetes Service
gRPC & Dubbo RPC Service
Spring Cloud RESTful Service
Nacos 的关键特性包括:
关键特性
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
Nacos地图

Nacos生态圈

Nacos架构
https://nacos.io/zh-cn/docs/architecture.html
Nacos部署
环境说明:
- EC2主机Amazon Linux 2 AMI,本身是基于CentOS 7的。
- Oracle Java 1.8.0
- Nacos 1.1.4
前提依赖
依赖java环境:
最快速的方式yum安装openjdk:
$ sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
|
这里以Oracle Java为例:
下载:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
安装:
$ tar xf jdk-8u231-linux-x64.tar.gz -C /usr/local $ ln -s /usr/local/jdk1.8.0_231 /usr/local/java $ ll /usr/local/ total 0 drwxr-xr-x 1 root root 512 Nov 8 14:16 bin/ drwxr-xr-x 1 root root 512 May 21 2019 etc/ drwxr-xr-x 1 root root 512 May 21 2019 games/ drwxr-xr-x 1 root root 512 May 21 2019 include/ lrwxrwxrwx 1 root root 23 Dec 3 16:37 java -> /usr/local/jdk1.8.0_231/ drwxr-xr-x 1 uucp 143 512 Oct 5 18:13 jdk1.8.0_231/ drwxr-xr-x 1 root root 512 May 21 2019 lib/ lrwxrwxrwx 1 root root 9 May 21 2019 man -> share/man/ drwxr-xr-x 1 root root 512 May 21 2019 sbin/ drwxr-xr-x 1 root root 512 May 21 2019 share/ drwxr-xr-x 1 root root 512 May 21 2019 src/
|
配置环境变量:
$ sudo vim /etc/profile export JAVA_HOME=/usr/local/java export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
|
应用:
测试:
$ java -version java version "1.8.0_231" Java(TM) SE Runtime Environment (build 1.8.0_231-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
|
单机测试模式 - Derby DB
下载并安装Nacos:
地址:https://github.com/alibaba/nacos/releases
$ wget -c "https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz" $ tar xf nacos-server-1.1.4.tar.gz -C /usr/local $ mv /usr/local/nacos /usr/local/nacos-server-1.1.4 $ ln -s /usr/local/nacos-server-1.1.4 /usr/local/nacos
|
目录结构:
$ tree . ├── bin │ ├── shutdown.cmd │ ├── shutdown.sh │ ├── startup.cmd │ └── startup.sh ├── conf │ ├── application.properties │ ├── application.properties.example │ ├── cluster.conf.example │ ├── nacos-logback.xml │ ├── nacos-mysql.sql │ └── schema.sql ├── LICENSE ├── NOTICE └── target └── nacos-server.jar
3 directories, 13 files
|
配置
Nacos默认使用嵌入式数据库Derby,在单机测试默认下基本上无需任何的配置;如果所在机器有内网网卡和公网网卡的,建议配置Nacos使用的网卡和IP地址:
参考:https://nacos.io/zh-cn/docs/deployment.html
配置如下:
$ echo "nacos.inetutils.use-only-site-local-interfaces=true" >> /usr/local/nacos/config/application.properties
|
启动
$ cd /usr/local/nacos $ ./bin/startup.sh -m standalone
|
查看进程以及监听端口(默认:8848):
$ ps -ef|grep nacos microoak 25827 1 0 Nov19 ? 00:52:16 /usr/local/java/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Djava.ext.dirs=/usr/local/java/jre/lib/ext:/usr/local/java/lib/ext:/usr/local/nacos/plugins/cmdb:/usr/local/nacos/plugins/mysql -Xloggc:/usr/local/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dnacos.home=/opt/microoak/nacos -Dloader.path=/usr/local/nacos/plugins/health -jar /usr/local/nacos/target/nacos-server.jar --spring.config.location=classpath:/,classpath:/config/,file:./,file:./config/,file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 nacos.nacos
$ netstat -lnutp|grep 8848 tcp6 0 0 :::8848 :::* LISTEN 25827/java
|
此时的目录结构:
$ tree . ├── bin │ ├── shutdown.cmd │ ├── shutdown.sh │ ├── startup.cmd │ └── startup.sh ├── conf │ ├── application.properties │ ├── application.properties.example │ ├── cluster.conf.example │ ├── nacos-logback.xml │ ├── nacos-mysql.sql │ └── schema.sql ├── data │ ├── derby-data │ │ ├── dbex.lck │ │ ├── db.lck │ │ ├── log │ │ │ ├── log1.dat │ │ │ ├── log.ctrl │ │ │ ├── logmirror.ctrl │ │ │ └── README_DO_NOT_TOUCH_FILES.txt │ │ ├── README_DO_NOT_TOUCH_FILES.txt │ │ ├── seg0 │ │ │ ├── c101.dat │ │ │ ├── ...... │ │ │ ├── cf0.dat │ │ │ └── README_DO_NOT_TOUCH_FILES.txt │ │ ├── service.properties │ │ └── tmp │ └── naming │ ├── data │ └── meta.properties ├── derby.log ├── LICENSE ├── logs │ ├── access_log.2019-12-03.log │ ├── cmdb-main.log │ ├── config-client-request.log │ ├── config-dump.log │ ├── config-fatal.log │ ├── config-memory.log │ ├── config-notify.log │ ├── config-pull-check.log │ ├── config-pull.log │ ├── config-server.log │ ├── config-trace.log │ ├── istio-main.log │ ├── nacos-address.log │ ├── nacos_gc.log.0.current │ ├── nacos.log │ ├── naming-distro.log │ ├── naming-event.log │ ├── naming-performance.log │ ├── naming-push.log │ ├── naming-raft.log │ ├── naming-rt.log │ ├── naming-server.log │ └── start.out ├── NOTICE ├── target │ └── nacos-server.jar └── work └── Tomcat └── localhost └── nacos
15 directories, 165 files
|
单机测试模式 - Mysql DB
配置
在单机模式的时候也是可以使用Mysql的,配置如下:
nacos.inetutils.use-only-site-local-interfaces=true
spring.datasource.platform=mysql db.num=2 db.url.0=jdbc:mysql://x.x.x.x:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.url.1=jdbc:mysql://y.y.y.y:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos db.password=password
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://x.x.x.x:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos db.password=password
|
导入数据库
首先创建名称为:nacos的数据库:
CREATE DATABASE `nacos` DEFAULT CHARACTER SET utf8mb4;
|
创建用户,并授权给nacos数据库读写权限:
CREATE USER 'nacos'@'%' IDENTIFIED BY 'password'; # 创建账户nacos,密码password,可以从任意主机登陆。 GRANT ALL ON nacos.* TO 'nacos'@'%'; # 授权nacos用户能够对nacos数据库有所有权。
|
导入数据:
数据文件位置:config/nacos-mysql.sql
$ cd /usr/local/nacos/config $ mysql -hx.x.x.x -unacos -ppassword nacos < nacos-mysql.sql $ mysql -hx.x.x.x -unacos -ppassword nacos MySQL [nacos]> show tables; +----------------------+ | Tables_in_nacos | +----------------------+ | config_info | | config_info_aggr | | config_info_beta | | config_info_tag | | config_tags_relation | | group_capacity | | his_config_info | | roles | | tenant_capacity | | tenant_info | | users | +----------------------+ 11 rows in set (0.00 sec)
|
启动
启动方式同Derby数据库:
$ cd /usr/local/nacos $ ./bin/startup.sh -m standalone
|
此时的目录结构:
$ tree . ├── bin │ ├── shutdown.cmd │ ├── shutdown.sh │ ├── startup.cmd │ └── startup.sh ├── conf │ ├── application.properties │ ├── application.properties.example │ ├── cluster.conf.example │ ├── nacos-logback.xml │ ├── nacos-mysql.sql │ └── schema.sql ├── data │ └── naming │ ├── data │ └── meta.properties ├── derby.log ├── LICENSE ├── logs │ ├── access_log.2019-12-03.log │ ├── cmdb-main.log │ ├── config-client-request.log │ ├── config-dump.log │ ├── config-fatal.log │ ├── config-memory.log │ ├── config-notify.log │ ├── config-pull-check.log │ ├── config-pull.log │ ├── config-server.log │ ├── config-trace.log │ ├── istio-main.log │ ├── nacos-address.log │ ├── nacos_gc.log.0.current │ ├── nacos.log │ ├── naming-distro.log │ ├── naming-event.log │ ├── naming-performance.log │ ├── naming-push.log │ ├── naming-raft.log │ ├── naming-rt.log │ ├── naming-server.log │ └── start.out ├── NOTICE ├── target │ └── nacos-server.jar └── work └── Tomcat └── localhost └── nacos
11 directories, 38 files
|
高可用集群模式
环境说明:三台机器组成的Nacos集群
IP |
Nacos Port |
说明 |
172.16.30.18 |
8848 |
nacos 节点1 |
172.16.31.84 |
8848 |
nacos 节点2 |
172.16.32.40 |
8848 |
nacos 节点3 |
首先创建数据库所需:
同样的需要导入Mysql数据,参考 导入数据库,这里不再赘述,参考上方。
配置nacos
配置同 单机测试模式-Mysql DB 配置。
nacos.inetutils.use-only-site-local-interfaces=true
spring.datasource.platform=mysql db.num=2 db.url.0=jdbc:mysql://x.x.x.x:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.url.1=jdbc:mysql://y.y.y.y:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos db.password=password
|
编辑集群配置文件:cluster.conf
$ cd /usr/local/nacos $ cat > config/cluster.conf <<EOF 172.16.32.40:8848 172.16.31.84:8848 172.16.30.18:8848 EOF
|
好了,将配置好的两个配置文件cluster.conf
和 application.properties
拷贝到其他两台上。
配置Nacos JVM
配置地址:bin/startup.sh
默认的JVM配置:
- 单机模式:-Xms512m -Xmx512m -Xmn256m
- 集群模式:-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
编辑配置文件:bin/startup.sh
vim bin/startup.sh
if [[ "${MODE}" == "standalone" ]]; then JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m" JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true" else 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
|
启动Nacos集群
然后分别启动三个节点:注意启动方式,不再加参数。
$ cd /usr/local/nacos $ ./bin/startup.sh
|
最后配置LB,分别指向这三台Nacos,我这里是阿里云环境,直接创建SLB即可,自带健康检查。如果你是Bare-metal环境可以是:Lvs + Keepalived 或者 Nginx Http即可。
登陆Nacos Dashboard
默认端口:8848
地址:http://localhost:8848/nacos
默认用户名和密码都是:nacos
登陆:

nacos节点列表:

此时172.16.32.40:8848 为Leader节点,我们停掉它:再次查看节点列表:
此时会触发选举,另一台已经担任了Leader,集群还是可用状态:

然后在启动刚才停止的Nacos节点,查看Nacos节点列表:
因为Leader节点状态是正常的,所以呢,新加的Nacos节点以Follower状态加入集群中。

警告:
虽然访问Nacos Dashboard需要用户名和密码认证。但是当直接访问其OpenAPI接口是不需要认证的。
例如:查看当前集群Server节点列表:参考:
https://nacos.io/zh-cn/docs/open-api.html#2.15
$ curl http://x.x.x.x:8848/nacos/v1/ns/operator/servers
|
则直接输出如下,无需用户名和密码的认证。
{"servers":[{"ip":"172.16.30.18","servePort":8848,"site":"unknown","weight":1,"adWeight":0,"alive":false,"lastRefTime":0,"lastRefTimeStr":null,"key":"172.16.30.18:8848"},{"ip":"172.16.31.84","servePort":8848,"site":"unknown","weight":1,"adWeight":0,"alive":false,"lastRefTime":0,"lastRefTimeStr":null,"key":"172.16.31.84:8848"},{"ip":"172.16.32.40","servePort":8848,"site":"unknown","weight":1,"adWeight":0,"alive":false,"lastRefTime":0,"lastRefTimeStr":null,"key":"172.16.32.40:8848"}]}
|
例如:查看当前集群leader:参考:
https://nacos.io/zh-cn/docs/open-api.html#2.16
$ curl http://x.x.x.x:8848/nacos/v1/ns/raft/leader
|
直接输出如下:
{"leader":"{\"heartbeatDueMs\":3500,\"ip\":\"172.16.30.18:8848\",\"leaderDueMs\":14872,\"state\":\"LEADER\",\"term\":3,\"voteFor\":\"172.16.30.18:8848\"}"}
|
上面都是GET的,这里来个写的,POST方式,注册实例,参考:
https://nacos.io/zh-cn/docs/open-api.html#2.1
$ curl -XPOST 'http://x.x.x.x:8848/nacos/v1/ns/instance?serviceName=test&ip=8.8.8.8&port=53' ok
|
查看Dashboard:

点击上面test服务的详情:

是不是很恐怖,所以记得一定要通过Nginx或者其他工具将暴露出来的Dashboard加上Basic Auth认证。
本文到这里就结束了,欢迎期待后面的文章。您可以关注下方的公众号二维码,在第一时间查看新文章。
