电子说
1 关于 DevOps 及其工具
2 计划工具
3 问题跟踪
4 源码控制
5 构建工具
6 测试工具
7 持续集成(CI)和持续部署(CD)
8 配置管理工具
9 云平台
10监控和日志工具
11 通信工具
12 知识分享工具
13 总结
本篇文章中将介绍一些能够帮助你实现 DevOps 目标的核心技术类别和具体技术。
1 关于 DevOps 及其工具
关于 DevOps 及其工具,需要记住:
持续改进是目标;
DevOps 不是花钱买来的;
分阶段采用工具。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
视频教程:https://doc.iocoder.cn/video/
2 计划工具
为什么计划工具对于 DevOps 来说很重要?
分享目标;
透明性;
赋能。
计划工具示例
GitLab
GitLab 是一个基于 Web 的 DevOps 生命周期工具。它提供了一个 Git 仓库管理器,具备 wiki、问题跟踪和 CI/CD 管道功能,采用的是 GitLab 公司的开源许可。
Tasktop
Tasktop 允许将所有这些工具添加到敏捷、ALM、PPM 和 ITSM 中,实现了对整个生命周期前所未有的可见性。
CollabNet VersionOne
VersionOne 支持 Scrum、看板、XP、SAFe 和混合开发方法,并使跨团队、程序、软件组合和企业的计划、跟踪和报告变得更容易。
Pivotal Tracker
敏捷项目管理工具,是开发人员围绕高优先级共享 backlog 进行实时协作的首选工具。
Trello
Trello 是一个基于 Web 的看板风格的清单应用程序,是 Atlassian 的子公司。
很多团队用它来计划各自的工作 sprint。
Azure Boards
使用敏捷工具,包括 Scrum、看板和其他敏捷方法仪表板来更好地跟踪软件项目并进行计划。
这些都是可视化工作、分享计划、跟踪进展、确保朝着目标前进的好方法。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud
视频教程:https://doc.iocoder.cn/video/
3 问题跟踪
为什么问题跟踪对 DevOps 来说很重要?
用户响应;
减少知识损耗;
反馈闭环。
问题跟踪工具示例
Atlassian Jira
Jira 是由 Atlassian 公司开发的问题跟踪产品,提供了 bug 跟踪和敏捷项目管理功能。
JetBrains YouTrack
YouTrack 是 JetBrains 公司开发的一款基于浏览器的 bug 跟踪、问题跟踪系统和项目管理软件。它支持基于查询的问题搜索——包括自动完成、批量处理问题、定制问题属性集以及创建自定义工作流。
Zendesk
Zendesk 让客户问题跟踪变得更简单,包括优步和 Airbnb 在内的很多公司都使用 Zendesk 作为他们的问题跟踪软件。
4 源码控制
为什么源码控制对 DevOps 来说很重要?
资产管控;
减少传输损耗;
促进团队合作。
SCM 工具示例
Git
Git 是一个分布式版本控制系统,用于在软件开发期间跟踪源代码的变更。它是为协调程序员之间的工作而设计的,但它也可用于跟踪文件的变更。它专注于速度、数据完整性和对分布式、非线性工作流的支持。
GitHub
GitHub 提供了 Git 分布式版本控制和源代码管理功能,以及自有的一些特性。
GitLab
GitLab 的版本控制通过世界级的源代码管理功能帮助你的开发团队共享、协作和最大化他们的生产力。
Bitbucket
Bitbucket 是 Atlassian 公司为使用 Mercurial 或 Git 版本控制系统的源代码和开发项目提供的基于 Web 的版本控制代码库托管服务。
Subversion
Apache Subversion 是一种软件版本控制系统,采用了 Apache 开发源码许可。软件开发人员使用 Subversion 来维护文件的当前和历史版本,例如源代码、Web 页面和文档。
5 构建工具
为什么构建工具对 DevOps 来说很重要?
一致的打包效果;
自动化错误探测;
尽早发现质量问题。
构建工具示例
Maven/Gradle
Maven 是一个主要用于 Java 项目的自动化构建工具。Maven 还可以用来构建和管理用 C#、Ruby、Scala 和其他语言开发的项目。
Gradle 是一个开源的自动化构建系统,基于 Apache Ant 和 Apache Maven 的概念,引入了一种基于 groovy 的领域特定语言。
MSBuild
Microsoft Build Engine,更广为人知的名字是 MSBuild,是一个开源免费的托管代码和原生 C++ 代码构建工具集,是.Net Framework 的一部分。Visual Studio 就使用 MSBuild 作为构建工具。
Rake
Rake 是一个软件任务管理和自动化构建工具。用户可以指定任务和描述依赖关系,还可以对同一个命名空间中的组任务指定和描述依赖关系。
JFrog Artifactory
JFrog Artifactory 是一种用于保存构建过程所产生的用于发布和部署的二进制文件的工具。Artifactory 提供了多种包格式支持,如 Maven、Debian、npm、Helm、Ruby、Python 和 Docker。
JFrog 提供了高可用性、复制、灾难恢复、可伸缩性,并可集成很多自有和云存储产品。
Sonatype Nexus
Sonatype Nexus 是一个存储库管理器。可用于代理、收集和管理依赖项,这样就不用经常为一堆的 jar 文件感到烦恼。它让软件的发行变得更容易。
在内部,你可以配置构建工具,把工件发布到 Nexus,然后其他开发人员就可以使用它们了。
NuGet
NuGet 是.Net 包管理器。NuGet 客户端工具提供了生成和使用包的能力。
NuGet Gallery 是程序包作者和使用者的中心包仓库。
6 测试工具
为什么测试工具对 DevOps 来说很重要?
将注意力放在质量上;
提升产品信心。
测试工具示例
JUnit
JUnit 是一个用于 Java 的单元测试框架。JUnit 在测试驱动开发当中扮演着非常重要的角色,它是单元测试框架家族 xUnit(源于 SUnit) 的一员。
xUnit.net
xUnit.net 是一个用于.Net Framework 的开源单元测试工具,由 NUnit 的原作者开发。
Selenium
Selenium 是用于测试 Web 应用程序的框架。Selenium 提供了一个回放工具,用于编写功能测试,省去了学习脚本语言的麻烦。
Jasmine
Jasmine 是一个开源的 JavaScript 测试框架。它的目标是可以在任何支持 JavaScript 的平台上运行,不干扰应用程序或 IDE,并具有易于阅读的语法。它深受其他单元测试框架的影响,比如 Screw.Unit、JSSpec、JSpec 和 RSpec。
Cucumber
Cucumber 是一个支持行为驱动开发的工具。Cucumber BDD 方法的核心是一个叫作 Gherkin 的语言解析器,可以用用户能够理解的逻辑语言来指定预期的软件行为。
7 持续集成(CI)和持续部署(CD)
为什么持续集成和部署对 DevOps 来说很重要?
快速反馈;
减少缺陷和等待时间。
CI 工具示例
Jenkins
Jenkins 是一个免费开源的自动化服务器。Jenkins 帮助自动化软件开发过程中的非人为操作部分。它是一个基于服务器的系统,运行在 Servlet 容器中,比如 Apache Tomcat。
CircleCI
CircleCI 是全球最大的共享 CI/CD 平台,是代码从想法变成可交付产品的中心枢纽。
作为最常用的 DevOps 工具之一,CircleCI 每天要处理超过 100 万个构建任务,它可以访问到工程团队协作以及代码运行的数据。Spotify、Coinbase、Stitch Fix 和 BuzzFeed 等公司都使用 CircleCI 来提高工程团队的工作效率,发布更好的产品。
Travis CI
Travis CI 是一个托管的 CI 服务,用于构建和测试托管在 GitHub 上的软件项目。Travis CI 为私人项目提供各种付费计划和免费开源计划。TravisPro 部署在客户自己的硬件上,提供专有版本的定制部署。
Concourse
Concourse 是一个用 Go 开发的自动化系统,最常用于 CI/CD,用于伸缩任何类型 (从简单到复杂的) 的自动化管道。
AWS CodePipeline
AWS CodePipeline 是一个全托管的 CD 服务,可以帮助你自动化发布管道,以便快速可靠地更新应用程序和基础设施。
每当发生代码变更时,CodePipeline 会根据你定义的发布模型自动化发布过程的构建、测试和部署阶段,让你能够快速、可靠地交付特性和更新。
你可以轻松地将 AWS 代码管道与第三方服务 (如 GitHub) 或自定义插件集成。在使用 AWS CodePipeline 时,你只需要为所使用的内容付费,没有预付费用。
Azure Pipelines
为 Linux、macOS 和 Windows 建立云托管管道。构建 Web、桌面和移动应用程序,并将其部署到云端或本地。
通过管道自动化构建和部署,减少在具体细节上花费的时间,把更多的时间花在创造性的事情上。
CD 工具
为什么 CD 工具对于 DevOps 来说很重要?
减少预发布库存;
自动化复杂的管道;
统一团队为客户创造价值的目标。
CD 工具示例
Spinnaker
Spinnaker 是一个免费开源的 CD 软件平台,最初由 Netflix 开发,后被谷歌收购,并进行了扩展。
Spinnaker 是一个多云 CD 平台,用于快速发布软件变更。它将强大而灵活的管道管理系统与主要云提供商的集成结合在了一起。
Octopus Deploy
Octopus Deploy 是一个自动化的部署和发布管理工具,全球领先的 CD 团队都在使用它。
Octopus 是一个工具集,可以极大简化 DevOps 过程,通过云或虚拟机对大量微服务或应用程序进行持续测试和部署。
AWS CodeDeploy
AWS CodeDeploy 是一种全托管的部署服务,可以将软件部署自动化到各种计算服务,如 Amazon EC2、AWS Fargate、AWS Lambda 和本地服务器。
你可以使用 AWS CodeDeploy 来自动化软件部署,减少容易出错的手动操作。
8 配置管理工具
配置管理工具为什么对于 DevOps 来说很重要?
保持一致性;
基础设施即代码。
配置管理工具示例
Terraform
Terraform 是 HashiCorp 公司开发的开源基础结构即代码 (IaC) 软件工具。用户可以使用一种高级配置语言 (叫作 Hashicorp 配置语言或 JSON) 来定义和提供数据中心基础设施。
BOSH
BOSH 是一个将小型和大型云软件的发布工程、部署和生命周期管理结合起来的项目。BOSH 可以基于数百个 VM 配置和部署软件。它还可以执行监空、故障恢复和软件更新,没有停机时间或者停机时间很短。
虽然开发 BOSH 是为了部署云计算,但它也可以用于部署几乎任何其他软件 (例如 Hadoop)。BOSH 特别适合大型分布式系统。
此外,BOSH 还支持多种基础设施即服务 (IaaS) 提供商,如 VMware vSphere、谷歌云平台、Amazon Web Services EC2、Microsoft Azure、OpenStack 和阿里巴巴云。BOSH 提供了一个云供应商接口 (CPI),用户可用它扩展 BOSH,以便支持其他 IaaS 提供商,如 Apache CloudStack 和 VirtualBox。
Chef
Chef 是一个配置管理工具,用于处理物理服务器、虚拟机和云端的机器配置。很多公司用 Chef 控制和管理他们的基础设施,如 Facebook、Etsy、Cheezburger 和 Indiegogo。
Chef 公司是持续自动化软件的领导者、应用自动化的革新者以及 DevOps 运动的发起者之一。Chef 与全球 1000 多家最具创新性的公司合作,提供快速交付软件的实践和平台,以实现他们的数字化转型愿景。
Ansible
Ansible 是一款开源的软件配置、配置管理和应用程序部署工具。它运行在 Unix 家族系统上,可以配置 Unix 家族系统和 Windows。它可以使用自己的声明性语言来描述系统配置。
Puppet
Puppet 提供了定义系统需要哪些软件和配置的能力,然后在初始设置之后维护指定的状态。
Puppet 使用与 Ruby 类似的声明性领域特定语言 (DSL) 为特定环境或基础设施定义配置参数。Puppet 通过使用一个叫作 Facter 的实用程序来发现系统信息,Facter 是在安装 Puppet 软件包时一起安装的。
Puppet 主节点通过清单来管理它所控制的所有节点的重要配置信息。
被主节点控制的其他节点安装了 Puppet 并运行 Puppet 代理 (一个守护进程)。代理节点收集的有关节点的配置信息将发送给主节点。主节点根据应该如何配置来编译目录,其他节点使用这些信息来更新自己的配置。
Puppet 使用了拉取模式,代理节点定时轮询主机,查询特定于站点和特定于节点的配置。在这个基础设施中,Puppet 代理应用程序通常作为后台服务运行在托管节点上。
谷歌云部署管理器
谷歌云部署管理器是一种基础设施管理服务,让谷歌云平台资源的创建、部署和管理变得更简单。
9 云平台
为什么云平台对 DevOps 来说很重要?
友好的自动化;
具有可观察性的运行时。
云平台示例
Amazon Web Service
Amazon Web Service(AWS) 是一个安全的云服务平台,提供计算能力、数据库存储、内容交付和其他帮助企业扩大规模和增长的功能。
简而言之,AWS 可以做以下这些事情:
在云端运行 Web 和应用服务器,托管动态网站;
将所有文件安全地存储在云端,这样你就可以从任何地方访问它们;
使用托管数据库,如 MySQL、PostgreSQL、Oracle 或 SQL Server 来存储信息;
使用内容分发网络 (CDN) 在世界各地快速交付静态和动态文件;
批量发送电子邮件给你的客户。
微软 Azure
微软 Azure 是微软创建的云计算服务,通过微软数据中心构建、测试、部署和管理应用程序和服务。
微软 Azure,原来叫作 Windows Azure,是微软的公共云计算平台。它提供一系列云服务,包括计算、分析、存储和网络。用户可以选择这些服务来开发和扩展新的应用程序,或者在公共云中运行现有的应用程序。
谷歌云平台
谷歌云平台由谷歌提供,是一套云计算服务,运行在谷歌用来运行其终端用户产品 (如谷歌搜索、Gmail 和 YouTube) 相同的基础设施上。
谷歌云平台提供在 web 上部署应用程序所需的计算资源,专注于为个人和企业提供一个构建和运行软件的地方,并通过 Web 连接软件用户。
你使用谷歌提供的云计算服务来迎接业务方面的挑战,包括数据管理、混合和多云、人工智能和机器学习。
Pivotal Cloud Foundry
Pivotal Cloud Foundry (PCF) 是一个开源的多云应用平台即服务 (PaaS),由 501 组织 Cloud Foundry Foundation 负责管理。该软件最初由 VMware 开发,后来转到 Pivotal 软件公司。2019 年底,随着 VMware 收购 Pivotal,又被带回到 VMware。
PCF 是一个用于部署、管理和持续交付应用程序、容器和功能的多云平台。PCF 允许开发人员快速部署和交付软件,而不需要管理底层基础设施。
Heroku
Heroku 是一个支持多种编程语言的云 PaaS。作为首批云平台之一,Heroku 从 2007 年 6 月就开始开发,当时它只支持 Ruby 编程语言,但现在支持 Java Node.js、Scala、Clojure、Python、PHP 和 Go。
Heroku 是一个基于容器的云 PaaS。开发人员使用 Heroku 来部署、管理和扩展现代应用程序。这个平台优雅、灵活、易于使用,为开发人员提供了发布应用程序最简单的途径。
中国云厂商(编者补充)
阿里云、腾讯云、华为云、京东云等各类型厂商都是国内用户的可选项。
容器调度器
容器调度程序的主要任务是在最合适的主机上启动容器并将它们连接在一起。它必须通过自动故障转移来处理故障,并且当单个实例有太多数据需要处理 / 计算时,它需要能够扩展容器。
三个最流行的容器调度器是 Docker Swarm、Apache Mesos 和 Kubernetes。
Docker Swarm
Docker Swarm 是 Docker 开发的一种容器调度程序。这个集群解决方案提供了一些优势,比如使用标准 Docker API 等。
Apache Mesos
Mesos 的目的是构建一个可扩展、高效的系统,可以支持大量的框架。这也是一个主要的问题:一些框架,如 Hadoop 和 MPI,是独立开发的——因此不可能在框架之间进行细粒度的共享。
Mesos 的目的是添加一个薄薄的资源共享层,为框架提供访问集群资源的公共接口。Mesos 将调度控制委托给框架,因为很多框架已经实现了复杂的调度。
根据集群上运行的作业类型,框架可以分为四种,其中一些框架提供了原生 Docker 支持,比如 Marathon。在 Mesos 0.20.0 中添加了对 Docker 容器的支持。
Kubernetes
Kubernetes 是一个用于编配 Docker 容器的系统,它通过标签和 Pod 的概念将容器分为逻辑单元。Pod 是 Kubernetes 和其他两种解决方案之间的主要区别——它们是一组容器集合,形成一起部署和调度的服务。与基于关联性的容器 (如 Swarm 和 Mesos) 调度相比,这种方法简化了集群的管理。
Kubernetes 调度器的任务是监控带有空 PodSpec 的 Pod。NodeName 指定将容器安排在集群中的某个位置。
这是与 Swarm 和 Mesos 的不同之处,Kubernetes 允许开发者在运行 Pod 时通过定义 PodSpec.NodeName 来绕过调度器。
调度器使用谓词和优先级来定义 Pod 应该运行在哪些节点上。我们可以使用新的调度器策略配置覆盖这些默认值。
我们可以通过命令行标志 policy-config-file 指定一个 JSON 文件,在启动 Kubernetes 时将会使用该文件描述的谓语和优先级,调度器将使用这些定义好的策略。
10监控和日志工具
为什么监控和日志工具对于 DevOps 来说很重要?
快速恢复;
响应速度;
透明性;
发生事故时减少人工干预。
监控和日志工具示例
ELK
ELK 是三个开源产品的集合——Elasticsearch、Logstash 和 Kibana。它们都是由 Elastic 公司开发、管理和维护的。
E 代表 ElasticSearch——用于存储日志;
L 代表 Logstash——用于传输、处理和存储日志;
K 代表 Kibana——一个可视化工具 (Web 界面)。
Datadog
Datadog 是一个针对云规模应用程序的监控服务,通过基于 SaaS 的数据分析平台来监控服务器、数据库、工具和服务。
Datadog 应用程序性能监控 (APM 或跟踪) 帮助用户深入了解应用程序性能——从自动生成的仪表盘(监控关键指标,如请求量和延迟)到单个请求的详细跟踪信息——与日志和基础设施监控信息并列展示。
当向应用程序发出请求时,Datadog 可以看到分布式系统的跟踪,并向用户显示关于这个请求的系统数据。
New Relic
New Relic 是一家总部位于加州旧金山的科技公司,它开发基于云的软件,帮助网站和应用程序所有者跟踪服务性能。
New Relic 的应用程序性能监控软件分析产品 (APM) 提供有关 Web 应用程序性能和最终用户体验满意度的实时和趋势数据。
Prometheus
Prometheus 是一款用于事件监控和警报的免费应用程序。它在时间序列数据库中记录实时指标,基于 HTTP 拉取模型,支持灵活的查询和实时警报。
Prometheus 服务器的核心原理是抓取——也就是说,调用各个节点暴露出来的指标端点。它定期收集这些指标并将它们存储在本地。
Zipkin
Zipkin 是一个分布式跟踪系统。它用于收集诊断延迟问题所需的时间数据,提供了数据的收集和查找功能。
如果日志文件中有跟踪 ID,则可以直接跳指定位置。否则的话,你可以基于服务、操作名称、tagsm 和持续时间等属性进行查询。它将为你汇总出一些有趣的数据,例如花费在服务上的时间百分比以及操作是否失败。
Azure Monitor
Azure Monitor 提供了一个全面的解决方案,用来收集、分析和执行来自云端和本地环境的遥测数据,从而最大化应用程序和服务的可用性和性能。
它可以帮助你了解应用程序的执行情况,并主动识别影响它们的问题以及它们所依赖的资源。
几个 Azure Monitor 的使用场景:
使用 Application Insights 检测和诊断应用程序和依赖项之间的问题;
将基础设施问题与用于 VM 的 Azure Monitor 和用于容器的 Azure Monitor 关联起来;
使用日志分析深入监控数据,进行故障排除和深入诊断;
通过智能警报和自动运维支持大规模操作;
使用 Azure 仪表板和工作簿进行可视化。
11 通信工具
为什么通信工具对于 DevOps 来说很重要?
连接团队;
减少等待时间;
改进团队协作。
通信工具示例
Slack
Slack 是由 Slack 公司开发的即时通讯平台。
Slack 本质上是整个公司的一个聊天室,旨在取代电子邮件成为沟通和分享的主要方式。你可以用频道进行分组讨论,也可以通过私有消息进行信息、文件共享,等等。
微软 Teams
微软 Teams 是一个统一的通信和协作平台,结合了工作讨论、视频会议、文件存储和应用程序集成。
Teams 是一种基于聊天的协作工具,它为全球、远程和分布式的团队提供协作能力,并通过公共空间共享信息。你可以使用它提供的一些很酷的功能,比如文档协作、一对一聊天、团队聊天,等等。
谷歌 Hangouts
谷歌 Hangouts 是谷歌开发的一款通讯软件产品。Hangouts 最初是 Google+ 的一个功能,在 2013 年谷歌开始将 Google+ Messenger 和谷歌 Talk 的功能整合到 Hangouts 中,成为了一个独立的产品。
Hangouts Chat 是进行组织内交流的一种有效方式。你可以与一名或多名同事发送信息,可以创建聊天室进行多人讨论,并使用机器人来进行工作自动化。你可以在电脑浏览器和 Android 或 iOS 手机 App 中使用 Hangouts Chat。
Zoom
Zoom Video Communications 是一家远程会议服务公司,总部设在加利福尼亚州的圣何塞。它提供了一种远程会议服务,结合了视频会议、在线会议、聊天和移动协作。
Skype 更适合寻找整体商业解决方案的团队,而 Zoom 更适合频繁进行视频聊天和会议的团队。不过,这两种工具都不是专门为远程工作而构建的。
中国版本推荐
腾讯会议、钉钉、飞书、WeLink 等。
12 知识分享工具
知识分享工具为什么对于 DevOps 来说很重要?
减少知识浪费;
提高新员工的效率;
减少犯同样的错误。
知识分享工具示例
GitHub Pages
GitHub Pages 是一个静态站点托管服务,直接从 GitHub 上的存储库获取 HTML、CSS 和 JavaScript 文件,可在构建过程中运行这些文件,然后发布网站。你可以在 GitHub Pages 示例集合中看到 GitHub Pages 站点的示例。
Confluence
Confluence 是一个由 Atlassian 开发并发布的协作程序。Atlassian 用 Java 编程语言开发了 Confluence,并于 2004 年首次发布。
Confluence 是一个 Wiki 协作工具,用于帮助团队有效地协作和共享知识。你可以用 Confluence 捕获项目需求、将任务分配给特定用户,并用 Team Calendar 插件一次性管理多个日历。
Jekyll
Jekyll 是一个支持博客的静态站点生成器,用于个人、项目或组织站点。它是由 GitHub 联合创始人 Tom Preston-Werner 用 Ruby 开发的,并采用了 MIT 开源许可。
Jekyll 是一个解析引擎,打包成 Ruby gem,用来基于动态组件构建静态网站。
谷歌 Sites
谷歌 Sites 是谷歌提供的一个结构化的 Wiki 和网页制作工具。谷歌 Sites 的目标是让任何人都能够创建支持不同编辑器协作的简单 Web 站点。
这些站点在每一个屏幕上(从桌面到智能手机)看起来都很棒——做到这些都不需要学习设计或编程。
13 总结
这篇文章涵盖的所有类别可以帮助你更好地实施 DevOps。其中任何一种都很有用,而且我认为所有这些都是你需要的,帮助团队以可持续的方式向客户交付价值,并帮助你脱颖而出。
我提到了 DevOps 工具链,比如规划工具、问题跟踪工具、源代码控制管理、构建和测试代码、持续集成和部署源代码、管理配置、使用云平台,然后是监控和日志,以及沟通和知识共享。
我希望你能够喜欢这篇文章。DevOps 是一种令人兴奋的工作方式,尽管它不是唯一的方式,甚至不是最好的方式。更好的东西可能会在未来出现,但目前看来,它似乎代表了一种很好的团队协作方式。它让团队共同努力,交付价值,同时也帮助他们专注于客户,而不仅仅是技术或内部的东西,也包括了速度、学习以及公司的未来。
责任编辑:彭菁
全部0条评论
快来发表一下你的评论吧 !