Proxyless Service Mesh:下一代微服务架构体系

一、项目背景及意义

在当今的微服务架构中,应用程序通常被拆分成多个独立的服务,这些服务通过网络进行通信。这种架构的优势在于可以提高系统的可扩展性和灵活性,但也带来了新的挑战,比如:

  • 服务间通信的复杂性:不同服务之间需要进行可靠的通信,处理失败重试、负载均衡等问题。
  • 故障的容错处理:系统的复杂性给与运维及故障处理带来更大的挑战,如何快速处理故障解决线上问题,这是考验一个企业基础设施建设的重要关卡。

最初,开发者使用SDK来解决这些问题,通过在代码中集成各种库和工具来实现服务治理。然而,随着微服务架构的规模不断扩大,这种方法逐渐显现出局限性:

  • 代码侵入性:需要在每个服务的代码中集成和配置各种库,增加了代码的复杂性和维护成本。
  • 一致性问题:不同服务可能使用不同版本的库,导致治理逻辑不一致,SDK的升级难度凸显。

为了解决这些问题,服务网格(Service Mesh)应运而生。服务网格通过在服务间引入一个代理层(通常称为Sidecar),将服务治理的逻辑从应用代码中分离出来,实现了更好的治理和管理。然而,服务网格的引入也带来了额外的复杂性和性能开销。

在这样的背景下,我们通过Java字节码增强技术,在服务治理领域提供了一种创新的解决方案。它结合了SDK和服务网格的优点,提供了无侵入性的治理逻辑注入、灵活的扩展性和高效的性能优化。这种方法不仅简化了微服务架构中的服务治理,还提升了系统的可观测性和安全性,对于现代微服务环境具有重要意义。

二、当前的微服务架构

这个阶段引入更多的微服务治理和管理工具,使用专业的微服务框架或中间件,通过专门定制的微服务通讯协议,让应用取得更高的吞吐性能。如API网关、注册中心、分布式追踪等。DevOps和持续集成/持续部署(CI/CD)流程成熟。代表产物如Spring Cloud,Dubbo等。此时典型的微服务场景还都是具体的微服务SDK提供的治理能力。通讯流程为:SDK负责向注册中心注册当前服务信息,当需要进行服务消费时,同样向注册中心请求服务提供者信息,然后直连服务提供者IP及端口并发送请求。如下图所示:

优点: 高度可扩展、弹性和灵活性,支持高频率的发布和更新。

缺点: 系统复杂性和运维成本较高,需要成熟的技术栈和团队能力。微服务治理能力依赖SDK,升级更新成本高,需要绑定业务应用更新。

三、传统的Proxy Service Mesh

随着云原生容器化时代的到来,服务网格是一种专门用于管理微服务之间通信的基础设施层。它通常包含一组轻量级的网络代理(通常称为 sidecar),这些代理与每个服务实例一起部署,这利用了K8s中Pod的基础能力。服务网格负责处理服务间的通信、流量管理、安全性、监控和弹性等功能。这种微服务治理方式也可以称之为Proxy模式,其中SideCar即作为服务之间的Proxy。如下图所示:

优点: 主要优点是解耦业务逻辑与服务治理的能力,通过集中控制平面(control plane)简化了运维管理。

缺点: 增加了资源消耗,更高的运维挑战。

四、新一代微服务架构体系 Proxyless Service Mesh

Proxyless模式(无代理模式)是为了优化性能和减少资源消耗而引入的。传统的微服务网格通常使用边车代理(Sidecar Proxy)来处理服务之间的通信、安全、流量管理等功能。

五、业界现状

1、基于sdk方案

目前主流的RPC框架,比如grpc、dubbo、brpc等都支持相应的proxy less service mesh方案。

2、基于javaAgent方案

京东云 joylive agent

华为云 sermant

六、最终选型

我们选择通过Java Agent模式实现Proxyless模式是一种将服务网格的功能(如服务发现、负载均衡、流量管理和安全性)直接集成到Java应用程序中的方法。这种方式可以利用Java Agent在运行时对应用程序进行字节码操作,从而无缝地将服务网格功能注入到应用程序中,而无需显式修改应用代码。Java Agent模式实现Proxyless的优点如下:

性能优化

  • 减少网络延迟:传统的边车代理模式会引入额外的网络跳数,因为每个请求都需要通过边车代理进行处理。通过Java Agent直接将服务网格功能注入到应用程序中,可以减少这些额外的网络开销,从而降低延迟。
  • 降低资源消耗:不再需要运行额外的边车代理,从而减少了CPU、内存和网络资源的占用。这对需要高效利用资源的应用非常重要。

简化运维

  • 统一管理:通过Java Agent实现Proxyless模式,所有服务网格相关的配置和管理可以集中在控制平面进行,而无需在每个服务实例中单独配置边车代理。这简化了运维工作,特别是在大型分布式系统中。
  • 减少环境复杂性:通过消除边车代理的配置和部署,环境的复杂性降低,减少了可能出现的配置错误或版本不兼容问题。
  • 数据局面升级:Java Agent作为服务治理数据面,天然与应用程序解耦,这点是相对于SDK的最大优点。当数据面面临版本升级迭代时,可以统一管控而不依赖于用户应用的重新打包构建。

灵活性

  • 无需修改源代码与现有生态系统兼容:Java Agent可以在运行时对应用程序进行字节码操作,直接在字节码层面插入服务网格相关的逻辑,而无需开发者修改应用程序的源代码。这使得现有应用能够轻松集成Proxyless模式。
  • 动态加载和卸载:Java Agent可以在应用程序启动时或运行时动态加载和卸载。这意味着服务网格功能可以灵活地添加或移除,适应不同的运行时需求。

适用性广

  • 支持遗留系统:对于无法修改源代码的遗留系统,Java Agent是一种理想的方式,能够将现代化的服务网格功能集成到老旧系统中,提升其功能和性能。

通过Java Agent实现Proxyless模式,能够在保持现有系统稳定性的同时,享受服务网格带来的强大功能,是一种高效且灵活的解决方案。

参考:https://zhuanlan.zhihu.com/p/717013880

要修改 ProxylessNAS 的搜索空间,需要在 `models/proxyless_nas/search_space` 目录下的 `search_space.py` 文件中进行修改。该文件定义了搜索空间的结构,包括候选的操作和它们的超参数范围等。 具体来说,你可以按照以下步骤进行修改: 1. 定义新的操作,或删除现有的操作。你可以在 `PRIMITIVES` 列表中添加或删除操作的名称,例如: ```python PRIMITIVES = [ 'none', 'skip_connect', 'sep_conv_3x3', 'sep_conv_5x5', 'dil_conv_3x3', 'dil_conv_5x5', 'max_pool_3x3', 'avg_pool_3x3', 'group_conv_3x3', 'group_conv_5x5', 'conv_7x1_1x7', 'conv_1x1', 'conv_3x3', # 新添加的操作 'my_op', ] ``` 2. 定义新的超参数范围,或修改现有的超参数范围。你可以在 `OPS` 字典中修改操作的超参数范围,例如: ```python OPS = { 'none': lambda C, stride, affine: Zero(C, stride), 'skip_connect': lambda C, stride, affine: Identity(C, stride), 'sep_conv_3x3': lambda C, stride, affine: SepConv(C, C, 3, stride, 1, affine=affine), 'sep_conv_5x5': lambda C, stride, affine: SepConv(C, C, 5, stride, 2, affine=affine), 'dil_conv_3x3': lambda C, stride, affine: DilConv(C, C, 3, stride, 2, 2, affine=affine), 'dil_conv_5x5': lambda C, stride, affine: DilConv(C, C, 5, stride, 4, 2, affine=affine), 'max_pool_3x3': lambda C, stride, affine: nn.MaxPool2d(3, stride=stride, padding=1), 'avg_pool_3x3': lambda C, stride, affine: nn.AvgPool2d(3, stride=stride, padding=1), 'group_conv_3x3': lambda C, stride, affine: GConv(C, C, 3, stride, 1, affine=affine), 'group_conv_5x5': lambda C, stride, affine: GConv(C, C, 5, stride, 2, affine=affine), 'conv_7x1_1x7': lambda C, stride, affine: nn.Sequential( nn.ReLU(inplace=False), nn.Conv2d(C, C, (1,7), stride=(1,stride), padding=(0,3), bias=False), nn.Conv2d(C, C, (7,1), stride=(stride,1), padding=(3,0), bias=False), nn.BatchNorm2d(C, affine=affine) ), 'conv_1x1': lambda C, stride, affine: Conv(C, C, 1, stride, 0, affine=affine), 'conv_3x3': lambda C, stride, affine: Conv(C, C, 3, stride, 1, affine=affine), # 修改现有操作的超参数范围 'sep_conv_3x3': lambda C, stride, affine, eps=1e-3, momentum=0.1, affine_bn=True: SepConv(C, C, 3, stride, 1, affine=affine, eps=eps, momentum=momentum, affine_bn=affine_bn), # 定义新操作的超参数范围 'my_op': lambda C, stride, affine, my_param=0.1: MyOp(C, C, 3, stride, 1, affine=affine, my_param=my_param), } ``` 3. 修改完毕后,重新运行训练或搜索脚本,即可使用修改后的搜索空间。 需要注意的是,修改搜索空间可能会对模型的性能产生影响,因此建议在修改前仔细评估并测试不同搜索空间的性能和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值