本文介绍Sidecar模式的特点,及其应用的场景。熟悉Native Cloud或者微服务的童鞋应该知道,在云环境下,技术栈可以是多种多样的。那么如何能够将这些异构的服务组件串联起来,成为了服务治理的一个重大课题。而Sidecar模式为服务治理,提供了一种解决方案。

将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。此模式还可以使应用程序由异构组件和技术组成。

这种模式被称为Sidecar,因为它类似于连接到摩托车的边车。在该模式中,边车附加到父应用程序并为应用程序提供支持功能。 sidecar还与父应用程序共享相同的生命周期,与父项一起创建和退役。边车图案有时被称为搭接图案并且是分解图案。

问题背景

应用程序和服务通常需要相关的功能,例如监控、日志、集中化配置和网络服务等。这些外围任务可以作为单独的组件或服务来实现。

如果它们紧密集成到应用程序中,它们可以在与应用程序相同的进程中运行,从而有效地使用共享资源。但是,这也意味着它们没有很好地隔离,并且其中一个组件的中断可能会影响其他组件或整个应用程序。此外,它们通常需要使用与父应用程序相同的语言或者技术栈来实现。因此,组件和应用程序彼此之间具有密切的相互依赖性。

如果将应用程序分解为服务,则可以使用不同的语言和技术构建每个服务。虽然这提供了更大的灵活性,但这意味着每个组件都有自己的依赖关系,并且需要特定于语言的库来访问底层平台以及与父应用程序共享的任何资源。此外,将这些功能部署为单独的服务可能会增加应用程序的延迟。管理这些特定于语言的接口的代码和依赖关系也会增加相当大的复杂性,尤其是对于托管、部署和管理服务。

解决方案

上述问题的解决方案是,将一组紧密结合的任务与主应用程序共同放在一台主机(Host)中,但会将它们部署在各自的进程或容器中。这种方式也被称为“Sidecar(边车)模式”。

下图展示了任务与主应用程序的部署关系图。

Sidecar模式

边车服务不一定是应用程序的一部分,而是与之相关联。它适用于父应用程序的任何位置。Sidecar支持与主应用程序一起部署的进程或服务。这就像是如下图所示的边三轮摩托车那样,将边车安装在一辆摩托车上,就变成了边三轮摩托车。每辆边三轮摩托车都有自己的边车。类似同样的方式,边车服务共享其父应用程序的主机。对于应用程序的每个实例,边车的实例被部署并与其一起托管。

使用边车模式的优点包括:

  • 在运行时环境和编程语言方面,边车独立于其主要应用程序,因此不需要为每种语言开发一个边车。
  • 边车可以访问与主应用程序相同的资源。例如,边车可以监视边车和主应用程序使用的系统资源。
  • 由于它靠近主应用程序,因此在它们之间进行通信时没有明显的延迟。
  • 即使对于不提供可扩展性机制的应用程序,也可以使用边车通过将其作为自己的进程附加到与主应用程序相同的主机或子容器中来扩展功能。

Sidecar模式通常与容器一起使用,并称为边车容器。有关容器方面的内容,可以参阅https://waylau.com/ahout-docker/。

Sidecar模式的实现

Spring Cloud Netflix Sidecar框架提供了Sidecar模式的现成解决方案。Spring Cloud Netflix Sidecar框架框架可以提供对其他非Spring Cloud技术栈的微服务的治理。比如,你可以使用Node或者Golang编写一个Web项目,这个服务同样可以以Sidecar模式,纳入到Spring Cloud管理中去。

下面是实现步骤。

1. 为Web项目添加健康检查接口

提供REST接口,返回JSON格式内容{"status" : "up"}。其中status用于描述微服务的状态,常见的取值有UP、DOWN、OUT_OF_SERVICE和UNKNOWN等。

2. 编写Sidecar微服务

创建项目,添加Eureka、Sidecar的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

启动类上加上@EnableSidecar注解。这是一个组合注解,它整合了三个注解,分别是@EnableCircuiBreaker和@EnableDiscoveryClient。

在配置文件中加入端口号、服务名称、Eureka地址以及Web项目的端口以及健康检查地址,如:

server.port=8887
spring.application.name=sidecar-mylife-service
eureka.client.serviceUrl.defaultZone=http://localhost:8881/eureka/
eureka.client.instance.prefer-ip-address=true
sidecar.port=8080
sidecar.health-uri=http://localhost:8080/health
eureka.instance.hostname=localhost

启动项目,并访问8887接口,就可以访问到Web项目中的接口。

3. Sidecar的一些端点

以下是Sidecar的常用端点:

  • /hosts/{serviceId} 指定微服务在Eureka上的实例列表
  • /ping 返回OK字符串
  • /{serviceId} 请求对应的微服务

4. 部署应用

将Sidecar与Web服进行部署。一般是部署在相同的主机里面。

有关Spring Cloud的更多内容,可以参阅Spring Cloud 教程。

参考引用

  • 原文同步至https://waylau.com/sidecar-pattern/
  • Spring Cloud 微服务架构开发实战:https://github.com/waylau/spring-cloud-microservices-development
  • Spring Boot 企业级应用开发实战:https://github.com/waylau/spring-boot-enterprise-application-development
  • https://docs.microsoft.com/en-us/azure/architecture/patterns/sidecar

了解Sidecar模式相关推荐

  1. 分布式数据库DDM Sidecar模式负载均衡

    1 简介 分布式数据库中间件 DDM 分布式数据库中间件(Distributed Database Middleware)是解决数据库容量.性能瓶颈和分布式扩展问题的中间件服务,提供分库分表.读写分离 ...

  2. K8S 使用 SideCar 模式部署 Filebeat 收集容器日志

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  3. mysql中ddl和ddm_分布式数据库DDM Sidecar模式负载均衡

    1 简介 分布式数据库中间件 DDM 分布式数据库中间件(Distributed Database Middleware)是解决数据库容量.性能瓶颈和分布式扩展问题的中间件服务,提供分库分表.读写分离 ...

  4. Sidecar 模式的机制与应用

    什么是 Sidecar 模式 将应用程序的功能划分为单独的进程,即 Sidecar 模式.Sidecar 译为摩托车的边车,用到软件架构中,Sidecar 模式指在原来的业务逻辑上再新加一个抽象层. ...

  5. Sidecar模式初识

    Sidecar设计模式正在收到越来越多的关注和采用.作为Service Mesh的重要要素,Sidecar模式对于构建高度高度可伸缩.有弹性.安全且可便于监控的微服务架构系统至关重要.而Service ...

  6. Sidecar 模式

    Sidecar 模式是 Istio 服务网格采用的模式,在服务网格出现之前该模式就一直存在,尤其是当微服务出现后开始盛行,本文讲解 Sidecar 模式. 什么是 Sidecar 模式 将应用程序的功 ...

  7. Kubernetes日志采集Sidecar模式介绍

    摘要: DaemonSet和Sidecar模式各有优缺点,目前没有哪种方式可以适用于所有场景.因此我们阿里云日志服务同时支持了DaemonSet以及Sidecar两种方式,并对每种方式进行了一些额外的 ...

  8. 重新认识Docker Compose之Sidecar模式

    什么是Docker Compose 在微服务盛行的今天,我们通常是这么定义Compose的:对容器的统一启动和关闭的编排工具. 但是我以前还是有个疑惑,谁会用Compose在一台服务器上部署多个服务呢 ...

  9. Kubernetes的Sidecar模式

    实践 apiVersion: v1 kind: Pod metadata:name: test-sidecar spec:volumes:- name: share-pathemptyDir: {}c ...

最新文章

  1. Django使用MySQL笔记
  2. 什么是 Linux 安全基线?
  3. 学python五大理由_学习Python的五大理由
  4. Spring的使用——基础环境搭建以及IOC概念理解(持续更新)
  5. 物联网操作系统Hello China V1.76(PC串口版)版本发布
  6. 阿里巴巴再陷“抄袭门”,究竟孰真孰假?
  7. Varnish 503错误
  8. matlab生成数据以二进制数据格式写入txt文件中
  9. 《MATLAB智能算法30个案例》:第5章 基于遗传算法的LQR控制器优化设计
  10. 代数法化简逻辑函数方法集合
  11. spss软件下载安装
  12. 管家婆服务器怎么找文件夹,请问管家婆数据备份在哪里?如何恢复?
  13. Python创建分栏排版的Word文档
  14. c++11中的declval和decltype
  15. JAVA接入微信刷脸支付分支付【V2、V3两种接入都有提供】
  16. 虚拟机扩展C盘容量方法
  17. WPS JASPI调试器打开 WPS重要路径
  18. AOP 主要应用场景
  19. 腾讯十大最受欢迎的开源项目!
  20. 微信小程序商城搭建二手交易网站购物+后台管理系统|前后分离VUE.js

热门文章

  1. 电脑打印机共享、安装系统注意事项
  2. Anki 自定义媒体文件夹 更改C盘默认文件夹
  3. JAVA开源学习者_新浪博客
  4. 聚类2-高斯混合-EM算法
  5. DHH推荐的五本书(未完待续)
  6. java socket 自动重连_RxWebSocket是一个基于okhttp和RxJava封装的自动重连WebSocket客户端...
  7. 软件测试计划模板(增强版)
  8. 学习小组实现过程、学习心得等
  9. 写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
  10. 逻辑斯蒂回归java_逻辑斯蒂回归模型