云计算开发服务平台毕业设计(论文).docx

上传人:红**** 文档编号:91480544 上传时间:2023-05-27 格式:DOCX 页数:32 大小:3.07MB
返回 下载 相关 举报
云计算开发服务平台毕业设计(论文).docx_第1页
第1页 / 共32页
云计算开发服务平台毕业设计(论文).docx_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《云计算开发服务平台毕业设计(论文).docx》由会员分享,可在线阅读,更多相关《云计算开发服务平台毕业设计(论文).docx(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、毕业设计(论文)课题名称:云计算开发服务平台目录前言II第一章系统概述11.1先电云计算平台架构11.2 支撑的多种开发环境2第二章系统配置52.1 前提条件5第三章安装PAAS软件73.1 安装前准备73.2 建立安装资源库和安装依赖组件73.3 配置域名服务(DNS)83.4 安装和配置MongoDB数据库93.5 安装和配置ActiveMQ消息管理服务93.6 安装Puppet MColltive Client端103.7 安装PaaS Broker配置身份服务113.8 PaaS Broker Plugin的安装123.9 PaaS Broker Web Console 的安装143.

2、10 安装Node 容器节点153.10.1 Broker/Node All-In-One 安装153.10.2 Broker/Node 分开双结点安装153.11 配置多租户16第四章使用PAAS平台上部署应用174.1 Git 使用说明174.1.1 Git 客户端174.2 Git Server184.2.1 本地SSH Git 库搭建184.3 部署RHC 客户端管理软件194.3.1 RHC 基本环境194.3.2 配置RHC19第五章使用PAAS平台部署应用和开发环境215.1 Jenkins Server215.2 WordPress 博客系统235.3 部署Node.js项目实

3、践:构建可扩展的Web应用26总结27致谢28参考文献29前言云计算(cloud computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。过去在图中往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象。对云计算的定义有多种说法。对于到底什么是云计算,至少可以找到 100 种解释。目前广为接受的是中国云计算专家咨询委员会副主任、秘书长刘鹏教授,著云台团队给出的定义:“云计算是通过网络提供可伸缩的廉价的分布式计算能力”。云计算代表了以虚拟化技术为核心、以低成本为目标的动态可扩展网络应用基础设

4、施,是近年来最有代表性的网络计算技术与模式。云计算是继 1980 年代大型计算机到客户端-服务器的大转变之后的又一种巨变。云计算(Cloud Computing)是分布式计算(Distributed Computing)、并行计算(ParallelComputing)、效用计算(Utility Computing)、网络存储(Network Storage Technologies)、虚拟化(Virtualization)、负载均衡(Load Balance)等传统计算机和网络技术发展融合的产物。云计算通过使计算分布在大量的分布式计算机上,而非本地计算机或远程服务器中,企业数据中心的运行将与互

5、联网更相似。这使得企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统。根据 NIST 的权威定义,云计算有 SPI,即 SaaS、PaaS 和 IaaS 三大服务模式。这是目前被业界最广泛认同的划分。中国电子科技集团公司第 55 研究所是国家军工骨干研究所之一。南京第五十五所技术南京第五十五所技术开发有限公司()创办于 1987 年,是五十五研究所直属全资公司,公司业务主要涉及建筑智能化、物联网技术应用、云计算技术应用、教学仪器设备、智慧校园、智能电网等。公司研发推出的先电云计算技术与服务平台采用符合国际云计算标准的、主流云计算厂商、服务商所n纳的三层架构,基于统一的云安全框架搭建

6、。本文主要讲述先电云计算开发服务平台的构建方法,该平台基于基于业界领先的OpenShift 开源框架,安装和维护中间件、数据库、操作系统、开发环境在内的各类型软件资源,提供给各应用模型和接口,支持用于 Java、Python、PHP、Perl 和 Ruby 等应用开发的框架。采用分布式技术方案解决分布式存储和分布式计算,包含 SQL 和 NoSQL 数据存储,实现平台即服务(PaaS)功能。OpenShift 为云计算的开发人员提供全面的功能集合。关键词:云计算 PAAS VMware centos6.5 II第一章系统概述1.1先电云计算平台架构先电云计算平台架构即服务(PaaS),是一个面

7、向开发人员的开发平台。支持用于 Java、Python、PHP、Perl 和 Ruby 的更多的开发框架,包括 Spring、Seam、Weld、CDI、Rails、Rack、Symfony、Zend Framework、Twisted、Django 和 Java E。它包含 SQL 和 NoSQL 数据存储和一个分布式文件系统。为云计算的开发人员提供全面的功能集合。先电云计算平台架构让用户可以创建、部署、管理云端应用,其云环境可以基于先电IaaS 平台,先电 IaaS 基于磁盘空间、CPU 计算资源、内存资源、网络连接,提供虚拟主机供 PaaS 平台使用。PaaS 的主要组件包括:系统的组件

8、说明:1) 控制节点:是所有应用管理活动的入口。它主要负责管理用户登录、DNS、应用状态以及应用服务编排(服务分发)。用户和控制节点交互主要是通过 Web 管理控制台、CLI 工具或者接口 REST APIs。2) 应用套件:应用容器为应用运行提供了实际所需的功能。每个应用容器提不同的开发环境软件包,包括服务器,比如 Tomcat、JBoos、NodeJs、Apache;同是提供运行环境支撑库,比如 Java 、PHP、Python、Ruby、Perl,同事提供数据库支持,包括 MySQL、MongoDB 等。3) 应用容器:先电 PaaS 是通过容器提供应用运行环境和隔离。l 容器:提供了给

9、应用套件运行的容器。一个容器可以运行一个或多个应用。容器可以为应用套件提供按需分配的的内存与磁盘空间。l 节点:一台物理机或虚拟机,其中包含多个容器。因为某些容器与并不都是处于运行中,所以一个节点通常会处于超配额状态,即放入了超过限额个数的容器。l 区域:区域定义了一些节点,其中的容器可以方便地进行基于节点的负载均衡。4) 系统的架构图如下:图1.1 Paas 系统架构图1.2 支撑的多种开发环境先电 PaaS 平台支持不同应用类型关系数据库、NoSQL 数据库、Hadoop 分布式文件系统;支持 Tomcat、JBoss、PHP Server 等应用服务器,可以在其之上部署远程办公、电子商务

10、、在线学习等各种 SaaS 应用。此外,OpenShift 也提供了 DNS 域名管理。图2 .1 PAAS支持的主流的开源开发框架基于先电 PaaS 平台,用户可以部署包括企业应用服务器、在线办公、博客系统、电子商务、e-learning 服务、云计算工具、网盘服务、文档阅读服务、开发工具套件、邮件服务等。搭建起 SaaS 应用服务平台,如下:图2.2 基于paas可以支撑搭建的软件第二章系统配置2.1 前提条件先电 PaaS 平台部署在先电 IaaS 平台的虚拟机上,虚拟机采用 64 位的 CentOS 6.5 的操作系统。部署 Centos6.5 选择最小安装,或者最小安装加桌面。Paa

11、S 平台组件包括 Broker 控制部分,包括 Node 容器节点。部署的方案在用选用 Broker和 Node 安装在一台虚拟机之上的方案(All-In-One),或者 Broker 和 Node 分别安装在两台虚拟机上。2.2 网络设置安装 PaaS 的 VM 的网络 IP 采用 IaaS 的外部 IP,IP 设置成静态 IP。网络架构如下:图2.1 网络架构图在配置完网络接口之后,重启启动网络服务使更改生效:(1) 更改主机名(2) 在/etc/hosts 文件中修改 Broker 控制节点主机名。(3) 修改 SELinux 模式为 enforcing,然后重启。(4) 删除/etc/

12、yum.repos.d 路径下的所有 repo 文件,将提供的 repo 文件拷贝到该目录下。(5) 编辑各个 repo 文件,修改成从控制节点的 ftp 路径下获取包。修改方法:1、修改 openshift-base.repo 文件baseurl=ftp:/10.0.0.120/openshift-base (注:ip 地址为控制节点的内网 ip 地址,下同)enabled=1gpgcheck=02、修改 openshift-epel.repo 文件baseurl=ftp:/10.0.0.120/openshift-epelenabled=1gpgcheck=03、修改 openshift-

13、origin.repo 文件baseurl=ftp:/10.0.0.120/openshift-origin (注:未注释的那行)enabled=1gpgcheck=04、修改 openshift-origin-dependencies.repo 文件baseurl=ftp:/10.0.0.120/openshift-origin-dependenciesenabled=1gpgcheck=0第三章安装PAAS软件3.1 安装前准备安装本系统的执行脚本:执行命令 yum install paas-xiandian根据自己的网络规划和 PaaS 平台部署设计,修改/etc/xiandian/co

14、nfig.ini 文件文件 config.ini 内容:#配置 broker 节点主机名 hostA_HOST= paas#配置 node 节点主机名 hostB_HOST=node#配置域名 A_DOMAIN=#配置 broker 节点 IPA_IP=192.168.1.130#配置 node 节点 IPB_IP=192.168.1.131#配置数据库密码A_DBPASSWORD=000000#配置 admin user 密码ADMINPASSWORD=000000#repo_dirREPOBASE=ftp:/192.168.1.120/#配置网页登录用户名HTUSER=demo#配置网页登

15、录密码HTPASSWORD=000000修改配置文件后,执行脚本 runbefore.sh。脚本完成相关配置(config)文件的建立根据提供的 yum 源地址配置 yum 源配置文件。3.2 建立安装资源库和安装依赖组件系统安装需要建立安装源、系统运行需要 NTP 服务、运行库依赖 Ruby。当使用 all-in-one 方案时,执行脚本 paas-pre-host.sh;当分开安装时,Broker 节点执行脚本 paas-pre-host.sh,Node 节点执行 paas-pre-node.sh。然后重启机器,以此完成 repo 的安装、NTP 的安装、Ruby 安装。NTP(Netwo

16、rk Time Protocol),是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS 等等)做同步化,它可以提供高精准度的时间校正(LAN 上与标准间差小于 1 毫秒,WAN 上几十毫秒),且可介由加密确认的方式来防止恶意的协议攻击。CentOS 系统需要安装和设置 SCL Ruby193.Ruby 是 PaaS 平台运行的依赖开发环境。paas-pre-host.sh 执行结果:图3.2.1成功结果3.3 配置域名服务(DNS)PaaS 的部署环境和应用访问,依赖 DNS 域名服务框架。确保控制节点和计节点主机访问,解析 PaaS 在节点容器上(Gear

17、)部署的应用的域名访问。域名 DNS 需要安装和配置 BIND来实现。在 all-in-one 的虚拟机或分开安装的 Broker 节点执行脚本.paas-pre-broker.sh成功标志:图3.3.1 成功标志3.4 安装和配置MongoDB数据库PaaS 系统使用的数据库为 NoSQl 类型的数据库 MongoDB。MongoDB 存储用户(user)、容器(Gear)和其他必要的信息。MongoDB 是文档数据存储系统,使用 JavaScript 语法进行命令交互,使用 JSON 格式存储信息。在 all-in-one 的虚拟机或分开安装的 Broker 节点执行脚本:paas-ins

18、tall-mongodb.sh执行后的结果脚本完成的主要工作有 MongoDB 的安装、创建 MongoDB 的用户“Openshift”,配置后通过 Mongo 客户端命令进行操作验证。成功标志:图3.4.1 成功标志3.5 安装和配置ActiveMQ消息管理服务ActiveMQ 消息服务管理器,存储各个消息客户端发送来和派发出去的消息,不限制客户端应用的实现方式,实现不同编程语言的程序直接的通讯, PaaS 使用 ActiveMQ 完成控制节点(Broker)和资源节点(Node)直接的通讯。在 all-in-one 的虚拟机或分开安装的 Broker 节点执行脚本:paas-instal

19、l-activemq.sh该脚本完成 ActiveMQ、ActiveMQ Client 的安装,ActiveMQ 运行依赖 Jetty Web 应用服务器。成功标志:图3.5.1 成功标志安装完成后,登录 ActiveMQ。http:/IP:8161 需要修改 jetty.xml 其中的 127.0.0.1 为 0.0.0.0图3.5.2 验证成功标志3.6 安装Puppet MColltive Client端在控制 Broker、容器 Node 使用 MCollective 作为消息客户端同消息服务器 ActiveMQ 进行消息通讯, MCollective 实现 Node 节点向 Brok

20、er 中 ActiveMQ 消息服务器的消息发送和接受。在 all-in-one 的虚拟机或分开安装的 Broker 节点执行脚本:paas-install-mcollective.sh成功标志:图3.6.1 成功标志3.7 安装PaaS Broker配置身份服务PaaS Broker 是 PaaS 控制系统,管理所有的容器节点(Node)、应用部署、应用,同时提供了通过 Web Console 进行控制的 Web 界面。PaaS Node 是 PaaS 的容器节点,内部是内容的应用套件,这些应用套件通过PaaS Broker部署和启动,提供给最终用户使用。二者之间通过 MCollective

21、 和 ActiveMQ 实现消息传递和调用。在 all-in-one 的虚拟机或分开安装的 Broker 节点执行脚本:paas-install-broker.sh在脚本执行过程中,要求输入 key 加密随机数,重复输入 2 次回车,等待脚本执行完成。图3.8.1 成功标志该脚本完成 PaaS 认证、消息、域名等功能模块,安装后配置 http 服务,部署 PaaS amdin和 PaaS Console Web 应用。成功标志:图3.7.1 成功标志3.8 PaaS Broker Plugin的安装PaaS Broker 使用插件(Plugin)连接系统安装的服务和 Broker 的对应服务,

22、对应的插件分别是 DNS、Authentication、消息插件。安装插件后,同时进行正确配置。在 all-in-one 的虚拟机或分开安装的 Broker 节点执行脚本:paas-install-broker-plugins.sh执行脚本后启动 Broker服务。通过访问Broker的API json服务进行验证是否安装正确:执行命令:Curl -u root:123456 http:/localhost:8080/broker/rest/api.json成功标志:执行后返回 APIs 的 JSON 描述:api_version:1.6,data:API:href:http:/localho

23、st:8080/broker/rest/api,method:GET,optional_params:,rel:API entrypoint,required_params:,GET_ENVIRONMENT:href:http:/localhost:8080/broker/rest/environment,method:GET,optional_params:,rel:Get environmentinformation,required_params:,GET_USER:href:http:/localhost:8080/broker/rest/user,method:GET,optiona

24、l_params:,rel:Get userinformation,required_params:,ADD_DOMAIN:href:http:/localhost:8080/broker/rest/domains,method:POST,optional_params:default_value:null,description:A list of gearsizes that are allowed to be created on thisdomain,name:allowed_gear_sizes,type:array,valid_options:small,medium,rel:Cr

25、eate newdomain,required_params:description:Name of thedomain,invalid_options:,name:name,type:string,valid_option80/broker/rest/domains,method:GET,optional_params:,rel:List all domains you have accessto,required_params:,LIST_DOMAINS_BY_OWNER:href:http:/localhost:8080/broker/rest/domains,method:GET,op

26、tional_params:,rel:Listdomains,required_params:description:Return only thedomains owned by the specified user id or identity. Use self torefer to the currentuser.,invalid_options:,name:owner,type:string,valid_options:self,*,SHOW_DOMAIN:href:http:/localhost:8080/broker/rest/domain/:name,method:GET,op

27、tional_params:,rel:Retrieve a domain by itsname,required_params:description:Unique name of thedomain,invalid_options:,name:name,type:string,valid_options:,SHOW_APPLICATION_BY_DOMAIN:href:http:/localhost:8080/broker/rest/domain/:domain_name/application/:name,method:GET,optional_params:,rel:Retrieve a

28、napplication by its name anddomain,required_params:description:Unique name of thedomain,invalid_options:,name:domain_name,type:string,valid_options:,description:Name of theapplication,invalid_options:,name:name,type:string,valid_options:,LIST_CARTRIDGES:href:http:/localhost:8080/broker/rest/cartridg

29、es,method:GET,optional_params:,rel:Listcartridges,required_params:,LIST_APPLICATIONS:href:http:/localhost:8080/broker/rest/applications,method:GET,optional_params:,rel:Listapplication,required_params:,SHOW_APPLICATION:href:application/:id/editn Grant edit access to a single application.Valid for abo

30、ut 1 month.n* application/:id/adminn Grant fulladministrative access to a single application. Valid for about 1month.,name:scope,type:string,valid_options:session,read,userinfo,domain/:id/view,domain/:id/edit,domain/:id/admin,application/:id/view,application/:id/edit,application/:id/admin,default_va

31、lue:null,description:A description to remind you what this authorization isfor.,name:note,type:string,valid_options:,default_value:-1,description:The number of seconds before thisauthorization expires. Out of range values will be set to themaximum allowedtime.,name:expires_in,type:integer,valid_opti

32、ons:,default_value:false,description:Attempt to locate andreuse an authorization that matches the scope and note and has notyetexpired.,name:reuse,type:boolean,valid_options:true,false,rel:Add newauthorization,required_params:,LIST_QUICKSTARTS:href:http:/localhost:8080/broker/rest/quickstarts,method

33、:GET,optional_params:,rel:Listquickstarts,required_params:,SHOW_QUICKSTART:href:http:/localhost:8080/broker/rest/quickstart/:id,method:GET,optional_params:,rel:Retrieve quickstartwith :id,required_params:description:Unique identifierof thequickstart,invalid_options:,name:id,type:string,valid_options

34、:,messages:,status:ok,supported_api_versions:1.0,1.1,1.2,1.3,1.4,1.5,1.6,type:links,version:3.9 PaaS Broker Web Console 的安装PaaS Broker 的Web Console 是PaaS 系统管理员使用的交互Web 应用。通过Console 可以创建应用、部署应用、更新密码等。在all-in-one 的虚拟机或分开安装的Broker 节点执行脚本:paas-install-webconsole.s执行脚本后启动Broker 服务。通过访问Broker 的API json 服务

35、进行验证是否安装正确:成功标志:安装完成后登录: 查看网页是否正确图3.9.1 成功标志3.10 安装Node 容器节点截止到以上步骤,PaaS Broker 控制节点安装完成。以下进入容器节点的安装,通过容器节点的安装实现应用套件(Cartridge)的准备,安装完成后,即可部署应用或中间件。Node 节点的安装分多种方式,可以选择Broker 和Node 安装在一个机器内部(All-In-One)的方式;也可以分开(分布式)部署,一个Broker 节点,多个Node 节点。以下介绍All-In-One和双节点部分的部署。3.10.1 Broker/Node All-In-One 安装Bro

36、ker 控制节点和Node 容器节点安装在一起,构建一个测试PaaS 运行环境。在all-in-one 的虚拟机或分开安装的Broker 节点执行脚本:paas-node-install-allinone.sh执行脚本执行成功后,启动后即可通过浏览器访问。成功标志:图3.10.1 成功标志3.10.2 Broker/Node 分开双结点安装Broker 控制节点和Node 容器节点安装在2 个机器中,构建一个分布部署的PaaS 运行环境。Broker 节点执行脚本:paas-node-install-controller.shnode 节点执行脚本:paas-node-install-node

37、.sh安装完成后登录: 查看网页是否正确。3.11 配置多租户一个容器节点可以部署多个中间件或应用,每个应用或中间件的访问通过域名访问,通过域名前缀(二级域名)进行隔离。执行多租户的配置,完成整合PaaS 平台的安装。在all-in-one 的主节点或分开安装的node 节点执行脚本:paas-config-multi-tenancy.sh成功标志:执行完本步骤,完成整合PaaS 平台的安装,即可进行应用或中间件的部署。重新启动服务器,执行命令#rebootPssS 软件安装完成。第四章使用PAAS平台上部署应用PaaS 提供了开发语言、中间件、应用系统。开发的代码通过配置代码库(Git Se

38、rver 库)进行下载和更新。4.1 Git 使用说明Git 是版本控制系统,类似CVS,Subversion 版本管理软件。Git 目前应用广泛,特别是Github 在线管理代码服务在全球的影响,使得Git 版本管理方式成为主流。目前先电PaaS 的部分应用通过GitHub 下载程序的代码;在没有互联网的情况可以通过搭建本地Git 代码库进行下载。以下介绍Git 和Git 本地库的搭建过程。4.1.1 Git 客户端安装git 工具后,可以通过命令行使用git。常用的命令如下:(1) git clone 从现有仓库克隆Git clone 下载项目历史的所有数据到本地。例如:$ git clo

39、ne git:/Git 支持许多数据传输协议。包括Git、https、Https、SSH。(2) git status 检查当前文件状态当项目有文件增、删、修改时,通过git status 查看状态。例如:$ git statusOn branch masternothing to commit, working directory clean(3) git add 增加新文件使用命令git add 开始跟踪一个新文件。比如要增加一个README 文件,命令如下:$ git add README(4) git commit 提交更新本地项目文件修改好,变化提交运行命令git commit,提交

40、变化给远程服务器。$ git commit(5) git fetch/git pull 从远程库取代码git fetch 抓取从上次克隆以来别人上传到此远程仓库中的所有更新。但fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支。可以通过git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。(6) git push项目进行到一个阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程仓库。Git 命令的顺序示意图具体请参考:Git 的详细使用说明http:/git-图4.1.1 GIT命令的顺序示意图4.2 Git Server目前Paa

41、S Git 支持SSH、Git、HTTP 协议下载源码。搭建过程首先选择与服务器通讯的协议,其次创建一个裸仓库(bare repository),最后把原始库添加本地的Git Server 中。下面介绍通过SSH 协议搭建本地GitServer 过程。4.2.1 本地SSH Git 库搭建(1). 部署一台新的VM 搭建Git Server 源,部署好虚拟机后安装git。yum install git(2). 配置PaaS Node SSH 无密码登录Git Server 虚拟机。Git Server 允许Paas Node 机器能够ssh 无密码登录。PaaS Node 产生新的SSH 公钥

42、:ssh-keygenscp id_rsa.pub root10.0.0.103:/root/.ssh/authorized_keys(10.0.0.103)为(git Server 地址)(3). Git 本地代码源在Git Server 上配置应用Git 代码源;在root 下面新建一个目录(如gitlocal),应用案例的代码源gz 文件从光盘中复制至/root/gitlocal/目录下解压,只有并执行以下命令创建裸库和复制原始代码。git clone -bare wordpress-example wordpress-example.git完成后,在PaaS Node 通过命令git

43、clone 行验证。git clone root10.0.0.103:/root/gitlocal/wordpress-example.git应用部署成功,即验证GitServer 库搭建成功。图4.2.1 添加GIT源4.3 部署RHC 客户端管理软件4.3.1 RHC 基本环境(1)RHC 基本简介OpenShift Enterprise 2.0 Client Tools 简称RHC,它是OpenShift 上应用管理的工具,下面简单介绍其安装过程和使用。(2)部署RHC 工具到Gitserver配置Gitserver 的DNS 为先电开发服务平台(PaaS 平台)的域名解析地址,在/etc/hosts 添加先电开发服务平台的主机域名对应的解析地址,如下所示:比如openshift 安装主机的IP=192.168.2.44,域名=修改hosts。vi /etc/host/添加192.168.2.44 4.3.2 配置RHC(1)安装Gem 工具RHC 是通过gem 工具安装的,先安装Gem 工具。# yum install rubygems y(2)安装RHC 工具RHC 的Gem 安装包在提供的PAAS 光盘的rhc 目录内,拷贝目录内全部内容到系统中,例如拷贝的目录为/tmp/rhc。# gem in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁