聊聊微服务集群当中的自动化工具

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本篇博客主要介绍了自动化工具这个概念,在微服务集群当中的作用,算抛砖引玉,欢迎大家提出自己的见解。

本篇博客主要介绍了自动化工具这个概念,在微服务集群当中的作用,算抛砖引玉,欢迎大家提出自己的见解。

写在前面

在了解自动化工具的概念之前,我们先了解一下微服务和集群的概念。

什么是微服务

这个概念其实有些广泛,而我的知识广度也有限,我会尽量用通俗的语言来描述什么是微服务,什么是集群,以及为什么我们需要微服务集群 。

微服务

传统的后端服务多为单体应用,例如使用Sprint Boot或者Node又或者Gin搭建的简单的后端服务,在此基础之上,实现了基本的业务之后再部署到服务器上运行起来,这就成为了一个单体应用。

随着业务需求的增加、业务代码慢慢的累加,单体应用变的也越来越大。同时各个模块的大量业务代码相互纠缠在一起,开发以及维护变得尤其困难。想象一下一个刚刚加入项目的新人看到相互纠缠的、逻辑复杂的业务代码的绝望。

image

这个时候我们就需要了解微服务的概念了。如果想要讲这个庞大的单体应用可维护、可扩展以及高可用,我们就需要对单体应用按照模块进行业务拆分 。

例如将用户相关的所有逻辑单独搞成一个服务,又例如订单、库存可以搞成一个单独的服务。这样一来,业务代码被分散到几个单独的服务中,每个服务只需要关心、处理自己这个模块的业务逻辑。这样一来,业务代码的逻辑清晰,对开发人员来说,条理以及思路都很清晰。即使是后加入的项目开发人员,面对业务逻辑清晰的代码也十分容易上手。

image

微服务的拆分

其实我看到很多的文章关于微服务的介绍就基本到这了,但是还有个值得提的概念。首先,微服务怎么拆分其实是没有一个标准的。

你按照什么样的粒度去拆分你的服务其实是跟业务强相关的。并不是说一个服务的代码一定就很少,根据你的业务的量度,例如你的系统用户量特比的大,那么一个用户服务的代码量上千上万行我觉得都很正常。

当然我也见过用户不是很多,只是为了高可用和快速定位,而将系统拆分的非常细的系统,有好几十个服务。那么问题来了,有这么多服务,前端需要去维护的后端API的地址就相当的庞大了。

我们暂且先不讨论所有拆分的服务是否运行在同一个服务器上,就算是,那也得是不同的端口。前端也需要根据后端拆分的服务模块,去维护这样一张API的映射表。所以我们需要提出一个BFF,AKA Backend For Frontend.

BFF

其实BFF层最初被提出来,其实不是为了微服务拆分模块中提到的目的。其设计的目的是为了给不同的设备提供不同的API。例如一个系统的后端服务,同时需要支持不同的终端,例如移动端的iOS和Android,PC端。

这样一来,可以根据不同设备上的需求来提供对应的API,而且不需要更改我们现有的微服务。

image

这样一来,我们的底层服务群就具有了很强的扩展性,我们不需要为一个新增的客户端来更改底层的服务代码,而是新增一层BFF层,来专门针对该终端类型去做适配。

大家从上面的图可以看出来,客户端都没有直接访问我们的底层服务。而是都先经过BFF层提供的接口,再由BFF层来根据不同的路由来调用不同的底层服务。总结一下,加了BFF层的优点如下。

  • 扩展性强,可以适应不同的客户端
  • 统一的API管理,客户端无须再维护API的映射表
  • 可做集中鉴权,所有的请求都会先经过BFF,可在这一层对调用接口的合法性进行验证

当然,BFF也有缺点。

  • 处理不当会有大量的代码冗余
  • 因需要调用不同底层的服务而增大开发的工作量

当然在实际的生产环境下,我们也很少会将BFF层直接暴露给客户端。我们通常会在BFF层上再加一层网关。网关可以在请求还没有到BFF的时候,实现权限认证,限流熔断等等其他的功能。

集群

上面简单的聊了一下什么是微服务,现在我们来聊聊什么是集群。我们知道,当一个单体应用大的已经很难维护的时候,最好的办法就是将其拆分成微服务。这样有什么好处呢?

  • 便于维护。每个微服务专注于自己这个模块的业务逻辑,不会存在各个模块的业务逻辑缠在一起的状况。
  • 提高可用性。当单体应用挂掉的时候,我们系统的所有模块都将不可用。而拆分成微服务就可以尽量的避免这个问题。单个服务挂掉了,不会影响到其他服务的正常运行。
  • 便于运维。单体应用重新部署的时候,会使整个系统不可用。而在微服务中,单个服务重新部署的代价明显要小的多。

概念

说了这么多,我们来给集群一个概念吧。集群就是将同一套服务部署在不同的服务器上,对外提供服务。

例子

我举个具体的例子。例如我们使用Docker Swarm来提供容器的集群服务。

在Docker Swarm中有节点这样一个概念,凡是运行了Docker的主机都可以主动的创建一个Swarm集群或者加入一个已经存在的集群,一旦加入,这个主机就成为了这个集群中的一个节点。在集群中节点分为两类,分别是管理节点(manager)和工作节点(worker)。我们可以用Portainer来管理Docker主机和Swarm集群。

我们以一个集群中的请求来举个例子。

image

首先进入系统之后会先进入一个统一鉴权的系统去鉴权,鉴权成功之后就会到我们的微服务网关,如果这个地方还有系统自己的特殊鉴权的话,再次进行鉴权。之后网关这边会将我们的请求根据配置的路由来分发到具体的某个服务器上的某个容器中。

自动化工具

自动化工具的都包含了哪些技术呢?

image

其中的Java只是一个类比,代表你的编程语言。微服务中其实不是很关心具体用的什么语言,甚至每个服务都用不同的技术栈都行。

那么自动化工具是什么呢?其作用是什么?在集群中扮演了什么样的角色呢?我们通过一张图来简单的了解一下。

image

构建

简单的梳理一下逻辑。

  • 首先自动化工具将Jenkins构建所需要的参数组织好,调用Jenkins的构建API,并记录构建操作到自动化工具的数据库
  • 然后Jenkins用配置好的凭证去Gitlab的对应的项目的分支拉取代码,根据配置好的构建脚本开始构建,记录构建记录到自动化工具的数据库
  • 构建好后再推送到docker的仓库中,并记录到自动化工具的数据库

到此构建的逻辑结束。

其他的功能

自动化工具还可以直接在项目列表中,选择查看当前项目的日志,而不需要每次重新打开Kibana然后再加筛选filter。

自动化工具的项目设置中,我们还可以更改docker容器的配置,而不需要再去portainer中或者通过命令行去修改;如果想要命令行进入容器,首先我们得找到对应的service,然后找到对应运行的service实例,然后才能进入,而如果我们直接使用portainer的Api,在endpoint已知的情况下,可以直接将这个功能做到自动化工具中,直接使用webshell一键连接。

其好处是什么呢?

  • 对大部分开发屏蔽Swarm集群。对项目中非管理员的开发屏蔽Portainer,因为这个权限非常大,一旦不熟悉导致了误操作,那么有可能直接影响到线上的服务
  • 统一权限控制。在自动化工具里做权限以及环境的统一控制
  • 上手成本低。比起直接操作portainer和Jenkins和Kibana,自己搭建的自动化工具十分容易上手

功能总结

总结一下,其功能主要为以下几个。

  • 构建
  • 部署
  • 回滚
  • 查看elk日志
  • 更改docker配置
  • 管理集群的环境、项目和容器
  • 命令行连接具体项目的容器
  • …...

看到这大家可能会有疑问。

image

  • 构建?你的意思是我Jenkins是摆设咯?
  • 部署?更改 docker配置?命令行连接具体项目的容器?我的Iterm2也是个摆设?
  • 回滚?等于是我之前的docker镜像的tag白打了?
  • elk日志?我的Kibana是拿来看新闻的吗?

功能详解

构建

其实在构建这块,我个人认为自动化工具和Jenkins都很方便。而且自动化工具本身就是用的Jenkins,只不过是调用了Jenkins的API,传递了构建的参数,最终真正去构建的还是Jenkins。

只不过对于刚刚加入项目的测试来说,自己开发的Web UI对新人更加的友好,而且可以在自动化工具中做到权限控制。

部署和回滚

部署在自动化工具的后端通过docker-client实现。首先我们根据配置,创建docker client。然后如果已经有在运行的服务了,就调用update service更新服务,否则就创建服务。

回滚与其本质相同,只不过是用了之前的参数和不同的tag。

elk日志

首先,每个环境的配置中,会配置上kibana_host以及kibana_index,然后根据系统的projectKey,拼接成相应的Kibana日志的url,然后使用iframe嵌入到自动化工具中。这样一来就不用再手动的打开Kibana再去设置对应的filter了。特别是当你系统特别多的时候,添加和删除filter是很废时间的。

更新容器配置

这里也同样是调用对应的API更新对应服务的配置,而不用登录portainer去修改。

同时,在自动化工具中还可以针对不同的环境配置不同的Base Setting。后续在该环境下添加的应用不用再单独配置,直接继承环境的Docker Setting即可。

管理集群的环境、项目和容器

可以通过自动化工具统一的来创建和管理环境,同样有三种环境,研发、测试、生产环境。然后可以在自动化工具中创建角色和用户,分配给不同的角色不同的权限来达到控制权限的目的。

命令行连接具体项目的容器

通常我们因为某个需求,需要进入到容器中查看,然而此时我们就面临两种选择。

  • 通过portainer进入对应service,找个某个具体的container,点击连接
  • 命令行到容器具体运行的某个服务器上,然后再通过命令行连接

但是有了自动化工具,我们就有了第三种选择。

  • 点击连接

怎么实现的呢?实际上就是通过endpointId去获取到所有的container的信息,然后遍历所有的container,找到与当前选中的containerId相同的容器,获取到其NodeName,这样一来我们就知道当前这个容器到底运行在哪个节点上的了。

然后通过已有的信息,构建WebSocket的url,最后前端通过xterm来建立ws连接,就这样直接连接了正在运行的容器实例。

总结

自动化工具只是一种思路,一种解决方案,它的好处在上面也列出了很多。当然,它肯定也有坏处,那就是需要专门投入人力和资源去开发。

这对于人手紧缺和项目周期较短的项目组来说,十分的不现实。但是如果一旦有精力和时间,我觉得值得一试。同时,基于portainer的API,我们还有可能将更多与集群相关的功能,集成到自动化工具上。

  • 个人网站:hulunhao.com
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
25天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
2月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
73 3
|
2月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
68 4
|
2月前
|
运维 Linux Apache
Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例
【10月更文挑战第8天】本文介绍了Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例。Puppet通过定义资源状态和关系,确保系统配置始终如一,支持高效管理基础设施。文章详细讲解了Puppet的安装步骤、配置方法及DSL语言示例,帮助读者快速掌握Puppet的使用技巧。
88 2
|
2月前
|
监控 虚拟化 云计算
从物理到云:使用自动化工具简化服务器迁移流程
【10月更文挑战第4天】随着云计算的快速发展,越来越多的企业选择将物理服务器迁移到云环境以提高效率和降低成本。本文详细介绍了使用自动化工具简化从物理到云的服务器迁移流程的技术实现细节,并提供了代码示例。
162 6
|
17天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
120 17
Selenium:强大的 Web 自动化测试工具
|
23天前
|
运维 Kubernetes Devops
自动化运维:从脚本到工具的演进之旅
在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
7天前
|
监控 Java Sentinel
Hystrix 与 Sentinel 大比拼:微服务稳定性工具谁更优?
Hystrix 和 Sentinel 是用于微服务架构中保护服务稳定性和可靠性的工具,主要实现服务熔断、限流、降级等功能。Hystrix 侧重于熔断器模式和服务隔离,通过线程池或信号量隔离服务,防止故障扩散;Sentinel 则更全面,涵盖流量控制、熔断降级和系统自适应保护,适用于高并发场景,并提供实时监控和灵活的策略调整。两者设计理念不同,Hystrix 适合中小规模应用,而 Sentinel 更适合大规模高并发系统。
18 0
|
1月前
|
机器学习/深度学习 人工智能 运维
自动化运维之路:从脚本到工具的演进
在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
|
1月前
|
JavaScript 前端开发 开发者
探索 DrissionPage: 强大的Python网页自动化工具
DrissionPage 是一个基于 Python 的网页自动化工具,结合了浏览器自动化的便利性和 requests 库的高效率。它提供三种页面对象:ChromiumPage、WebPage 和 SessionPage,分别适用于不同的使用场景,帮助开发者高效完成网页自动化任务。
146 4