1,基础定义
Nacos(Naming and Configuration Service 的首字母缩写)是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
(1),动态服务发现、健康监测
- Nacos 支持 DNS-Based 和 RPC-Based(Dubbo、gRPC)模式的服务发现。默认情况下,Nacos 使用的是 DNS-Based 模式(
它通过域名解析的方式来实现服务的动态发现和调用
)的服务发现。在这种模式下,Nacos 将注册的服务信息映射到 DNS 服务器上,客户端通过 DNS 请求来获取服务信息,从而实现服务的发现和调用。
当服务消费者需要调用某个服务时,它会向 Nacos Client 发送 DNS 请求(服务名
),Nacos Client 会解析 DNS 请求并返回相应的服务实例信息,以便消费者能够发起调用。 - Nacos 也提供实时健康检查(心跳检测),以防止将请求发往不健康的主机或服务实例。
(2),配置管理
1),统一配置管理
统一配置管服务能够实现以中心化、外部化和动态化的方式管理所有环境的配置。
配置管理模块则负责管理应用系统的各种配置信息,例如数据库连接信息、缓存配置、业务参数等。这些配置信息能够被动态修改,并且能够被实时推送到各个应用系统中,从而实现配置的动态管理和更新。
2),动态配置服务
动态配置消除了配置变更时重新部署应用和服务的需要。
spring-cloud-starter-alibaba-nacos-config
也支持配置的动态更新,当配置修改时能获取到最新数据。 也可以通过配置 spring.cloud.nacos.config.refresh.enabled=false
来关闭动态刷新。
3),进阶指南
其他详细参考连接 => Nacos 配置中心进阶指南
(3),服务管理
1),限流(Nacos+Gateway)
首先Nacos 本身并不直接提供限流功能,但可以通过结合使用 Nacos 的配置管理和服务发现功能,来实现限流。
当然,下面我将为您提供一个简单示例的代码实现,演示如何结合 Nacos 和 Spring Cloud Gateway 实现限流功能。请注意,这只是一个基本示例,实际生产环境中可能需要更完善的错误处理、日志记录等功能。
-
在 Nacos 中配置限流规则:在 Nacos 配置中心中创建一个配置文件
qps-limit.properties
,内容如下:
# 接口限流配置
# key 为接口路径,value 为 QPS 限制值
/api/order/create=100
/api/user/info=50
-
编写自定义过滤器:创建一个名为
QpsLimitFilter
的自定义过滤器,用于从 Nacos 中获取上述配置信息,并实施限流逻辑。这个过滤器可以在请求到达网关时从 Nacos 中获取对应接口的 QPS 限制值,并根据当前请求的情况进行限流处理。以下是一个简单的示例代码:
public class QpsLimitFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String requestPath = exchange.getRequest().getPath().toString();
// 从 Nacos 中获取 QPS 限制值
int qpsLimit = getQpsLimitFromNacos(requestPath);
// 根据 QPS 限制值进行限流处理
if (qpsLimit > 0 && !checkQps(requestPath, qpsLimit)) {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
private int getQpsLimitFromNacos(String requestPath) {
// 从 Nacos 中获取对应接口的 QPS 限制值
// 这里简化为直接返回一个固定值
return 100;
}
private boolean checkQps(String requestPath, int qpsLimit) {
// 检查当前请求是否超过 QPS 限制值
// 这里简化为假设没有超过限制
return true;
}
@Override
public int getOrder() {
return -1;
}
}
- 将过滤器添加到 Spring Cloud Gateway 中:在 Spring Cloud Gateway 的配置类中添加该过滤器:
@Bean
public QpsLimitFilter qpsLimitFilter() {
return new QpsLimitFilter();
}
- 测试限流功能:启动 Spring Cloud Gateway 服务,并通过发送请求来测试限流功能是否按照配置的 QPS 限制值进行生效。
2),动态DNS服务(灰度发布)
当使用 Nacos 作为动态路由管理中心时,本身并不直接提供灰度发布、流量调度等功能,而是通过其作为配置中心和服务发现中心的特性,结合动态读取配置等机制,来实现以下功能:
- 灰度发布:通过 Nacos,您可以将不同版本或变种的服务实例分配给不同的用户群体,实现灰度发布。这意味着您可以逐步向用户群体推送新版本的服务,以确保系统稳定性和功能完整性。 => 补充说明:用户可以利用Nacos作为配置中心,动态地调整灰度发布策略、流量调度规则等配置信息。服务实例会动态地根据这些配置信息进行注册和发现,以及处理来自服务消费者的请求。这样就实现了灰度发布、流量调度等功能。
- 流量调度:Nacos 允许您根据预先定义的规则来调度流量,将请求导向不同的服务实例或集群。您可以基于流量大小、请求来源、负载情况等因素进行智能的流量调度,实现动态负载均衡。
- 条件路由:Nacos 支持基于条件的路由规则定义,您可以根据请求的特定属性(如请求头、请求参数等)来决定请求的路由方向。这样可以实现更加灵活的请求处理逻辑。
- 权重调节:通过 Nacos,您可以对不同服务实例设置权重,按比例分配流量。这在服务治理中非常有用,可以根据服务实例的性能和健康状态动态调节权重,实现负载均衡和故障转移。
-
实时生效:Nacos 提供实时生效的特性,意味着当您修改路由规则或调整流量策略时,这些变更会立即生效,而无需重启服务或等待缓存刷新。
通过以上功能,Nacos 可以帮助用户实现灵活的动态路由管理,提高系统的可用性、稳定性和灵活性。这些功能对于微服务架构中的服务治理和流量控制至关重要,能够帮助用户更好地管理和优化服务调用流程。
2,应用实现拆解、源码分析
(1),多租户
目前为止广泛使用的 Nacos 1.4.0 版本,最新稳定版本为2.3.0。Nacos 的多租户功能通过命名空间的隔离实现了不同租户之间的数据隔离和权限控制,从而确保不同租户之间的资源不会相互干扰,并且提供了灵活的权限管理机制。
A01:软隔离实现多租户
软隔离是指通过逻辑上的隔离,而不是物理上的隔离,来确保不同租户之间的数据和操作相互独立。
具体来说,在 Nacos 2.3.0 中,通过命名空间(Namespace)的划分来实现多租户的软隔离。每个租户对应一个命名空间,不同租户的数据被存储在不同的命名空间中,通过命名空间 ID 进行区分。在业务逻辑的处理过程中,Nacos 2.3.0 根据当前操作的用户或客户端所属的命名空间,来进行数据的过滤和权限的校验,从而实现了不同租户之间的软隔离。
这种软隔离的实现方式具有灵活性,能够更好地适应不同场景下的多租户需求,同时也降低了系统的复杂度和成本。
在 Nacos 中,多租户功能主要涉及到以下几张表:
- 命名空间表(命名空间管理):这张表用于存储不同租户的命名空间信息,包括命名空间的 ID、名称、描述等。每个租户都对应着一个命名空间,通过命名空间的划分来实现租户之间的隔离。
- 服务实例表(服务注册):在服务注册表中,需要增加命名空间 ID 字段,用于标识服务实例属于哪个命名空间。这样可以确保不同租户的服务实例数据被正确隔离存储。
- 配置信息表(配置管理):类似地,在配置信息表中也需要增加命名空间 ID 字段,用于标识配置信息所属的命名空间。
A02:对比 Nacos 1.4.0 与 Nacos 2.3.0
从 Nacos 1.4.0 到 Nacos 2.3.0 的版本升级中,关于多租户功能的实现层面发生了一些改变。以下是 Nacos 2.3.0 版本相较于 1.4.0 版本的一些改变:
- 命名空间管理: 在 Nacos 2.3.0 中,命名空间的管理逻辑发生了变化。新版本中引入了 Namespace Switch(命名空间切换)的概念,可以让用户更灵活地切换和管理命名空间。
- 全局命名空间: Nacos 2.3.0 引入了全局命名空间的概念。全局命名空间是一个特殊的命名空间,它在整个 Nacos 集群中都可见,相当于一个共享的命名空间。全局命名空间可以用于存储一些全局共享的配置或者服务信息。
- 多租户隔离: 在 Nacos 2.3.0 中,多租户功能得到了进一步加强。新版本中的多租户实现提供了更加灵活的数据隔离方式,可以对不同租户进行更细粒度的权限控制和数据过滤。
- 租户模型: Nacos 2.3.0 引入了租户模型的概念,将租户信息与命名空间进行绑定。通过租户模型,可以更加方便地管理和控制不同租户的访问权限。