服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求; Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助用户根据健康状态管理服务的可用性及流量
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一些简单的 DNS APIs TODO 帮助用户管理服务的关联域名和可用的 IP:PORT 列表
Nacos 能让用户从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据
参考官方文档:https://nacos.io/zh-cn/docs/architecture.html
关于Nacos安装,可以直接参考 官网安装,以下基于Docker实现Nacos单机安装和基于Docker实现Nacos集群安装, 采用Docker-Compose安装Nacos要更方便
Nacos安装模式有多种:
#克隆项目
git clone https://github.com/nacos-group/nacos-docker.git
#进入nacos-docker目录
cd nacos-docker
#查看文件列表
ce example
ll
example中文件列表如下
可以看出nacos是基于SpringBoot开发的
docker-compose -f standalone-derby.yaml up -d
docker-compose命令格式: docker-compose up [options] [–scale SERVICE=NUM…] [SERVICE…]
Docker Compose 常用命令:参考文章
命令 | 含义 |
---|---|
build | 重新构建服务 |
-f | 使用特定的compose模板文件,默认为docker-compose.yml |
-d | 在后台运行服务容器 |
ps | 列出容器 |
up | 可以自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示正在运行的容器进程 |
logs | 查看服务容器的输出 |
logs | 查看服务容器的输出 |
stop/start/restart | 停止/启动/重启服务 |
安装完成后,可以直接访问它的控制台 http://192.168.200.200:8848/nacos,账号密码都是nacos,效果如下
#停掉容器
docker stop nacos-standalone
#删掉容器
docker rm nacos-standalone
#或者一步到位
docker-compose -f standalone-derby.yaml down
version: "2"
services:
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos-standalone-mysql
env_file:
- ../env/nacos-standlone-mysql.env
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9848:9848"
- "9555:9555"
depends_on:
- mysql
restart: on-failure
mysql:
container_name: mysql
image: nacos/nacos-mysql:5.7
env_file:
- ../env/mysql.env
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
docker-compose -f standalone-mysql-5.7.yaml up -d
据库脚本在nacos的nacos\config\src\main\resources\META-INF工程中有对应脚本,也可以通过下面的网址获取SQL:
https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META-INF/nacos-db.sql
注意: 启动的yaml文件要和数据库版本对应上
创建数据库nacos_config,并执行初始化操作,初始化脚本后,数据库数据如下:
至此结束
也可以直接采用Docker的方式安装Nacos,这样安装不要克隆项目也不需要修改配置文件,会更方便
docker pull nacos/nacos-server
mkdir -p /root/nacos/conf /root/nacos/logs
docker run -d \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-e JVM_XMS=512m \
-e JVM_XMX=512m \
-e JVM_XMN=256m \
-p 8858:8848 \
--restart=always \
--name nacos nacos/nacos-server
4)拷贝容器配置目录
docker cp nacos:/home/nacos/conf /root/nacos
5)编辑配置文件
vi /root/nacos/conf/application.properties
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# 默认当前工作目录
server.tomcat.basedir=file:.
#*************** 配置模块相关配置 ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
# spring.datasource.platform=mysql已经被spring.sql.init.platform=mysql替代
spring.sql.init.platform=mysql
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://192.168.200.200:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.user.0=root
db.password.0=root
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.enabled=true
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### 当nacos.core.auth.system.type=nacos生效
### 令牌过期(以秒为单位):
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### 默认token 需要自己设置, 有安全隐患
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345676901234567890123456785}
### 打开/关闭认证信息的缓存. 通过打开这个开关, 验证信息的更新将有15秒的延迟
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
# key和value自己设置 有安全隐患
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:wms}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:wms-security}
## spring security config
### 关闭安全
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
6)重新运行容器
# 停止容器
docker stop nacos
# 删除容器
docker rm nacos
# 挂在配置目录重新运行
docker run -d \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-e JVM_XMS=512m \
-e JVM_XMX=512m \
-e JVM_XMN=256m \
-v /root/nacos/conf:/home/nacos/conf \
-v /root/nacos/logs:/home/nacos/logs \
-p 8858:8848 \
--restart=always \
--name nacos nacos/nacos-server
注意:需要提取准备好msyql数据库, 兼容mysql8参考
Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware.
https://github.com/alibaba/spring-cloud-alibaba
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL,主页等-注册到 Nacos 。
关于SpringCloud Alibaba和SpringBoot的版本,我们可以通过 https://start.spring.io/actuator/info 查看
wiki 版本说明: github
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等
bootstrap.yml 先于 application.yml加载
添加如下配置:
spring:
application:
name: hailtaxi-gateway
cloud:
nacos:
discovery:
# nacos 服务注册地址
server-addr: 192.168.200.200:8848
config:
server-addr: 192.168.200.200:8848
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
如上图,如果此时用户打车成功,会调用订单服务,订单服务会修改司机状态,此时会调用hailtaxi-driver,如果是生产环境,每个节点一定是集群状态,比如有2个hailtaxi-driver节点
服务注册到Nacos中,有一个权重属性,这个权重属性就是Nacos的负载均衡机制,此时需要用到Nacos的负载均衡策略NacosRule,我们可以在程序中先初始化负载均衡算法,再到bootstrap.yml中配置权重
/***
* Nacos负载均衡算法
* @return
*/
@Bean
@Scope(value="prototype") //注意不要单例 https://github.com/alibaba/spring-cloud-alibaba/issues/1184
public IRule loadBalanceRule(){
return new NacosRule();
}
2)在nacos控制台设置服务权重
注意:如果hailtaxi-order模块通过openfeign调用超时,可以设置它的超时时间
由于openfeign底层默认使用的是ribbon,故可以采用如下配置:
ribbon:
# 处理请求的超时时间
ReadTimeout: 5000
# 连接建立的超时时长
ConnectTimeout: 5000
如果我们把算法NacosRule注释,默认就是和Ribbon集成,且默认开启,可以通过如下配置实现关闭或开启:
ribbon:
nacos:
enabled: true
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,可以在 Nacos Server 集中管理 Spring Cloud 应用的外部属性配置
spring:
application:
name: hailtaxi-driver
cloud:
nacos:
discovery:
# nacos 服务注册地址
server-addr: 192.168.200.200:8848
# 指定命名空间的id
namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
config:
server-addr: 192.168.200.200:8848
# 指定命名空间的id
namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
# 如果将配置信息保存到nacos,指定配置文件扩展名
file-extension: yaml
# nacos config dataid name 默认加载 ${spring.application.name}.${file-extension},也可指定
#name: hailtaxi-driver.yaml
参考:官网
Data ID:默认加载 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension}
另外对于web服务的端口server.port 和application.name等不变内容一般留在application.yml中
spring-cloud-starter-alibaba-nacos-config在加载配置的时候,不仅仅加载以 dataid 为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 为前缀的基础配置,还加载dataid为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties} 的基础配置
在nacos中创建hailtaxi-driver-dev.yaml作为开发环节的配置,创建hailtaxi-driver-test.yaml作为测试环境的配置文件,创建如下:
hailtaxi-driver-dev.yaml
这样多出来两份配置信息如下:
在实际的业务场景中应用和共享配置间的关系可能,Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置,通过它可以解决配置共享问题
spring:
application:
name: hailtaxi-driver
profiles:
# 激活 dev 配置
active: dev
cloud:
nacos:
discovery:
# nacos 服务注册地址
server-addr: 192.168.200.200:8848
weight: 1
# 指定命名空间的id
namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
config:
server-addr: 192.168.200.200:8848
# 指定命名空间的id
namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
# 如果将配置信息保存到nacos,指定配置文件扩展名
file-extension: yaml
# nacos config dataid name 默认加载 ${spring.application.name}.${file-extension},当然也可指定
#name: hailtaxi-driver.yaml
# 加载共享配置信息
shared-configs[0]:
dataId: datasource.yaml
refresh: true
配置信息的加载由NacosConfigProperties完成
nacos除了支持读取以上所支持的的配置信息外,用户还可以自定义扩展配置
spring:
application:
name: hailtaxi-driver
profiles:
active: dev
cloud:
nacos:
discovery:
# nacos 服务注册地址
server-addr: 192.168.200.200:8848
weight: 1
# 指定命名空间的id
namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
config:
server-addr: 192.168.200.200:8848
# 指定命名空间的id
namespace: 1ebba5f6-49da-40cc-950b-f75c8f7d07b3
# 如果将配置信息保存到nacos,指定配置文件扩展名
file-extension: yaml
# nacos config dataid name 默认加载 ${spring.application.name}.${file-extension},当然也可指定
#name: hailtaxi-driver.yaml
# 加载共享配置信息
# 下述两类配置都是数组,对同种配置,数组元素对应的下标越⼤,优先级越⾼。也就是排在后⾯的相同配置,将覆盖排在前⾯的同名配置
shared-configs[0]:
dataId: datasource.yaml
refresh: true
shared-configs[1]:
dataId: datasource1.yaml
refresh: true
# 加载扩展配置
extension-configs:
- dataId: custom.yaml
@Value("${app.version:v0}")
private String version;
@GetMapping("/appinfo")
public String getAppInfo() {
return version;
}
配置自动刷新对程序来说非常重要,Nacos支持配置自动刷新,并且提供了多种刷新机制
Environment自动刷新
spring-cloud-starter-alibaba-nacos-config 支持配置的动态更新,Environment能实时更新到最新的配置信息
@Value刷新
程序中如果写了@Value注解,可以采用@RefreshScope实现刷新,只需要在指定类上添加该注解即可
灰度配置指的是指定部分客户端IP进行新配置的下发,其余客户端配置保持不变,用以验证新配置对客户端的影响,保证配置的平稳发布。灰度配置是生产环境中一个比较重要的功能,对于保证生产环境的稳定性非常重要。在1.1.0中,Nacos支持了以IP为粒度的灰度配置,具体使用步骤如下:
Nacos集群模式有多种,但其实无论哪种都是将3个Nacos服务进行集群发布
集群需要采用数据共享模式进行配置信息共享,也就是要将数据存入到同一个数据库中,我们对每种集群模式进行说明:
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
比如我现在有3个Nacos,每次操作数据的时候,都需要使用IP:端口的模式,这种模式效率极低,并且一旦节点故障无法识别,因此官方不推荐这种模式。
http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,因此官方推荐该模式,该模式的结构图如下:
我们搭建Nacos集群环境,集群环境配置如下:
节点 | IP | 端口 |
---|---|---|
Nacos1 | 192.168.211.145 | 8848 |
Nacos2 | 192.168.211.146 | 8848 |
Nacos3 | 192.168.211.147 | 8848 |
192.168.211.145:8848
192.168.211.146:8848
192.168.211.147:8848
scp -r nacos 192.168.211.146:/usr/local/server/alibaba/
scp -r nacos 192.168.211.147:/usr/local/server/alibaba/
sh startup.sh
客户端接入,不建议写多个节点的IP:Port,建议以域名的方式连接Nacos,因此需要配置Nacos域名,在192.168.211.145节点中配置域名nacos.hailtaxi.com,nginx配置如下:
#负载均衡池配置
upstream hailtaxi-nacos{
server 192.168.211.145:8848;
server 192.168.211.146:8848;
server 192.168.211.147:8848;
}
server {
listen 80;
server_name nacos.hailtaxi.com;
location / {
proxy_pass http://hailtaxi-nacos;
}
}
项目中使用:
方式1:项目中Nacos地址可以把多个地址写到一起,用逗号隔开,如下代码:
方式2:通过Nginx访问即可,配置如下:
server-addr: nacos.hailtaxi.com