微服务团队的最佳实践与Jenkins安装指南
1. 微服务团队的推荐实践
1.1 设计评审
每个新的微服务都是一个全新的开始,具有不同的性能特征,可能使用不同的编程语言,还可能需要新的基础设施等。新特性的实现方式也有多种选择,如创建新服务、拆分为多个服务或在现有服务中实现。这种自由虽然带来了灵活性,但缺乏监督可能导致以下问题:
-
不一致性
:例如,服务可能无法一致地记录请求,这会给常见的运维任务(如缺陷调查)带来困难。
-
次优设计决策
:可能会构建多个服务,而实际上单个服务可能更易于维护且性能更好。
为了解决这些问题,可以采用设计评审流程。对于任何新服务或重大新特性,负责的工程师需要编写一份设计文档(称为RFC,即请求评论),并向一组评审人员(包括团队内部和外部)征求反馈。典型的设计评审文档包含以下部分:
| 部分 | 目的 |
| ---- | ---- |
| 问题与背景 | 该特性解决了哪些技术和/或业务问题?为什么要进行这项工作? |
| 解决方案 | 打算如何解决这个问题? |
| 依赖与集成 | 它如何与现有或计划中的服务、功能、组件进行交互? |
| 接口 | 该服务可能会暴露哪些操作? |
| 规模与性能 | 该特性如何扩展?大致的运营成本是多少? |
| 可靠性 | 目标可靠性水平是多少? |
| 冗余 | 备份、恢复、部署、回退等 |
| 监控与检测 | 如何了解该服务的行为? |
| 故障场景 | 如何减轻可能的故障影响? |
| 安全 | 威胁模型、数据保护等 |
| 推出 | 如何推出该特性? |
| 风险与开放问题 | 已经识别出哪些风险?还有哪些未知因素? |
这个过程可以在开发周期的早期发现次优的设计决策。虽然编写文档可能看起来是额外的工作,但它能促使团队在确定实现方向之前全面考虑各种因素和权衡,从而加快整体开发速度。
1.2 实时文档
由于微服务架构较为复杂,难以在脑海中完全掌握,因此团队需要投入时间进行文档记录。对于每个服务,建议采用四层方法:概述、契约、运行手册和元数据。具体如下:
| 类型 | 摘要 |
| ---- | ---- |
| 概述 | 服务的目的、预期用途和整体架构的概述。服务概述应作为团队成员和服务用户的入口点。 |
| 契约 | 服务契约应描述服务提供的API。根据传输机制的不同,这可以是机器可读的,例如使用Swagger(HTTP API)或协议缓冲区(gRPC)。 |
| 运行手册 | 用于生产支持的文档化运行手册,详细说明常见的操作和故障场景 |
| 元数据 | 关于服务技术实现的事实,如编程语言、主要框架版本、支持工具的链接和部署URL |
这些文档应该可以在一个注册表中找到,即一个包含所有服务详细信息的单一网站。良好的微服务文档有很多用途:
- 开发人员可以发现现有服务的功能,如它们暴露的契约,从而加快开发速度并减少浪费或重复的工作。
- 值班人员可以使用运行手册和服务概述来诊断生产中的问题,因为不同的服务在操作上会有所不同。
- 团队可以使用元数据来跟踪服务基础设施并回答问题,例如“有多少服务在运行Ruby 2.2?”
有许多工具可用于编写项目文档,如MkDocs(www.mkdocs.org)。可以将它们与服务元数据方法结合使用,构建一个微服务注册表。需要注意的是,文档很难保持最新状态,因此应尽可能从应用程序状态自动生成文档。例如,可以使用swagger - ui库从Swagger YML文件生成契约文档。
1.3 回答关于应用程序的问题
作为服务所有者或架构师,经常需要全面了解应用程序的状态,以回答以下问题:
- 每种语言编写的服务有多少个?
- 哪些服务存在安全漏洞或过时的依赖项?
- 哪些上游和下游协作者使用服务A?
- 哪些服务对生产至关重要?哪些是试验性的或对关键应用程序路径不太重要?
目前,很少有工具能够将这些信息整合在一起并方便获取。这些信息通常分散在多个位置:
- 语言和框架选择需要进行代码分析或仓库标记。
- 依赖管理工具(如Dependabot)可以扫描过时的库。
- 持续集成作业可以运行任意静态分析任务。
- 网络指标和代码检测可以揭示服务之间的关系。
类似的信息可能保存在电子表格或架构图中,但这些往往过时。有人提出在每个代码仓库中嵌入一个service.yml文件,并将其作为服务元数据的来源,但目前还需要自行实现。
2. 安装Jenkins到Minikube
2.1 在Kubernetes上运行Jenkins
可以在本地的Kubernetes集群Minikube上运行Jenkins。如果从头开始,需要按照GitHub上的安装说明(https://github.com/kubernetes/minikube)安装Minikube。安装完成后,在终端运行
minikube start
启动集群。
Jenkins应用程序由一个主节点和可选的多个代理节点组成。运行Jenkins作业时,会在代理节点上执行脚本(如make)以执行部署活动。作业在一个工作区(代码仓库的本地副本)内运行。可以使用Helm在Minikube集群上安装一个“官方”的Kubernetes就绪配置的Jenkins。
2.2 设置Helm
Helm可以看作是Kubernetes的包管理器,其包格式是图表,定义了一组Kubernetes对象模板。社区开发的图表(如用于Jenkins的图表)存储在GitHub(https://github.com/helm/charts)上。
Helm由两个组件组成:
- 客户端:用于与Helm图表进行交互。
- 服务器端应用程序(也称为Tiller):负责执行图表的安装。
Helm的安装说明在GitHub(https://github.com/helm/helm)上,按照说明在本地机器上安装Helm客户端。安装完成后,需要在Minikube上设置Tiller,在命令行运行
helm init
来设置这个组件。
2.3 创建命名空间和卷
在安装Jenkins图表之前,需要创建以下两个内容:
- 一个新的命名空间:用于在集群中逻辑隔离Jenkins对象。
- 一个持久卷:用于存储Jenkins配置,即使重启Minikube也不会丢失。
创建命名空间的模板如下(保存为jenkins - namespace.yml):
---
apiVersion: v1
kind: Namespace
metadata:
name: jenkins
使用
kubectl apply -f jenkins - namespace.yml
应用该模板。
创建持久卷的模板如下(保存为jenkins - volume.yml):
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins - volume
namespace: jenkins
spec:
storageClassName: jenkins - volume
accessModes:
- ReadWriteOnce
capacity:
storage: 10Gi
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /data/jenkins/
使用
kubectl apply -f jenkins - volume.yml
应用该模板。
2.4 安装Jenkins
使用社区Helm图表安装Jenkins。首先,创建一个values.yml文件,Helm会将以下代码插入到Jenkins图表中,以设置在Minikube上运行的适当默认值:
Master:
ServicePort: 8080
ServiceType: NodePort
NodePort: 32123
ScriptApproval:
- "method groovy.json.JsonSlurperClassic parseText java.lang.String"
- "new groovy.json.JsonSlurperClassic"
- "staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods leftShift java.util.Map java.util.Map"
- "staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods split java.lang.String"
InstallPlugins:
- kubernetes:1.7.1
- workflow - aggregator:2.5
- workflow - job:2.21
- credentials - binding:1.16
- git:3.9.1
Agent:
volumes:
- type: HostPath
hostPath: /var/run/docker.sock
mountPath: /var/run/docker.sock
Persistence:
Enabled: true
StorageClass: jenkins - volume
Size: 10Gi
NetworkPolicy:
Enabled: false
ApiVersion: extensions/v1beta1
rbac:
install: true
serviceAccountName: default
apiVersion: v1beta1
roleRef: cluster - admin
然后运行以下Helm命令安装Jenkins:
helm install \
--name jenkins \
--namespace jenkins \
--values values.yml \
stable/jenkins
如果安装成功,会输出一个创建资源的列表。等待Jenkins启动几分钟后,需要一个密码来访问服务器,可以使用以下命令检索密码:
printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins - admin - password}" | base64 --decode);echo
最后,导航到登录页面:
minikube --namespace=jenkins service jenkins
使用用户名“admin”和检索到的密码登录,即可完成Jenkins的设置。
2.5 配置RBAC
Minikube默认使用基于角色的访问控制(RBAC),因此需要额外的配置步骤来确保Jenkins可以在Kubernetes集群上执行操作。具体步骤如下:
1. 登录Jenkins仪表板。
2. 导航到“凭据”>“系统”>“全局凭据”>“添加凭据”。
3. 添加一个Kubernetes服务账户凭据,将ID字段的值设置为
jenkins
。
4. 保存并导航到“Jenkins”>“管理Jenkins”>“系统”。
5. 在“Kubernetes”部分,将凭据配置为步骤3中创建的凭据,然后点击“保存”。
2.6 测试安装
可以运行一个简单的构建来确保一切正常工作。具体步骤如下:
1. 登录新的Jenkins仪表板,在左侧列中导航到“新建任务”。
2. 创建一个名为“test - job”的新管道作业,点击“确定”进入下一页。
3. 在“管道脚本”字段中配置以下脚本:
podTemplate(label: 'build', containers: [
containerTemplate(name: 'docker', image: 'docker', command: 'cat',
ttyEnabled: true)
],
volumes: [
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
]
) {
node('build') {
container('docker') {
sh 'docker version'
}
}
}
- 点击“保存”,然后在接下来的页面上点击“立即构建”,这将执行作业。
首次构建运行可能需要一些时间。构建作业完成后,导航到构建的控制台输出(http://<插入Jenkins IP地址>/job/test/1/console),如果输出与预期相符,则表示一切正常。如果有问题,首先应查看Jenkins日志:http://<插入Jenkins IP地址>/log/all。
3. 微服务相关概念与技术要点回顾
3.1 微服务的关键特性与挑战
微服务具有诸多优势,如技术异构性、减少摩擦和风险等,但也面临着设计和运营方面的挑战。在设计上,需要考虑通信、一致性、冗余等问题;在运营上,要解决监控、部署、可靠性等难题。
3.1.1 通信模式
微服务之间的通信方式主要分为异步和同步两种:
| 通信类型 | 特点 | 适用场景 | 具体模式 |
| ---- | ---- | ---- | ---- |
| 异步通信 | 服务之间解耦性强,可提高系统的可扩展性和容错性 | 对实时性要求不高的场景 | 消息队列、发布 - 订阅 |
| 同步通信 | 实时性高,但服务之间耦合度较高 | 对实时性要求较高的场景 | 直接调用 |
3.1.2 一致性模式
在分布式系统中,一致性是一个重要的问题。常见的一致性模式包括:
-
强一致性
:所有节点在同一时间看到的数据是一致的,但可能会影响系统的性能和可用性。
-
弱一致性
:允许在一定时间内节点之间的数据存在不一致,但最终会达到一致。
-
最终一致性
:是弱一致性的一种特殊情况,系统在一段时间后会自动达到一致状态。
3.2 微服务的部署与扩展
微服务的部署和扩展是确保系统高可用性和性能的关键。常见的部署方式包括:
-
容器化部署
:如使用Docker将服务打包成容器,提高服务的可移植性和隔离性。
-
集群部署
:将多个服务实例部署到集群中,通过负载均衡器进行流量分发,提高系统的可用性和性能。
在扩展方面,可以通过水平扩展(增加服务实例数量)和垂直扩展(增加单个服务实例的资源)来满足不同的业务需求。
3.3 微服务的监控与日志
监控和日志是微服务运营的重要组成部分,有助于及时发现和解决问题。常见的监控指标包括:
-
性能指标
:如响应时间、吞吐量、错误率等。
-
资源指标
:如CPU使用率、内存使用率、磁盘I/O等。
日志记录可以帮助开发人员和运维人员了解服务的运行状态,排查问题。常见的日志记录方式包括:
-
结构化日志
:将日志信息以结构化的方式记录,便于后续的分析和查询。
-
集中式日志管理
:将所有服务的日志集中存储和管理,方便统一查看和分析。
4. 微服务架构的实践建议
4.1 团队组织与协作
为了确保微服务项目的成功,团队的组织和协作至关重要。建议采用以下团队模型:
-
跨职能团队
:团队成员具备不同的技能,如开发、测试、运维等,能够独立完成一个完整的微服务的开发和部署。
-
分层团队
:将团队分为基础设施团队、平台团队和产品团队,不同层次的团队负责不同的工作,相互协作,提高开发效率。
同时,要建立良好的沟通机制和反馈机制,确保团队成员之间的信息流通顺畅。
4.2 持续交付与自动化
持续交付和自动化是微服务开发的重要原则,可以提高开发效率和质量。建议采用以下实践:
-
持续集成
:频繁地将代码集成到主干分支,并进行自动化测试,确保代码的质量。
-
持续部署
:将通过测试的代码自动部署到生产环境,减少人工干预,提高部署效率。
-
自动化测试
:包括单元测试、集成测试、端到端测试等,确保服务的功能和性能符合要求。
4.3 安全与可靠性
在微服务架构中,安全和可靠性是至关重要的。建议采取以下措施:
-
安全防护
:包括身份验证、授权、数据加密等,确保服务的安全性。
-
容错机制
:如熔断、限流、重试等,提高服务的可靠性和容错能力。
-
备份与恢复
:定期备份数据,确保在出现故障时能够快速恢复。
5. 总结
微服务架构为现代软件开发带来了诸多优势,但也面临着一些挑战。通过采用合理的设计原则、有效的团队组织和协作方式、持续交付和自动化实践以及安全可靠的保障措施,可以充分发挥微服务的优势,实现高效、稳定的软件开发和运营。
在实际应用中,要根据具体的业务需求和技术栈,选择合适的微服务架构和相关技术,不断优化和改进,以适应不断变化的市场环境和用户需求。
同时,要重视文档的编写和维护,确保团队成员和后续开发者能够快速了解系统的架构和功能。通过实时文档和设计评审等机制,可以提高系统的可维护性和可扩展性。
总之,微服务架构是一种具有广阔前景的软件开发模式,需要我们不断探索和实践,以实现更好的软件开发和业务价值。
以下是一个简单的微服务架构流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(客户端):::process --> B(API网关):::process
B --> C(服务A):::process
B --> D(服务B):::process
B --> E(服务C):::process
C --> F(数据库A):::process
D --> G(数据库B):::process
E --> H(数据库C):::process
C <--> I(消息队列):::process
D <--> I
E <--> I
这个流程图展示了一个典型的微服务架构,客户端通过API网关访问不同的服务,服务之间通过消息队列进行异步通信,每个服务都有自己独立的数据库。
超级会员免费看
82

被折叠的 条评论
为什么被折叠?



