SOA/ESB架构是一种常见的企业级应用架构模式,它将应用分为多个服务,通过ESB(企业服务总线)来进行服务间的通信和集成。SOA/ESB架构的优点是可以实现服务的复用、隔离和安全,但是也存在一些问题,如:
- ESB本身是一个单点故障,如果ESB出现问题,会影响所有的服务
- ESB的性能和可扩展性受限于其硬件和软件资源,如果服务数量和流量增加,ESB可能会成为瓶颈
- ESB的管理和维护成本较高,需要专业的团队来进行配置、监控和调优
- ESB的功能和协议可能不够灵活和标准化,导致服务间的耦合度较高
随着 云计算 和容器技术的发展,SOA/ESB架构模式在目前公有云上的典型参考架构是将应用部署在Kubernetes中,通过Ingress来暴露外部访问入口,通过Service来定义内部服务发现和 负载均衡 ,通过ConfigMap和Secret来管理配置和敏感信息。这种架构模式相比于传统的SOA/ESB架构,有以下优势:
- Kubernetes提供了高可用、 弹性伸缩 、自愈等特性,可以保证应用的稳定性和可靠性
- Kubernetes支持多种云厂商和平台,可以实现应用的跨云部署和 迁移
- Kubernetes提供了丰富的生态系统,可以集成各种 开源 或商业的工具和服务,如监控、日志、链路追踪等
然而,SOA/ESB架构虽然在隔离性、安全性上存在一定优点,但是短板也非常明显。首先,应用之间仍然需要通过ESB来进行通信和集成,这会增加网络延迟和复杂度,也会降低应用的自治性和灵活性。其次,ESB仍然是一个单点故障和性能瓶颈,如果ESB出现问题或者无法满足流量需求,会影响整个系统的可用性和效率。最后,ESB仍然需要专业的团队来进行管理和维护,这会增加运维成本和风险。
为了解决这些问题,许多企业开始尝试对SOA/ESB架构进行改造,从微服务到ServiceMesh,再到Sermant。
微服务是一种轻量级的服务架构模式,它将应用拆分为多个小而独立的服务,每个服务负责一个单一的业务功能,并且通过轻量级的协议(如HTTP、REST、gRPC等)来进行通信。微服务的优点是可以实现服务的高内聚、低耦合、快速迭代、独立部署等。但是微服务也带来了一些挑战,如:
- 服务数量增加导致管理复杂度增加
- 服务间通信需要处理网络不可靠、超时重试、负载均衡等问题
- 服务间需要实现统一的认证、授权、限流、熔断等功能
- 服务间需要实现跨服务的监控、日志、链路追踪等功能
为了解决这些挑战,ServiceMesh应运而生。ServiceMesh是一种基于代理模式的微服务架构,它将服务间的通信、治理、监控等功能从应用代码中剥离出来,交由一个独立的代理(如Envoy)来处理。ServiceMesh的优点是可以实现服务的自治性、灵活性、可观察性和安全性,同时降低了应用开发和运维的复杂度。但是ServiceMesh也存在一些问题,如:
- 引入了额外的代理,可能会增加网络延迟和资源消耗
- 需要对应用进行一定程度的改造,以适应ServiceMesh的通信和治理模式
- 需要学习和掌握新的技术和工具,如Istio、Linkerd等
Sermant是一种基于Java Agent的服务治理框架,它通过字节码增强技术来实现服务的动态注入和治理。Sermant的优点是可以在不改变应用代码的前提下,实现服务的注册发现、负载均衡、熔断降级、认证授权等功能,同时避免了ServiceMesh中代理带来的性能损耗。Sermant的核心思路如下:
1. 使用Java Agent来动态注入服务治理逻辑,无需修改应用代码
2. 采用AOP(面向切面编程)方式实现服务的拦截和增强,避免了sidecar模式的性能损耗
3. 提供灵活的配置和扩展机制,支持多种服务治理策略和插件
采用Sermant对SOA/ESB架构进行升级的步骤如下:
1. 准备工作:确认应用支持Sermant框架,安装Sermant Injector
2. 发布新版本的应用,携带Sermant Java Agent
3. 在配置中心,将应用加入白名单,实现灰度发布
4. 逐步将其他应用升级为携带Sermant Java Agent的版本,加入白名单
5. 删除应用的旧版本,完成升级
总之,SOA/ESB架构升级之路从微服务到ServiceMesh,再到Sermant,是一种逐步演进和优化的过程。通过采用Sermant框架,企业和组织可以更快速地实现 云原生 的微服务架构改造,提高业务运营效率和降低成本。同时,Sermant框架在性能、灵活性和易用性方面具有较大的优势,值得关注和尝试。
当前Sermant已在华为云 云服务 CSE中被集成,用户可以在华为云CSE云服务中使用相关功能。
Sermant官网:https://sermant.io
GitHub仓库地址:https://github.com/huaweicloud/Sermant