返回
Sentinel结合Envoy流控样例分析
后端
2024-01-18 23:46:39
我们正处于一个信息爆炸的时代,数据的互联互通与融合推动了企业数字化转型进程。越来越多的企业开始采用微服务架构,微服务架构能够帮助企业快速响应市场变化,提高开发效率。但随着微服务的增多,服务之间的调用关系变得更加复杂,传统的手工配置和维护变得非常困难。
本文旨在简单解析 Sentinel 结合 Envoy 实现流控的样例。 在 Sentinel 中有一个模块 sentinel-cluster-server-envoy-rls 该模块提供了Envoy Remote Load Sharing (RLS)服务,可以通过 Sentinel 中的 flow-rule 配置信息,对下游请求进行流控。
Sentinel结合Envoy流控样例分析,从而提升服务的可用性和稳定性。
Sentinel 是一个开源的分布式系统监控和故障处理组件,提供实时熔断、降级、限流、系统负载保护等功能。Envoy 是一个开源的边缘和服务代理,提供负载均衡、服务发现、流量管理、熔断等功能。
Sentinel 结合 Envoy 实现流控的原理如下:
- Sentinel 中有一个模块 sentinel-cluster-server-envoy-rls,该模块提供了 Envoy Remote Load Sharing (RLS) 服务,可以通过 Sentinel 中的 flow-rule 配置信息,对下游请求进行流控。
- Envoy 会将请求转发到 Sentinel 的 RLS 服务,并附带请求的元数据信息,如请求路径、请求方法、请求头等。
- Sentinel 的 RLS 服务会根据请求的元数据信息,以及 Sentinel 中的 flow-rule 配置信息,判断是否允许请求通过。如果允许,则返回允许通过的响应;如果不允许,则返回拒绝通过的响应。
- Envoy 根据 Sentinel 的 RLS 服务的响应,决定是否允许请求通过。如果允许,则将请求转发到下游服务;如果不允许,则拒绝请求。
Sentinel 结合 Envoy 实现流控的步骤如下:
- 在 Sentinel 中安装 sentinel-cluster-server-envoy-rls 模块。
- 在 Envoy 中配置 RLS 服务,并指定 Sentinel RLS 服务的地址和端口。
- 在 Sentinel 中配置 flow-rule,对下游请求进行流控。
- 重启 Sentinel 和 Envoy。
Sentinel 结合 Envoy 实现流控的示例代码如下:
// Sentinel RLS 服务配置
@Bean
public RlsController rlsController() {
return new RlsController();
}
@Bean
public RlsServer rlsServer() {
RlsServer rlsServer = new RlsServer();
rlsServer.setPort(8080);
rlsServer.setRlsController(rlsController());
return rlsServer;
}
// Envoy RLS 服务配置
envoy.reloadable_features.rls = true
envoy.service_clusters.sentinel_rls_cluster.hosts = [{address: "127.0.0.1", port: 8080}]
envoy.http_connection_manager.route_config.virtual_hosts[0].request_headers_to_add = [{header: {key: "User-Id", value: "%REQ(:user_id)%"}, append: false}]
envoy.http_connection_manager.route_config.virtual_hosts[0].request_headers_to_add = [{header: {key: "Item-Id", value: "%REQ(:item_id)%"}, append: false}]
envoy.http_connection_manager.route_config.virtual_hosts[0].routes[0].typed_per_filter_config.envoy.filters.http.rls.v3.RlsPerRoute.rls_server_name = "sentinel_rls_cluster"
Sentinel 结合 Envoy 实现流控,可以有效地保护服务免受过载,提高服务的可用性和稳定性。