阿里微服务架构Spring Cloud Alibaba Nacos实战
nacos官方文档:https://nacos.io/zh-cn/docs/quick-start.html
1、常用特性
-
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
-
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
-
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
-
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
2、注册中心、配置中心对比
注册中心对比
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | — | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | — | Keep Alive |
负载均衡策略 | 权重/ metadata/Selector | Ribbon | Fabio | RoundRobin | — |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
配置中心对比
功能点 | Spring Cloud Config | Apollo | Nacos |
---|---|---|---|
开源时间 | 2014.9 | 2016.5 | 2018.6 |
配置实时推送 | 支持(Spring Cloud Bus) | 支持(HTTP长轮询1S内) | 支持(HTTP长轮询1S内) |
版本管理 | 支持(GIT) | 支持 | 支持 |
配置回滚 | 支持(GIT) | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 不支持 |
权限管理 | 支持 | 支持 | 支持 |
集群 | 支持 | 支持 | 支持 |
多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 只支持Java | GO、C++、Python、PHP、Java、.Net、OpenAPI | Python、Java、.Net、OpenAPI、NodeJS |
单机部署 | config-server+Git+Spring Cloud Bus | Apollo-quickstart+MySQL | Nacos单节点 |
分布式部署 | config-server(2)+Git+MQ(部署复杂) | config(2)+Admin(2)+portal(2)+mysql(部署复杂) | Nacos(2)+Mysql(部署简单) |
配置格式校验 | 不支持 | 支持 | 支持 |
通信协议 | Http和AMQP | Http | Http |
数据一致性 | Git保证一致性,config-server从git读取数据 | 数据库模拟消息队列,Apollo定时读消息 | Http异步通知 |
单机读 | 7(限流所致) | 9000 | 15000 |
单机写 | 5(限流所致) | 1100 | 1800 |
3节点多 | 21(限流所致) | 27000 | 45000 |
3节点写 | 5(限流所致) | 3300 | 5600 |
总的来说,Apollo和Nacos相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,不过使用起来也要麻烦一些。Nacos使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。
此外,Nacos除了提供配置中心的功能,还提供了动态服务发现、服务共享与管理的功能,降低了服务化改造过程中的难度。
3、生态图
如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
4、安装
下载地址:https://github.com/alibaba/nacos/releases
配置数据源:
修改nacos/conf/application.properties配置文件
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
启动nacos/bin/startup.cmd或startup.sh,启动成功后访问 http://127.0.0.1:8848/nacos
用户名密码:nacos/nacos
docker安装
详细参数配置:https://nacos.io/zh-cn/docs/quick-start-docker.html
docker search nacos
docker pull nacos/nacos-server
docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=62.234.0.169 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=Leimingtech1205 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-p 8848:8848 \
--restart=always \
--name lm-nacos \
nacos/nacos-server
启动成功后访问 http://127.0.0.1:8848/nacos
用户名密码:nacos/nacos
5、名词解析
命名空间(namespace)、配置集 ID(dataId)、配置分组(Group)
https://nacos.io/zh-cn/docs/concepts.html
6、代码实战
注册中心
首先代码演示一下使用Nacos作为服务注册中心。
版本信息
Spring Boot | Spring Cloud | Spring Cloud Alibaba |
---|---|---|
2.1.12.RELEASE | Greenwich.SR5 | 2.1.0.RELEASE |
添加依赖
在pom.xml中添加对应依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件
在application.yml中配置nacos信息
spring:
cloud:
nacos:
discovery:
metadata:
management:
context-path: ${server.servlet.context-path}/actuator
server-addr: ${nacos-host:@aaa@qq.com}:${nacos-port:@aaa@qq.com}
#nacos的命名空间ID,默认是public
namespace: ${nacos-namespace:public}
nacos-host、nacos-port、nacos-namespace可以配置为环境变量
nacos.server.ip、nacos.server.port在pom.xml中定义
注解
启动类上增加@EnableDiscoveryClient注解,有心者肯定能观察到@EnableDiscoveryClient也是Eureka使用的注解,因此Nacos便可以无缝替换Eureka。
验证工作
按照上面步骤进行操作,启动项目,启动完成后进入nacos平台,在【服务管理-服务列表】可进行查看。同时在详情中支持对任务手动下线,复制调试代码等操作。
配置中心
Nacos可以做为配置中心,替换Apollo、Spring Cloud Config等配置中心。
前置工作
我们需要提前在Nacos管理界面创建好配置信息,在【配置管理-配置列表】下新建配置文件。配置文件格式支持(TEXT、JSON、XML、YAML、HTML、Properties)
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
{spring.profile.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 {file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置文件
【注】Nacos作为配置中心,相关配置文件必须写在bootstrap.yml/bootstrap.properties中
bootstrap配置文件加载优先级高于application配置文件。
bootstrap.yml配置如下:
spring:
cloud:
nacos:
discovery:
metadata:
management:
context-path: ${server.servlet.context-path}/actuator
server-addr: ${nacos-host:@aaa@qq.com}:${nacos-port:@aaa@qq.com}
#nacos的命名空间ID,默认是public
namespace: ${nacos-namespace:public}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ${spring.cloud.nacos.discovery.namespace}
group: LM_SYS_SERVER_GROUP
file-extension: properties
#指定共享配置,且支持动态刷新
ext-config:
- data-id: mybatis-plus-common.yaml
group: COMMON_GROUP
refresh: true
- data-id: other-common.yaml
group: COMMON_GROUP
refresh: true
- data-id: rabbitmq-common.yaml
group: COMMON_GROUP
refresh: true
- data-id: redis-common.yaml
group: COMMON_GROUP
refresh: true
验证
配置完成后,启动项目并查看启动日志,如果发现类似以下日志代表配置成功。
2020-07-14 11:31:27.300 INFO 9120 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'mybatis-plus-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.306 INFO 9120 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'other-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.309 INFO 9120 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'rabbitmq-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.313 INFO 9120 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'redis-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.317 INFO 9120 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'leimingtech-sys-server-dev.properties', group: 'LM_SYS_SERVER_GROUP'
2020-07-14 11:31:27.319 INFO 9120 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-leimingtech-sys-server-dev.properties'}, BootstrapPropertySource {name='bootstrapProperties-leimingtech-sys-server.properties'}, BootstrapPropertySource {name='bootstrapProperties-redis-common.yaml'}, BootstrapPropertySource {name='bootstrapProperties-rabbitmq-common.yaml'}, BootstrapPropertySource {name='bootstrapProperties-other-common.yaml'}, BootstrapPropertySource {name='bootstrapProperties-mybatis-plus-common.yaml'}]
2020-07-14 11:31:27.364 INFO 9120 --- [ main] com.leimingtech.AdminApplication : The following profiles are active: dev
推荐阅读
-
spring cloud Alibaba 阿里微服务 flowable 工作流 自定义表单 模块设计方案
-
Spring Cloud Alibaba系列-第四节-创建生产者与消费者服务,注册到Nacos监控服务
-
Spring Cloud Alibaba | Nacos服务中心初探
-
Nacos--在Spring cloud中使用Spring Cloud Alibaba Nacos Discovery(服务注册+配置管理示例)
-
Spring Cloud Alibaba(1) 实现服务注册与发现 Nacos Discovery
-
Spring Cloud Alibaba实战(二) - Nacos注册中心
-
Nacos快速入门(三):Spring Cloud Alibaba Nacos实现服务注册与发现
-
Spring Cloud Alibaba Nacos:服务发现
-
微服务架构实战学习笔记 第五章 Spring Cloud Netflix Hystrix与服务容错
-
微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡