微服务架构学习与思考(12):从单体架构到微服务架构的演进历程

从单体架构到微服务架构的详细演化历程 代码难以理解,导致代码质量逐渐降低,复杂性逐渐增加,代码难以被修改和重构,简言之:屎山。"屎山"懂得都懂,代码量大耦合度高动一发乱全身,构建和部署耗时长,难以定位问题,大部分时间花费在解决代码冲突上,导致开发效率极低,可靠性差,一个bug可能会引起整个应用崩溃。伸缩性差,单体只能按整体横向扩展,无法分模块垂直扩展,无法分团队独立开发部署;IO密集型模块和CPU密集型模块无法独立升级和扩容。高度耦合的单体工程使得逻辑边界模糊不清,新业务需求开发任务无法有效分配到人,团队人员职责不清晰,沟通成本增加。 阅读详情

从单体架构到微服务架构的演进历程

一、单体架构

1.1 什么时候用单体架构

在创业初期或项目开始时,项目整体功能比较少,开发人员也少,且项目需要用最少时间开发出来,用 MVP 方式快速进行市场验证是否可行,这时候就可以用单体架构进行快速开发。

1.2 单体架构设计举例-电商应用

功能分析:

拿淘宝网来举例,现代电商网站功能是很复杂的,有多少功能呢?可以看看我前面的文章《电商产品设计全攻略》读书笔记(https://www.cnblogs.com/jiujuan/p/14452748.html#1574269892) 里的电商管理系统和电商平台产品结构 2 小节。

拿淘宝网举例的话,当然是最早期的淘宝网 - -!,它最简单的 3 个功能:商品展示,用户下单,订单中心。这三个功能构成一个最简单的电商业务流程。

展示给用户看的商品页面以及用户购买商品的操作功能。那我们需要对用户和订单进行管理,怎么办?

就需要一个管理后台来对用户订单进行管理。如此简单分析过后,就知道了电商网站应用功能。

应用功能架构图:

image-20230124022153045

程序架构设计:

这时候我们开发的单体应用程序,部署在应用服务器上。程序架构可能采用 MVC 这种程序架构模式。

当然也有可能什么架构都不用,直接撸代码了,所有的程序都混合在一起,这就是所谓的“大泥球”单体,这是一种糟糕的开发方式。

java 里最常用的 MVC 框架,比如 SpringMVC 框架。

  1. 划分模块

比如根据上面电商功能架构图,在程序里可以把电商功能划分为相对应的模块,如用户模块,订单模块,商品模块。

这时程序里不管是前台功能,后台功能都有这些模块。

image-20230124110006299

​ (应用程序模块)

这时候应用程序模块都在一个大的单体项目里,前台功能和管理后台共用一套代码。

  1. 模块里的功能

比如前台商品模块,就有商品列表,商品详情页等页面功能。

  1. 程序开发

编写程序时可能应用 MVC 这种程序设计模式来进行程序代码开发。

程序部署架构图:

image-20230124122806802

编写的程序代码部署到应用服务器上,用户的所有数据存储到 MySQL 数据库里。

程序和 MySQL 都部署在同一台服务器上。

二、单体架构程序演进

2.1 MySQL 性能瓶颈-缓存

随着项目上线,公司对项目加大力度推广和运营,用户数越来越多。

有一天,用户投诉说,商品详情页面浏览好慢。如是你一番操作猛如虎,发现详情页显示慢,性能瓶颈出现在数据库 MySQL 上,

MySQL 在用户访问高峰时,扛不住那么大的访问量。这时你想到的解决方法,可以用缓存来缓存一部分数据,不必每次都到 MySQL 取数据,

可以用 Redis 来缓存部分商品信息数据。如是,增加一个 Redis 缓存,架构图如下:

image-20230124122020910

2.2 MySQL 读写分离

这时候,你也可能想到另外的一种方法:数据的读写分离,减轻对 MySQL 访问压力。

image-20230124122113934

经过上面 2 种措施改进后,商品详情页访问速度开始变快,访问正常了。

但是这种舒服日子没过几个月,又有用户开始反馈页面访问比较慢。

你又一番埋头辛苦分析,发现是单台服务器负载高,单台服务器的性能已经到了极限,它已经承载不了那么多用户的访问。

如是你想,把数据存储和应用程序部署到 2 台服务器上,减轻服务器的负载压力。

2.3:数据存储和应用程序服务器分离

于是你申请买了一台服务器,把 MySQL 和 Redis 都部署在这台新买的服务器上,让原来那台服务器负载得到缓解。

image-20230124122240609

新的架构部署成功后,用户访问页面又恢复正常。

但是随着业务发展越来越好,新增用户越来越多,应用服务器的负载又居高不下了。

这时候要增加新的应用服务器了,这样做是最简单的。多台应用服务器形成集群,那怎么访问这些应用服务器?才能使每台服务器负载保持平衡,或者性能好的多接受一些用户访问?这时候就要用到负载均衡了。

2.4 集群-分布式

集群-负载均衡(多台应用服务器)

部署多台应用服务器形成一个应用服务器集群,前面用户通过负载均衡器来进行服务的访问。

image-20230124124859989

比较常用的负载均衡软件有 Nginx、LVS、KeepAlived 等等。

还有硬件负载均衡,比如 F5 等。

部署后,页面访问又恢复了正常。

过了几个月,数据服务器也出现负载过高情况,这时候可以把 Redis 缓存和 MySQL 分离,部署到不同服务器上。

随着数据量增加,把 Redis 部署为分布式缓存。

数据库分离和 Redis 分布式缓存

image-20230124130955865

把 MySQL 和缓存 Redis 部署到不同的服务器上。

随着缓存数据的增多,Redis 也部署为主从模式,然后到 Redis Cluster 集群模式,也就是 Redis 的分布式缓存。

此时数据存储服务器负载得到缓解,访问恢复正常。

由于业务发展太快,用户变得更多,数据库又出现了性能瓶颈,这时可以对数据库进行分库分表

分库分表

为了进一步的降低数据库由于数据量太多,访问太大而造成的瓶颈,可以对数据库进行分库分表,减轻数据库的访问压力。

搜索分离

把搜索独立出来,用 Elasticsearch 进行全局搜索处理。

分布式文件存储

使用 HDFS 进行分布式文件存储。
对象存储、块存储、文件存储 Ceph。

三、应用程序发展演进

3.1 应用程序功能变化-硬件发展

上面画的架构图都是后端技术部分,服务端架构从单体到集群再到分布式的演进。

那么前面给用户使用的应用程序呢?也是在变化之中。

比如在《淘宝技术这十年》里的淘宝网的发展变化,刚开始时是一个很简单的 PC 端页面,到后来随着手机普及,移动互联网发展起来,

手机应用就出现了。淘宝 APP 也随之出现。随着国民应用微信逐渐发展壮大,小程序也成为第三种互联网程序应用形式。当然,还有其它终端,比如平板 ipad,自动售货机等等各种终端。

上面是不同硬件出现,程序应用承载出现不同形式。

image-20230124185223955

​ (多终端用户出现后的架构图)

那么淘宝网的功能呢?当然增加了很多。

还孵化出了多种不同的业务应用,比如天猫,1688,支付宝,聚划算,淘宝旺旺等等很多应用。

在今年 2013.1 再去打开淘宝 APP 看看,里面的功能多到眼花缭乱。

现在的电商系统有哪些子系统,系统里都有啥功能,可以看看我之前发布的这篇文章。

3.2 多端程序单体架构

多种终端的出现,当然不是一下子就出来的,都有一个发展过程,只不过到写这篇文章为止,出现了上面说的PC,手机 APP、小程序,平板等多个终端,最常用的还是前面 3 种。

最开始开发程序时,应用程序要适应多个终端,最简单的方式就是拷贝 PC 端的代码到多个终端程序里。按照上面 1.2 小节的电商最简单业务功能模块实现,多终端应用程序功能架构如下:

image-20230124193811484

​ (后端功能模块架构图)

上面的三种终端程序应用,还是使用同一个 MySQL 数据库,也及是说订单数据、用户数据等都存储在一个库中。

可能会问,怎么区分订单来自哪一个终端?

可以给订单数据一个类型标识来进行区分,订单是从哪一个终端过来的。

那管理后台呢?

多终端程序可以共用一个管理后台。

多终端的后台功能模块都搞起来了,但是这种程序模块架构有什么弊端缺点呢?

  1. 代码重复
  2. 增加/修改功能复杂:比如说要修改一个订单模块的功能,需要修改 3 个终端的后台代码
  3. 代码维护复杂:每次维护代码都需要动 3 个后端的代码

那有没有办法可以改进上面所说的情况?

能不能把 3 个后端重复模块代码合并为一个,统一向前端提供服务,当然是可以的。怎么做?

  1. 前后端分离 - 把前后端代码进行分离,前端展示操作页面和后端功能模块分离
  2. 抽象公共模块 - 把多个后端公共模块进行抽象为一个模块,为前端提供统一服务

3.3 前后端分离,抽象公共模块

页面前后端分离,其实在上面 1.1 小节的单体架构中也可以这样实施前后端分离。

多个终端当然也可以进行前后端分离,这样不用开发多个终端的页面,程序代码进行适配就可以了。前端现在有很多种多终端适配的技术。

后端的多个相同功能模块进行抽象,变成一个共用模块,对外提供服务。

这种方式提供功能服务我想到的有 3 种方式:

第一种:单体结构-函数提供接口

后端还是在一个单体工程下面,但是公共功能抽象为一个函数或对象接口,对外提供服务。

后端其他模块引入这个模块然后调用函数或者对象,完成程序功能开发。

应用程序结构图如下:

image-20230124225610407

第二种:用 Maven 当作一个远程包引入

在 java 里,用 maven 可以引入一个远程包进行使用。我们可以用这种方式引入公共功能包。

在 Go 里,用 module 模块方法引入远程包使用。

第三种:RPC 方式调用

这种方式是把应用程序里的公共模块功能变成一个独立的服务,对外提供服务。这个”外“是公司内部的业务可以调用这个服务。公司以外的应用就不可以调用这个服务。

这里也有2种方式,

第一种:只是公共模块独立提供服务,数据库还是共用。

第二种:数据库随着公共模块一起,独立对外提供服务。

我们来讨论第二种情况,既然要作为一个独立的服务存在,它就是自适应自维护的,此时数据库变成独立数据库,跟着它的服务模块一起独立。

此时不仅应用模块进行分离,应用服务器也进行了分离。

这时候就有点微服务的味道了。

image-20230124233108779

四、微服务架构演进

4.1 架构宏观演进:单体->SOA->微服务

架构宏观演进如下图:单体->SOA->微服务->serverless

image
(来自:blog.bytebytego.com)

有的人认为上面这张架构演进图少了一部分,对业务按照功能进行垂直划分,也就是对大单体应用划分为小的应用,这一架构变化,如是有下面这张架构演进图:

image

现在 SOA 架构已经很少使用了,应用拆分之后,如果服务越来越多,慢慢就进化到微服务架构了。

对于微服务的了解,可以看看我前面关于微服务系列文章的讲解,比如下面文章:

微服务的技术架构实际是一个体系,它是由很多技术组成的。

4.2 以 SpringCloud 和 Golang 为基础的微服务技术体系

下面重点说说 SpringCloud。

最开始最 netflix 公司开源的以 springcloud 为基础的微服务技术体系,它把微服务体系开源了。不过后来 netflix 放弃维护它开源的微服务框架。

但是 spring 框架的公司和阿里巴巴都开源了自己的以 springcloud 为基础的微服务体系,阿里巴巴叫 springcloud-alibaba。

阿里还开源了另外一个微服务框架 dubbo。

这些框架都提供了一些主要功能:服务发现和注册,限流熔断,链路追踪,RPC通信,网关等功能。

SpringCloud 微服务体系有哪些缺点?

  1. 代码侵入性强 - 业务层中需要加入治理层代码,与治理层混淆在一起
  2. 组件多 - 组件多,学习成本就变高
  3. 治理功能不全 - 比如协议转换、动态请求路由、灰度发布等功能
  4. 无法实现语义无关性 - 只能是一种语言或几种语言实现,无法做到与编程语言无关

针对以上的一些问题,就出现了 Service Mesh 这种架构,它作为一个基础设施层,真正做到与业务解耦,与语言无关,解决复杂架构下微服务应用与微服务应用之间网络相关问题。

其实就是把网络相关功能拆分出来,与业务系统解耦。

image

4.3 Service Mesh

Service Mesh 解决复杂系统架构下微服务应用与微服务应用之间网络相关问题,它的实现形态一般为轻量级的网络代理,以应用以边车(SideCar)模式部署。

第一代ServiceMesh

image-20230125001047147

​ (from:https://philcalcado.com/2017/08/03/pattern_service_mesh.html ,Phil Calçado)

来看一个全局图:

​ image-20230125001700722

​ (from:https://philcalcado.com/2017/08/03/pattern_service_mesh.html ,Phil Calçado)

绿色:应用服务

蓝色:SideCar

第二代 ServiceMesh:istio

第一代 Service Mesh 是由独立运行的单机服务代理构成,为了提供统一的控制入口,演进出了统一的控制面板,称为 control plane。

控制面板(control plane)和数据面板(data plane,即边车代理)进行交互,比如策略下发、数据采集等。这就是以Istio为代表的第二代Service Mesh。

image-20230125002338290

​ (from:https://philcalcado.com/2017/08/03/pattern_service_mesh.html ,Phil Calçado)

image-20230125002415442

​ (from:https://philcalcado.com/2017/08/03/pattern_service_mesh.html ,Phil Calçado)

Istio架构,Istio 服务网格从逻辑上分为数据平面和控制平面:

image
(from:https://istio.io/)

springcloud 与 ServiceMesh 的区别:

image-20230125002930584

​ (from:https://medium.com/codex/a-spring-cloud-compatible-service-mesh-6ce58c571012)

4.4 kubernetes(k8s)

一图解千言

image-20230529194906925

(来源:redhat blog:spring-cloud-for-microservices-compared-to-kubernetes, Bilgin Ibryam )


第1次更新日期: 2023.05.31
第2次更新日期: 2024.05.25 增加单体到微服务架构演进图


大家可以到俺公众号继续讨论:九卷技术录-从单体架构到微服务架构的演进历程


五、参考

  • https://philcalcado.com/2017/08/03/pattern_service_mesh.html Pattern: Service Mesh,详细介绍了微服务到 Servie Mesh的演进

  • https://medium.com/codex/a-spring-cloud-compatible-service-mesh-6ce58c571012

  • https://www.cnblogs.com/jiujuan/p/14452748.html 《电商产品设计全攻略》读书笔记

  • https://www.cnblogs.com/jiujuan/p/13301055.html 微服务架构学习与思考(04):微服务技术体系

  • https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes Spring Cloud for Microservices Compared to Kubernetes,(redhat blog,Bilgin Ibryam)

  • https://istio.io/

面试官:单体架构怎么向分布式微服务架构演变的?(8000字) 随着网站规模越来越大,单体应用往往很难再满足要求,就需要向分布式,微服务架构演变。那么这个演变过程是怎么样的呢?都涉及到哪些组件,会遇到哪些问题,以及相应的解决方案都是什么,本篇文章就来回答这些问题。本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。 阅读详情

相关推荐

微服务架构的演进与实践:从单体到分布式

微服务架构的引入,极大地改善了单体架构中存在的可扩展性、部署、维护等问题,但也带来了新的复杂性。其核心优势在于服务的独立性高可扩展性和灵活的技术栈选择,但它也需要解决服务间通信、数据一致性、故障恢复等诸多挑战。在实际应用中,微服务架构并非一蹴而就的解决方案,而是一个循序渐进的过程。通过合理的服务划分、完善的通信协议和高效的监控体系,微服务架构能够满足大规模分布式系统的需求,推动企业数字化转型和业务创新。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1145

单体架构到微服务架构演进

随着互联网的发展,互联网企业的业务也在不断的飞速发展,进而导致系统的架构也在不断的发生着变化。总体来说,系统的架构大致经历了:单体应用架构—>垂直应用架构—>分布式架构—>SOA架构—>微服务架构的演变。 当然,很多互联网企业的系统架构已经向Service Mesh(服务化网格)演变。本文记录系统架构的演进这个话题。互联网早期,一般的网站应用流量较小,只需要一个应用,将所有的功能代码打包成一个服务,部署到服务器上就能支撑公司的业务。这样也能够减少开发、部署和维护的成本。比如在电商系统中涉及的业务主要有:用户

m0_49692893的博客 1738

Java Web架构演进与技术思考

微服务架构是一种用于开发单个应用程序的方法,其中应用程序可被视为一组微小的、独立的服务,每个服务都可由不同的程序员或团队开发,并可独立于其他服务运行。每个服务都实现一个小型API,可以使用任何编程语言编写,服务之间通过API相互调用。Spring Boot是一个基于Spring框架的快速开发Web应用的微服务架构,它采用约定大于配置的方式,避免了大量的XML配置文件和繁琐的环境部署,极大地提高了开发效率和运行效果。

陈书予 7317

SpringCloud+Oauth2+Vue+ElementUI前后端分离快速上手项目实战开发

适用人群Java开发人员, Vue开发人员, 前后端分离开发人员, 权限管理和配置开发人员,微服务SpringCloud版本开发人员课程概述微服务SpringCloud前后端分离Vue企业项目实战,微服务脚手架,具有统一授权、认证后台管理系统;SpringCloud+Nacos+ SpringBoot+OAuth2+Jwt+Swagger等,核心技术采用Nacos、Fegin、Ribbon、Gateway、Hystrix、JWT Token、Mybatis、SpringBoot、Redis等主要框架和中间件。SpringCloud整合详细如下:

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 341

告别连接难题:Windows 11下Multisim主数据库稳定运行终极配置指南

本文详细解析了Windows 11下Multisim 14.0主数据库连接失败的三大根源,并提供了四步终极解决方案,包括系统环境优化、软件权限配置、注册表修复和网络验证绕过技巧。通过实测数据对比,本方案显著提升了启动速度和稳定性,解决了电子仿真中的常见连接问题。

weixin_33738555的博客 433

微服务架构思考

另外,引入ESB进一步简化了系统集成的问题,降低了不同服务之间的耦合,但是系统大了之后,各个服务接口的协议也变多,ESB需理解这些协议才能执行后续的订阅分发、转发等操作,协议的维护会变得困难。软件服务架构的演变过程及原因,从单体架构、分布式架构、SOA架构,到如今流行的微服务架构。SOA架构进一步解决了分布架构存在的问题,它可以将一些公共的功能提炼为基础服务,提高功能复用性,同时这些基础服务、各个子系统也可以进行更细粒度的伸缩,同时,采用ESB也减少了整个系统中服务与服务之间的耦合。

小蒋聊技术 979

传感器采集信息的频率(采样频率)

较高的采集频率通常能提供更详细的信息,但也会增加数据处理和存储的负担。在某些应用中,较高的采样频率可能是必要的,而在其他情况下,则可能会选择适当的低采样频率以降低功耗和数据处理压力。传感器采集信息的频率(采样频率)是指传感器在一定时间内对输入信号进行采样的次数。对于一些需要快速检测和响应的应用,如运动传感器、声音传感器等,高采样频率是至关重要的。高采样频率通常需要更多的功耗和更大的存储容量,因为产生的数据量更大。例如,对于快速运动的对象,较低的采样频率可能无法捕捉到运动的真实轨迹。

chen的博客 5345

Badgeyay项目架构演进:从单体到微服务的完整思考指南

Badgeyay是一款专业的会议徽章生成工具,为活动组织者提供简单易用的界面来创建和生成可打印的徽章PDF。本文将深入探讨Badgeyay项目架构从传统单体架构向现代化微服务架构的演进历程,帮助您理解开源项目架构设计的核心思考。 ## 📊 项目架构演进背景 Badgeyay最初采用传统的单体架构设计,将所有功能模块集成在一个应用中。随着用户需求的增长和功能复杂度的提升,项目团队开始探索更加灵

gitblog_00410的博客 785

Fiddler Everywhere保姆级教程:10分钟搞定手机HTTPS抓包(附证书配置避坑指南)

本文提供Fiddler Everywhere移动端HTTPS抓包的保姆级教程,涵盖环境配置、代理设置、证书安装及常见问题排查。重点解析如何正确安装并信任Fiddler根证书以解密HTTPS流量,帮助开发者快速搭建抓包环境,高效分析应用网络行为,提升调试效率。

git9versioner的博客 705

Buildroot RK3568系统中更改GPU驱动为:panfrost

1:Kernel中开启Panfrost 2:更新mesa 到mesa-24.0.2 3:查看/proc/interrupts 中的panfrost 中断 4:LInux启动日志 5:查看GPU负载

OpenWrt/WLAN/驱动/Android/嵌入式开发总结 2078

微服务架构的演进与实践思考

微服务架构的演进是一个不断探索和实践的过程,它不是银弹,也不是适用于所有场景的解决方案。在采用微服务架构之前,我们应该充分评估自己的业务需求、团队规模和技术能力,选择适合自己的架构模式。记住,架构是为业务服务的,而不是反过来。最重要的是,保持架构的简洁和可维护性,这其实可以更优雅一点。如果有任何问题或建议,欢迎在评论区留言,我会认真回复每一条评论。

alex_goden的博客 1928

5分钟用AI搞定顶刊级引言!掌握三段式结构+避坑要点,让你的Introduction更有说服力(附提示词)

说明你是怎么来填补这个缺口的,一句话概括你的研究,再简述你采用了什么新方法、新模型或新视角,也就是创新点,最后说明你的方案是怎么克服第二段提到的缺口的,带来了哪些贡献,注意要确保方案与第二段提到的缺口一一对应。以上三段式引言模板,是非常经典的问题导向型结构,相比传统的结构,这种结构更能吸引是审稿人的注意,希望这篇分享的模板能给在你写论文引言时,提供一点帮助。上一段写好后,就在前人研究的基础上,亮出自己的方案,借助AI说明自己的研究,用了什么新方法/框架/理论/视角来填补这个缺口的。

智能AI让学术科研更容易 745

高性能架构学习路线图-分布式架构演进

目录 一、分布式架构学习路线图 二、计算机软件发展历史 三、技术架构演进史 架构演进一:早期雏形 架构演进二:数据库开发(LAMP特长) 架构演进三: javaweb的雏形 架构演进四: javaweb的集群发展​ 架构演进五: javaweb的分布式发展 架构演进六: javaweb的微服务发展​ 集群与分布式的区别 一、分布式架构学习路线图 JAVA中...

b379685397的博客 6万+

YOLOv8改进有效系列目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好,本专栏自开设两个月以来已经更新改进教程120+余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新,订阅本专栏以后你不仅可以收获跟专栏的阅读权限,同时可以进Qq群,里面包含集成我所有创新的YOLO最新目录,和我本人录制的视频讲解教程,如果你想要在YOLOv8系列收获一篇论文,我相信订阅本专栏后你一定会有所收获~YOLOv8改进有效系列目录。

Snu77的博客 18万+

工具变量法入门:解决因果分析中的内生性问题

想知道如何在复杂的数据中精确揭示因果关系?你是否遇到过自变量与误差项相关导致的困惑?工具变量法将为你拨开迷雾,帮助你剖析数据背后的因果链条。这篇文章不仅详细讲解了工具变量法的原理,还结合实际案例,让你轻松掌握这一关键研究工具。点击阅读,开启你的因果分析新篇章!

theskylife的博客 1953

除了微服务,我们还有其他选择吗?

从单体架构、SOA架构,到微服务架构,再到容器化、无服务架构,我们的选择很多,没有必要非在一棵树上吊死。

沉潜飞动 8793

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

集中式架构、分布式架构与微服务架构全面解析

阶段主要目标典型特征解决的问题新增的挑战集中式架构快速构建、简化部署单体应用、共享数据库开发效率、简单部署扩展性与耦合度问题分布式架构模块解耦、水平扩展模块化服务、独立部署系统性能与可伸缩性数据一致性、通信复杂度微服务架构服务自治、敏捷迭代独立服务、自动化运维持续交付与高可用运维复杂度、分布式事务。

weixin_44876263的博客 1446

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

面试鸭架构演进:从单体到微服务的完整指南

面试鸭是一个专注于面试刷题的免费开源平台,采用 React 前端 + Node 后端 + 云开发的现代化全栈技术栈。该项目由程序员鱼皮开发,旨在帮助求职者高效准备面试,提供海量题库、智能推荐和个性化学习体验。本文将深入分析面试鸭项目的架构演进历程,从最初的单体架构到微服务化的思考与实践,为开发者提供宝贵的技术参考。 ## 🚀 项目概述与核心功能 面试鸭是一个干净免费的面试刷题网站,支持网页端

gitblog_00617的博客 1102

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

GO微服务实战第三节 微服务架构是如何演进的?

我们在前面两篇文章中已经介绍了云原生相关的概念及其应用,本课时开始我们将会进入微服务的相关学习。微服务架构是当前流行的架构方式,在本课时我们将会首先介绍服务端架构的发展,如何由单体一步步演进到微服务架构;随后介绍 Go 语言微服务架构的选型,确定本课程的基本框架;最后,在学习完云原生和微服务的相关知识,我们再回顾一下云原生架构与微服务架构之间到底是什么关系。

fegus的博客 666

企业级BPM之微服务架构演进

BPM平台在各行业的IT架构中都是重要的基础支撑平台,十二五期间,企业级BPM作为SOA体系下的关键组件,经历了一个加速建设的过程。我们也有幸参与了一些行业的流程平台建设,今天与大家分享我们在流程引擎架构演进过程中的一些经验与思考。首先对过去这些年的架构发展历程进行回顾和总结,然后谈谈目前单体型BPM遇到的问题与微服务改造的思路,第三部分介绍流程平台向微服务架构演化的一些思考与规划。 过去:企业级...

xudawenfighting的博客 570

从单体到微服务再到 Multi-Agent:后端架构的下一代演进

想象一下,如果你要盖一座房子,你会怎么开始?是直接把所有房间都盖在一个大屋子里,还是先盖好各个房间再把它们连起来?在软件世界里,这就是我们要讨论的架构问题。本文的目的是带你探索后端架构的演进历程:从最简单的"单体大房子"(单体架构),到"独立小房间连成的小区"(微服务架构),再到未来的"智能机器人协作团队"(Multi-Agent架构)。我们将深入探讨每种架构的工作原理、适用场景、优缺点,以及如何在它们之间进行选择和演进。通过这篇文章,你不仅能理解这些技术概念,还能学会如何在实际项目中运用它们。这篇文章适合

AIGC应用创新大全的博客 217

微服务架构 | 服务架构的演进

这也很好理解,我们划分了多个一定颗粒的服务,此时是游离且独立的,我们需要使得这些服务具备互相通讯的功能,我们会想到http或者webservice来进行通讯,也是rpc思想的一种体现,http虽然具备完整的通讯体系和标准的规范,但是满足不了企业的内网和外网之间日益复杂的信息交互。说了单体应用的诸多缺点,并不是我在找茬,它本身不是缺点,是在于面对型应用和超大型应用的出现(单纯应用的庞大,用户数并不庞大),以及用户量剧增时体现出来的不适用性,迫切需要新的且适应的架构方式来解决我们的麻烦。

Huangjiazhen711的博客 164

Java Web架构演进:从MVC到微服务的实践与思考

软件架构演进是应对系统复杂度的必然过程。MVC模式通过分离视图、控制器和模型解决了早期JSP混编的维护难题,其核心价值在于职责分离与可测试性提升。随着业务复杂度增长,分层架构通过领域驱动设计(DDD)进一步解耦业务逻辑,但需处理对象转换和依赖管理等新挑战。当系统规模达到单体架构瓶颈时,微服务架构成为分布式系统的解决方案,其技术选型涉及服务通信协议(REST/gRPC)、服务发现(Nacos/Consul)等关键组件。在电商等高并发场景中,二级缓存和数据库连接池优化可带来显著性能提升。架构演进需要平衡技术先进

weixin_32715349的博客 248

从‘大泥球’到‘乐高积木’:服务器架构演进的哲学思考

本文探讨了服务器架构从单体架构到微服务的演进历程,通过‘大泥球’与‘乐高积木’的隐喻,揭示了模块化思维在复杂系统设计中的重要性。文章详细分析了SOA、微服务等架构的技术特征与适用场景,并提供了架构选型的多维决策模型,帮助开发者在不同业务阶段做出最优选择。

cuda7parallel的博客 911
上一篇: 微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍
下一篇: 程序员怎么做沟通?聊一聊程序员沟通相关的问题
九卷沉思录
博客等级 码龄14年 746粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值