`
xcy13638760
  • 浏览: 51403 次
社区版块
存档分类
最新评论

创业公司工程师应该掌握的可伸缩Web开发技术

 
阅读更多
<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-10-28%2F2826059&amp;type=3&amp;count=&amp;appkey=&amp;title=%E6%9C%AC%E6%96%87%E9%9D%A2%E5%90%91%E5%88%9B%E4%B8%9A%E5%85%AC%E5%8F%B8%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%B8%88%EF%BC%8C%E4%BB%8B%E7%BB%8D%E5%8F%AF%E4%BC%B8%E7%BC%A9%E7%9A%84Web%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF%E3%80%82%E4%BC%B8%E7%BC%A9%E6%80%A7%E6%98%AF%E6%8C%87%E7%B3%BB%E7%BB%9F%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E9%9C%80%E6%B1%82%E5%92%8C%E6%88%90%E6%9C%AC%E8%B0%83%E6%95%B4%E8%87%AA%E8%BA%AB%E5%A4%84%E7%90%86%E8%83%BD%E5%8A%9B%E7%9A%84%E4%B8%80%E7%A7%8D%E7%89%B9%E6%80%A7%E3%80%82%E4%BC%B8%E7%BC%A9%E6%80%A7%E6%84%8F%E5%91%B3%E7%9D%80%E7%B3%BB%E7%BB%9F%E5%8F%AF%E4%BB%A5%E6%BB%A1%E8%B6%B3%E6%9B%B4%E5%A4%9A%E7%94%A8%E6%88%B7%E8%AE%BF%E9%97%AE%E5%A4%84%E7%90%86%E6%9B%B4%E5%A4%9A%E6%95%B0%E6%8D%AE%E4%B8%94%E4%B8%8D%E4%BC%9A%E5%AF%B9%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C%E9%80%A0%E6%88%90%E4%BB%BB%E4%BD%95%E5%BD%B1%E5%93%8D%E3%80%82&amp;pic=&amp;ralateUid=&amp;language=zh_cn&amp;rnd=1446082260030" width="22" height="16"></iframe>摘要:本文面向创业公司的工程师,介绍可伸缩的Web开发技术。伸缩性是指系统可以根据需求和成本调整自身处理能力的一种特性。伸缩性意味着系统可以满足更多用户访问处理更多数据且不会对用户体验造成任何影响。

近些年来,越来越多的行业开始和互联网结合,诞生了越来越多的互联网创业公司。互联网创业公司需要面对许多的不确定因素。如果你和你的小伙伴们够幸运,你们的公司可能会在几个星期之内让用户数、商品数、订单量增长几十倍上百倍。一次促销可能会带来平时几十倍的访问流量,一次秒杀活动可能会吸引平时数百倍的访问用户。这对公司自然是极大的好事,说明产品得到认可,公司未来前景美妙。

但是快速增长的用户和订单却对公司的技术提出极大的挑战。受计算资源本身的限制,一台服务器能启动的线程数、能存储的数据,每秒钟能完成的计算、能读写的数据、能传输的数据都是有限的。而系统处理每一个用户请求都需要消耗一定的计算资源,当大量的用户同时来访问系统的时候,会出现因计算资源不足而导致的响应延迟以及超时出错,当并发访问用户超过某个极限,甚至会导致服务器宕机,整个网站不可访问的惨剧。

当公司正在为用户增加订单量上升而庆祝的时候,却传来系统崩溃网站不可访问的噩耗。喜剧变成悲剧,庆祝会变成批斗会,作为负责公司技术的工程师,作为批斗会的主角,你,是否会觉得压力山大。

本文面向创业公司的工程师,介绍可伸缩的Web开发技术。伸缩性是指系统可以根据需求和成本调整自身处理能力的一种特性。伸缩性意味着系统可以改变自身的处理能力以满足更多用户访问处理更多数据而不会对用户体验造成任何影响。

一、构建可伸缩的Web架构

互联网创业的一个特点是开始的时候规模都很小,几个人的小团队,少量的启动资金,就开始创业了。Google是从斯坦福的实验室开始创业的,Facebook是从哈佛的宿舍里开始创业的,Alibaba是从马云家的客厅开始创业的。刚开始的时候,用户也少,所以只要一台服务器就可以应付所有的用户访问,这时整个Web系统架构如图1。数据库、Web应用、文件服务都部署在一台服务器上。

图1 互联网创业早期最简单的Web系统架构

如果创业方向正确,产品解决用户痛点,能为社会创造价值,就会有更多用户来访问网站。这时,Web系统受计算资源不足影响,会出现响应延迟,打不开网站等情况。解决方法有两种,一种方法是使用更强大计算能力的计算机,另一种方法是使用更多的计算机。第一种方法主要问题在于再强大的计算机也都有资源限制,而一个成功的网站的终极目标是服务全世界,随着网站的发展,不管多强大的计算机迟早也会遇到计算资源不足的问题;而且越强大的计算机其价格也越昂贵,这也是刚刚起步的创业公司不能承受的。所以几乎所有的互联网公司都选择了第二种方法,即构建一个弹性可伸缩的Web系统,通过逐步向系统中增加服务器从而提高整个系统的计算处理能力。

增加服务器的一个基本手段是将不同的服务部署在不同的服务器上,应用服务器,数据库服务器,文件服务器独立部署,如图2。

图2 进行简单拆分独立部署的Web系统架构

此外,还可以将不同的模块拆分到不同的服务器。比如一个电子商务网站,商城、论坛、卖家这些相对独立的模块可以独立部署,即使在商城系统内部,首页、商品列表、商品详情、订单等子模块也可以进一步独立部署,如图3。

图3 按功能模块进一步拆分独立部署的Web系统架构

事实上随着业务不断发展,网站需要使用更多的服务,缓存、消息队列、搜索、NoSQL、反向代理等,还需要将静态内容服务从应用服务器中分离出来,以及使用CDN(内容分发网络)进行静态内容访问加速。这些服务都应该部署在独立的服务器上,通过使用更多的服务器提高网站的整体处理能力。

这些可以分拆的功能和服务虽然已经独立部署,但是每个功能或者服务如果只能部署在一台服务器上,能够提供的计算能力以及能够处理的并发访问依然有限。解决方法是通过集群的方式将单一服务部署在多台服务器上,从而提供更强大的处理能力,如图4。

图4 集群部署的Web系统架构

总之,可伸缩网站架构的核心思路就是通过分拆集群等手段向Web系统中添加各种服务器,为系统提供更多计算、存储、传输能力,这些服务器能有效分担系统访问压力,使Web系统能够支撑更多用户访问、存储更多数据而不至于影响用户体验。

二、使用可伸缩的基础技术产品

前面提到,单一服务或者应用需要通过集群的方式提供更强大的计算处理能力。集群即多台服务器部署相同应用或服务构成一个服务器群统一对外提供服务。如果有更多用户访问,需要处理更多并发访问请求的时候,只需要向集群中添加新的服务器即可。这就要求服务或应用本身具有可伸缩性。

1. 通过负载均衡实现应用服务器可伸缩

应用服务器一般指部署核心业务逻辑,主要处理用户请求的服务器。应用通常设计成无状态结构,即应用本身不记录用户请求的上下文信息,这样设计的好处是任何用户的任何一次请求都可以交给任何一个应用服务器去处理。实践中,一般通过负载均衡服务器将一组应用服务器构建成一个集群,如图5。

图5 通过负载均衡实现应用服务器可伸缩(图片来源《大型网站技术架构:核心原理与案例分析》)

首先在负载均衡服务器上配置所有的应用服务器信息,用户请求先到达负载均衡服务器,负载均衡服务器通过某种负载均衡算法计算得到一个应用服务器的网络地址,然后将请求数据包转发给这个应用服务器,由该服务器完成用户请求处理。如果用户数增加,并发请求超过现有集群的处理能力,只需要在现有应用服务器集群中增加服务器,在负载均衡服务器上增加新的服务器配置信息,部分用户请求就会转发到新增服务器上,实现分担集群访问压力的目的。
负载均衡服务器的实现有很多种,DNS负载均衡、HTTP重定向负载均衡,HTTP转发负载均衡、IP层负载均衡、数据链路层负载均衡等,实践中,中小网站多使用Nginx等反向代理服务器实现HTTP转发负载均衡,而规模稍大以后则基本都使用LVS实现IP层负载均衡或者数据链路层负载均衡。目前越来越多的网站使用云服务部署网站,这些云服务也提供负载均衡服务,背后使用的技术依然是LVS或者HTTP转发。

2. 通过远程分布式缓存实现缓存可伸缩

缓存是改善网站性能的最重要手段,一方面缓存使用内存存储数据,可以更快速地响应请求;另一方面大量数据访问请求通过缓存返回,减少数据库压力,进一步改善性能。目前网站中大量使用的缓存服务是Memcached或者Redis。Memcached分布式缓存访问模型如图6。

图6 Memcached分布式缓存访问模型 (图片来源《大型网站技术架构:核心原理与案例分析》)

应用程序通过Memcached客户端访问Memcached服务器集群,其中路由算法模块负责根据应用程序输入的KEY计算得到应该访问哪台服务器,然后通过通信模块从对应服务器上读写数据。

如果Memecahed集群需要缓存更多数据或者需要提供更高的并发访问,只需要向集群中增加新的服务器,然后修改客户端服务器列表即可应用程序访问到新加的服务器。

需要注意的是如果路由算法选择不当,比如使用余数Hash算法,会出现加入一台服务器而导致现有的缓存数据大量访问不能命中的情况,其后果相当于缓存服务器集群整体宕机,给系统带来灾难性后果。目前Memcached主要采用一致性Hash算法,这种算法可以使加入新服务器对现有数据访问影响最小。而Redis通过一种类似虚拟节点的映射算法也可以达到相似的效果。

3. 通过主从复制和分布式数据库实现数据库可伸缩

目前各种网站主要使用的关系数据库是MySQL,MySQL支持数据复制功能,使用这个功能可以对数据库进行简单的伸缩。图7为使用数据复制的MySQL集群伸缩性方案。

图7 通过主从复制实现简单伸缩性的MySQL集群 (图片来源《大型网站技术架构:核心原理与案例分析》)

在这个方案中,虽然多台服务器部署MySQL实例,但是他们的角色有主从之分,数据写操作都在主服务器上,由主服务器将数据同步到集群中其他从服务器,数据读操作及数据分析等离线操作在从服务器上进行。

主从复制只能通过增加有限的几台服务器分担数据库的访问压力,如果数据库需要记录数千万上亿条记录,需要应对每秒数十万次访问压力,那么主从复制是远远不够的。这种情况下,可以考虑使用更具伸缩性的各种NoSQL数据库产品,如HBase等,也可以考虑使用分布式数据库。分布式关系数据库则通过一个代理层将数据分片并经过路由后写入一个关系数据库集群中。

除了应用、缓存、数据库,其他的服务,诸如搜索、消息队列等也可以以类似的思路和方案实现集群可伸缩。

三、打造可伸缩的技术团队

创业公司刚开始时,通常不过两三个工程师,围绕核心业务,开发一个简单的版本就发布上线开始运营了。随着业务不断发展,服务器数量必定是越来越多、技术越来越复杂,对应的,公司规模也是越来越大,工程师团队越来越多人。一般说来,一家互联网公司能做到上市,工程师团队的人数大概从数百人到数千人不等,技术团队规模和创业时相比扩大数百倍。这就要求必须有效组织工程师团队,打造可伸缩的技术团队,使技术团队的成长和公司业务成长、技术水平进步保持一致。

1. 团队拆分

制约一个团队人数规模的主要因素是沟通路径,沟通路径越多,信息传递越慢,传递过程中引入的噪音越多,团队越趋于混乱。一个5人团队,沟通路径是10=(5*4)/2,一个9人团队,沟通路径是36=(9*8)/2,沟通路径随团队规模呈指数级增长。所以当技术团队人数增长到一定规模,和构建可伸缩的Web架构中需要对服务进行拆分一样,需要对团队进行拆分,将一个大团队拆分成几个小团队,使每个小的团队保持一个比较少的人数。

团队拆分有两种方案,一种是按职能拆分,前端工程师、后端工程师、测试工程师、运维工程师、数据仓库工程师各种工程师分别构成一个个的小团队,这种拆分的好处是团队结构比较稳定,团队成员都是使用同样技术的“自己人”,团队内部沟通交流更快速高效;带来的问题是开发过程是按照产品和项目组织的,而开发一个产品需要用到前端、后端、测试、运维各种工程师,开发过程会遇到各种跨团队的交流与合作,带来更多的沟通成本。另一种是按照产品和项目拆分,团队围绕产品展开,每个团队内部拥有开发维护一个产品所需的各种技术角色,从开发到测试发布运维都在团队内部搞定,不需要太多跨团队合作,这种拆分也存在一些问题,特别是创业公司早期,产品不稳定,管理层决定要上一个新产品,于是迅速招人开发,但是很多时候产品刚上线不久甚至还没上线,管理层的决定又有变化,产品不做了,团队解散,这种朝令夕改会对技术团队造成较大伤害,所以某些互联网公司特别将“拥抱变化”上升到公司价值观高度,让员工对这种情况做好心理准备。

对于公司而言,前一种方案带来的问题是沟通低效、人员冗余、开发进展缓慢;后一种方案带来的问题是员工情绪低落影响士气。显然前一种方案对公司发展影响更大,所以实践中,更多公司采用后一种团队组织方式。为了应对这种方案带来的消极影响,公司会积极组织各种培(xi)训(nao),提供各种员工福利员工关怀,让员工忘记各种不快,投入到下一个产品开发中。不过对创业公司而言,从本质上,员工利益和公司利益是一致的,只有公司活下去、做大做强,所有人才能更好的获益,不过这也要求创业公司尽可能做到决策透明,让所有员工能理解管理层的决定,并自觉维护、执行管理层的决定。

2. 保持敏捷

创业团队白手起家,不但表现在缺资金缺用户缺人才,也表现在缺管理缺标准缺规范,于是采用各种“野路子”的管理手段。但是公司发展到一定规模,这些手段就开始捉襟见肘,出现各种问题,于是公司开始从各种名企外企引入各类『管理人才』,进行规范化管理。不过在这个规范化的过程中,有时候会出现某种矫枉过正,导致公司僵化笨拙,还没成为大公司却得了一堆大公司的病。

举两个极端但是真实的例子。某公司要求代码单元测试覆盖率必须达到一定比率,并且写了工具专门扫描工程师提交的代码是否达到要求的单元测试覆盖率,于是就看到有些工程师为getXXX和setXXX方法写测试用例。某公司要求设计阶段必须写设计文档,并提供了设计文档模板,这个模板有一章叫做『数据库设计』,某个项目不需要数据库,因此设计文档不通过评审,为此工程师不得不设计了一个永远不会用到的数据库。

某位伟人曾经说过:教条不如狗屎,狗屎可以肥田,教条屁用没有。有些『管理人员』自己不曾在一线实践过,却为一线人员制定各种规章制度,效果可想而知。对创业公司而言,最好的管理不是流程规范,而是最佳实践。某个项目迭代管理做得好,某个项目设计文档写得好,拿来在全公司分享,大家一起学习改进,在实践中提高,产生更好的实践继续分享。从实践中来到实践中去,而不是从PPT来到Word中去。

总结

本文限于篇幅,概要描述了Web应用可伸缩架构技术,期望创业公司工程师在创业早期就能明了网站技术发展的一般模式,更好地规划自己公司的技术发展道路。关于网站可伸缩架构的更多技术细节,可以根据这篇文章提到的技术点按图索骥阅读更多资料,更重要的当然是在实践中学习,随着公司逐步壮大,自己也逐渐成长为网站技术方面的卓越人才。期待未来最伟大的互联网公司出现在中国,期待未来最顶尖的互联网技术人才出现在本文的读者当中,祝福大家。


分享到:
评论

相关推荐

    互联网创业核心技术:构建可伸缩的Web应用.part1

    本书面向互联网创业公司工程师,讲述构建可伸缩web系统的相关知识。

    互联网创业核心技术:构建可伸缩的Web应用.part2

    本书面向互联网创业公司工程师,讲述构建可伸缩web系统的相关知识。

    互联网创业核心技术

    互联网创业核心技术--构建可伸缩的Web应用,本书面向互联网行业工程师

    GUI面板MATLAB香烟汉字识别.zip

    GUI面板MATLAB香烟汉字识别

    2023年统招专升本计算机考试真题及答案6.pdf

    2023年统招专升本计算机考试真题及答案6.pdf

    Java毕业设计-SpringBoot+Vue的“漫画之家”系统(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    基于ssm+vue的教学视频点播系统(java毕业设计,包括源码,数据库,教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SSM 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:vue/html5 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4

    Java毕业设计-基于SpringBoot+Vue+MySql的五台山景点购票系统(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    MATLAB设计的危险区域预警系统(GUI界面设计).zip

    MATLAB设计的危险区域预警系统(GUI界面设计)

    2023年江苏省计算机二级VB试卷.pdf

    2023年江苏省计算机二级VB试卷.pdf

    NSCBx1.0.1b Keys19.0.0.zip

    NSCBx1.0.1b Keys19.0.0.zip

    智慧园区一卡通与清分结算系统Word(45页).docx

    智慧园区,作为现代化城市发展的新兴模式,正逐步改变着传统园区的运营与管理方式。它并非简单的信息化升级,而是跨越了行业壁垒,实现了数据共享与业务协同的复杂运行系统。在智慧园区的构建中,人们常常陷入一些误区,如认为智慧园区可以速成、与本部门无关或等同于传统信息化。然而,智慧园区的建设需要长期规划与多方参与,它不仅关乎技术层面的革新,更涉及到管理理念的转变。通过打破信息孤岛,智慧园区实现了各系统间的无缝对接,为园区的科学决策提供了有力支持。 智慧园区的核心价值在于其提供的全方位服务与管理能力。从基础设施的智能化改造,如全面光纤接入、4G/5G网络覆盖、Wi-Fi网络及物联网技术的运用,到园区综合管理平台的建设,智慧园区打造了一个高效、便捷、安全的运营环境。在这个平台上,园区管理方可以实时掌握运营动态,包括道路状况、游客数量、设施状态及自然环境等信息,从而实现事件的提前预警与自动调配。同时,智慧园区还为园区企业提供了丰富的服务,如项目申报、资质认定、入园车辆管理及统计分析等,极大地提升了企业的运营效率。此外,智慧园区还注重用户体验,通过信息发布系统、服务门户系统及各类智慧应用,如掌上营销、智慧停车、智能安防等,为园区员工、企业及访客提供了便捷、舒适的生活与工作体验。值得一提的是,智慧园区还充分利用大数据、云计算等先进技术,对园区的能耗数据进行采集、分析与管理,实现了绿色、节能的运营目标。 在智慧园区的建设过程中,还涌现出了许多创新的应用场景。例如,在环境监测方面,智慧园区通过集成各类传感器与监控系统,实现了对园区水质、空气质量的实时监测与预警;在交通管理方面,智慧园区利用物联网技术,对园区观光车、救援车辆等进行实时定位与调度,提高了交通效率与安全性;在公共服务方面,智慧园区通过构建统一的公共服务平台,为园区居民提供了包括平安社区、便民社区、智能家居在内的多元化服务。这些创新应用不仅提升了园区的智能化水平,还为园区的可持续发展奠定了坚实基础。同时,智慧园区的建设也促进了产业链的聚合与发展,通过搭建聚合产业链平台,实现了园区内企业间的资源共享与合作共赢。总的来说,智慧园区的建设不仅提升了园区的综合竞争力,还为城市的智慧化发展树立了典范。它以用户需求为导向,以技术创新为驱动,不断推动着园区向更加智慧、高效、绿色的方向发展。对于写方案的读者而言,智慧园区的成功案例与创新应用无疑提供了宝贵的借鉴与启示,值得深入探索与学习。

    数据库系统课程设计报告-商品供应管理系统设计与开发

    一、系统需求分析 1 (一)需求概述 1 (二)业务流分析 1 (三)数据流分析 3 (四)数据字典 3 二、数据库概念结构设计 5 (一)实体分析 5 (二)属性分析 5 (三)联系分析 6 (四)概念模型分析(.PDM图) 7 三、数据库逻辑结构设计 8 (一)概念模型转化为逻辑模型 8 1.一对一关系的转化 8 2.一对多关系的转化 8 3.多对多关系的转化 8 (二)逻辑模型设计(.PDM图) 8 四、数据库物理实现 9 (一)表设计 9 (二)创建表和完整性约束代码设计 10 (三)创建视图、索引、存储过程和触发器 11 五、数据库功能调试 12 (一)职工管理模块 12 (二)工程负责人管理模块 13 (三)系统管理员管理模块 15 六、设计系统前台软件 20 (一)开发软件选择 20 (二)软件功能要求与设计 21 (三)软件功能实现 21 (四)系统测试 27 七、设计总结 28

    springboot校园在线拍卖系统.zip

    ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文

    【人机交互】MATLAB手势识别设计.zip

    【人机交互】MATLAB手势识别设计

    【工程项目】MATLAB的人脸+指纹融合系统(结合人脸和指纹一致性方可通行).zip

    【工程项目】MATLAB的人脸+指纹融合系统(结合人脸和指纹一致性方可通行)

    2023年历年真题考试:管理系统中计算机应用历年真题汇编(共207题).pdf

    2023年历年真题考试:管理系统中计算机应用历年真题汇编(共207题).pdf

    sprinmgboot实习管理系统--论文.zip

    ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文

    【人机交互】MATLAB信号与系统数字信号设计.zip

    【人机交互】MATLAB信号与系统数字信号设计

    Delphi 12.3控件之Chatbox-1.9.8-Setup.rar

    Delphi 12.3控件之Chatbox-1.9.8-Setup.rar

Global site tag (gtag.js) - Google Analytics