简介
安装&配置nacos
安装
-
下载
wget https://github.com/alibaba/nacos/releases/download/2.0.0-BETA/nacos-server-2.0.0-BETA.zip
-
解压
unzip nacos-server-2.0.0-BETA.zip
cd nacos/bin
- 启动
- 单机模式
# Linux/Unix/Mac
sh startup.sh -m standalone
# ubuntu
bash startup.sh -m standalone
# windows
cmd startup.cmd -m standalone
- 集群模式
sh startup.sh
bash startup.sh
cmd startup.cmd
- 页面 默认端口是8848,访问 http://127.0.0.1:8848/nacos
默认用户名和密码都是 nacos,一般没什么问题就能正常访问该页面
- 数据持久化 默认nacos配置数据存储在自带的嵌入式数据库里,为了方便维护我们的配置数据,我把它存到了mysql,官方文档 nacos.io/zh-cn/docs/… 根据配置文件里的sql语句 nacos-mysql.sql 创建数据库和表后,按照如下语句连接到mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
这里mysql的高可用要注意下,否则会导致nacos及后续服务配置获取的异常
- 配置开机启动
- 新建文件
vim /lib/systemd/system/nacos.service
[Unit]
Description=nacos
After=network.target
[Service]
Environment="JAVA_HOME=xxx/jdk1.8.0_151"
Type=forking
# 注意这里是单机模式还是集群模式启动
ExecStart=xxx/nacos/nacos/bin/startup.sh -m standalone
ExecReload=xxx/nacos/nacos/bin/shutdown.sh
ExecStop=xxx/nacos/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
-
重载服务
systemctl daemon-reload
-
设置开机启动
systemctl enable nacos.service
-
查看该服务开机启动的状态
systemctl is-enabled nacos.service
-
启动服务
systemctl start nacos.service
- 查看该服务运行状态
systemctl status nacos.service
注意
Environment="JAVA_HOME=xxx/jdk1.8.0_151"
指定java环境,我这边出现了systemctl服务启动时找不到java,报如下错误,但是我命名配置了,那就指定下环境好了;另外在startup.sh里也配置下java_home为自己的路径
异常
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: readlink: missing operand
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: Try 'readlink --help' for more information.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: dirname: missing operand
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: Try 'dirname --help' for more information.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz startup.sh[1164]: ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! !!
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: nacos.service: control process exited, code=exited status=1
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: Failed to start nacos.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: Unit nacos.service entered failed state.
Mar 05 10:00:40 iz2ze70su5hanmrh2q4quuz systemd[1]: nacos.service failed.
配置startup.sh
...
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/xxx/jdk1.8.0_211
#[ ! -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
...
- 停止
systemctl stop nacos.service
配置
-
命名空间 默认有一个public保留空间,我这里建一个我用户名命名的空间,比如张三,空间的id如果自己不指定,会自动生成一个唯一id,如果想要这个id有意义,最好是自己指定,
-
配置中心 为了格里不同用户、不同环境的配置,我的空间按照用户 > 环境 > 项目的顺序来命名
这样来隔离不同用户、不同环境及不同项目的配置文件
nacos 集群部署后,统一把配置文件管理起来,方便后期维护
- 配置中心文件的配置
- 首先,在配置中心新建的配置文件中,比如 test-application-dev.yml
配置如下
server:
port: 8083
spring:
application:
name: test-application
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
group: DEV_GROUP
gateway:
discovery:
locator:
enabled: true
routes:
# 自定义的路由 ID,保持唯一
- id: test
# 目标服务地址
uri: http://www.baidu.com
# 组合成其他复杂的逻辑(比如:与,或,非)
predicates: # 断言(判断条件)
- Path=/api/**
# 监控
management:
endpoints:
web:
exposure:
include: "*"
- 配置自己的工程项目
- 为了在打包时区别不同的环境,在resource下新建bootstrap.yml文件和application.yml两个文件,其中bootstrap.yml的加载优先级要高于application.yml
- 配置bootstrap.yml
server:
port: ${server.port}
spring:
application:
name: @nacosAppName@
cloud:
nacos:
discovery:
server-addr: @nacosAddr@
namespace: @nacosNamespace@
group: @nacosGroup@
config:
server-addr: @nacosAddr@
prefix: ${spring.application.name}
file-extension: yml
namespace: @nacosNamespace@
group: @nacosGroup@
sentinel:
transport:
dashboard: @nacosAddr@
这里的参数根据pom里的动态获取,以在打包的时候区别了不同环境
- pom.xml
...
<!-- 环境信息 -->
<profiles>
<!-- 标记开发环境 -->
<profile>
<id>dev</id>
<properties>
<nacosAddr>localhost:8848</nacosAddr>
<nacosNamespace>f6cf53e2-4721-4866-9rdf-b65812e8227b</nacosNamespace>
<nacosAppName>test-gateway-dev</nacosAppName>
<nacosGroup>DEV_GROUP</nacosGroup>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<nacosAddr>localhost:8848</nacosAddr>
<nacosNamespace>f6cf53e2-4721-4866-9rdf-b65812e8227b</nacosNamespace>
<nacosAppName>test-application-test</nacosAppName>
<nacosGroup>TEST_GROUP</nacosGroup>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<nacosAddr>localhost:8848</nacosAddr>
<nacosNamespace>f6cf53e2-4721-4866-9rdf-b65812e8227b</nacosNamespace>
<nacosAppName>test-application-prod</nacosAppName>
<nacosGroup>PROD_GROUP</nacosGroup>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
...
以上,启动nacos服务,然后启动工程,一般就会读取到配置中文里的配置信息,并且上面已经配置了服务发现功能,所以在nacos上也能看见自动注册的服务了,简单的注册中心和配置中心大致为此。
顺便说说nacos springcloud和springboot版本的对应问题,工程用的springboot版本为2.4.1版本,但是nacos目前官方支持最高版本如下
github.com/alibaba/spr…
所以在引入的时候,刚开始版本对不上会有一些意想不到的问题,多次试验后,最终成功引入的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<!--监控模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.4.1</version>
</dependency>
<!--nacos 客户端 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos-discovery.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--该依赖不加,请求注册的微服务时会报503的错误-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.0.0</version>
</dependency>
<!--熔断和流控-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
安全问题
nacos 安全方面有问题,网上搜索一下有很多
所以nacos的8848端口不要暴露到公网环境了
【问题汇总】
nacos整合springcloud + gateway时,报错:
Whitelabel Error Page
This application has no configured error view, so you are seeing this as a fallback.
Thu Mar 04 11:14:50 CST 2021
[29ad555a-1] There was an unexpected error (type=Service Unavailable, status=503).
试了各种办法死活解决不了,一度怀疑人生,最终,在插电怀疑是版本问题的时候,在issues里发现了一个解决办法
github.com/alibaba/nac…
该问题解决。
主要是返回503后,没有其他任何有线索的日志了,完全不知道到底是哪里出了问题,还是因为自己对这一块不熟悉。想想也是,要实现客户端的负载均衡,比如@LoadBalanced
或者 lb://service_name
,必然需要引入相应的包