浅谈开发模式及架构发展

一、传统开发模式

    传统的开发模式基本一般是重服务端的开发方式,大部分工作都在服务端执行,然后返回到客户端(通常是HTML)。以Asp.net MVC为例,如下图:

    

 

    #1 根据请求的路由定位到对应的Controller的对应的Action。

    #2 执行相关逻辑,得到结果Model(也可能没有Model,如直接返回View)。

    #3 定位并加载对应的View(也可能没有View,如返回TextResult,JsonResult等)。

    #4 在服务端通过Razor引擎把Model和View绑定起来生成最终的返回结果(一般是HTML),返回到客户端。

 

    缺点:

    #1 职责不明确,要求工程师对前后端技术都要了解一点,有的甚至是后端工程师同时兼顾前后端。

    #2 随着不同终端(Pad/Mobile/PC)的兴起,对前端的要求越来越高,同时兼顾前后端的工程师开始感到乏力。

    #3 前端工程师必须使用后端工程师的IDE,如Visual Studio。不用的话,又会产生集成的工作量。

    #4 应用开发流程繁琐,如下图:

    

 

二、前后端分离 - 大前端时代

     随着传统的开发模式的缺点日益明显,以及前端技术与框架的发展,逐渐形成了前后端分离的开发模式。加上Html5,Css3,混合式开发技术的发展,更是把前端开发推向了一个百花齐放的大前端时代。前后端分离的交互大概如下图所示:

    

 

    #1 服务端响应请求返回结果(一般是json或xml)。

    #2 客户端接受到返回结果,反序列化成JS Object,和Html Template进行双向绑定。

    #3 Object的变化会引起View的变化,View的操作可以改变Object。

    #4 Controller托管着Object,View可以调用Controller的Event,然后给服务端发送请求。

 

    实现前后端分离的前端框架(如Angular/Angular2,Vue/Vue2,Durandal,Webix-Jet等)一般都会包含三个重要组合部分:路由、模版、绑定。

    我大概在2011年开始尝试前后端分离,但当时上述提到的框架还没被发掘出来,只有一个双向绑定的框架knockoutjs。因此,我当时做了两种尝试:

    #1 纯前后端分离:Asp.Net MVC(仅返回json) + html + knockoutjs + requirejs + ajax。

    #2 伪前后端分离:Asp.Net MVC(返回json以及无对象绑定的view) + knockoutjs + requirejs + ajax。

    之所以会有第二种方案是因为我想使用MVC的路由以及它的母板(Master Page)机制,目前的框架基本都提供了母板机制。

 

    前后端分离的通讯一般都使用ajax,少部分使用form表单,服务端接口建议使用RESTful的风格:

    

    API表示资源或领域,Method表示行为。

 

    优点:

    #1 前后端工程师职责分明,后端可以更加关注后端技术,前端可以更关注前端技术。

    #2 前端工程师可以按自己的喜好来选择IDE(WebStrom,HBuilder, Sublime等),而不需要了解后端工程师使用的IDE。

    #3 服务端的职责只负责数据处理(接收请求返回json),技术选型多样化,可以是.net, jsp, php,nodejs等。

    #4 服务端作为一个数据中心的角色,可以服务多种应用,如桌面程序,web,手机app等。

    #5 可以更好的使用浏览器缓存,静态的html和js加载一次后会存在浏览器缓存中。

    #6 应用开发流程更简洁高效(可并行),如下图:

    

 

    挑战:

    #1 对ajax的使用要求更高,目前很多前端工程师没有关注到这一点,如promise机制。

    #2 基于ajax的通讯经常要解决跨域问题。

 

三、微服务架构

    以上两种开发模式都是单体架构,它们能够很好地应对简单的业务系统。但是随着业务的扩张,功能的不断增加,单体架构面临着越来越多的挑战:

    

 

    #1 维护成本增加

         a. 团队越来越大,相应的沟通成本、管理成本、人员协调成本显著增加。

         b. 引起缺陷的原因组合多,导致分析、定位、修复缺陷的成本响应增高。

         c. 在自动化测试机制不完善的情况下,易导致“修复越多,缺陷越多”的恶性循环。

    #2 交付周期长

         代码编译、检查,运行测试、构建、更能验证等,反馈周期变长。

    #3 新人培训周期长

         对于新加入团队的成员,需要花更多的时间了解熟悉业务、配置环境、熟悉代码。

    #4 技术选型成本高

         单体架构倾向于采用统一的技术平台或方案来解决所有问题。

    #5 可伸缩性差

         a. 无法按需伸缩。

         b. 资源有效利用率低。

    #6 构建全功能团队难

         应用程序的复杂结构也会逐渐映射到研发团队的结构上。

 

    微服务架构(Microservice Architect):

    #1 微服务架构是一种架构模式,它提倡将单块架构的应用划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。

    #2 每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通。

    #3 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。

    #4 另外,应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应更具业务上下文,选择合适的语言、工具对其进行构建。

    

 

    本质特征:

    #1 服务作为组件

    #2 围绕业务组织团队

    #3 关注产品而非项目

    #4 技术多样性

    #5 业务数据独立

    #6 基础设施自动化

    #7 演进式架构

 

    优势:

    #1 边界性

         a. 业务独立

         b. 功能耦合度低

    #2 独立性

         a. 独立部署

         b. 按需伸缩

    #3 技术多样性

         a. 使用合适的语言或者工具

         b. 使用合适的数据存储

 

    挑战:

    #1 分布式系统的复杂度

         a. 网络因素(带宽、超时)

         b. 数据一致

         c. 可用性

    #2 微服务测试

         a. 测试策略

         b. 自动化测试

    #3 运维成本高

         a. 环境配置

         b. 部署

         c. 监控

    #4 微服务的依赖管理

         a. 版本管理

         b. 服务依赖

         c. 服务治理 

 

    展望:

    后续有机会的话,我会写一系列关于.Net Core如何与Srping Cloud集成的文章。

 

    说明:

    本文部分内容来自王磊的《微服务架构与实践》和infoq发表的文章:

    解析微服务架构(一)单块架构系统以及其面临的挑战

    解析微服务架构(二)微服务架构综述

原文地址:http://www.cnblogs.com/Erik_Xu/p/6241359.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dubbo(四)之xml配置方式

转载自 Dubbo xml配置方式 以 XML 配置的方式来配置你的 Dubbo 应用 有关 XML 的详细配置项,请参见:配置参考手册。如果不想使用 Spring 配置,而希望通过 API 的方式进行调用,请参见:API配置。想知道如何使用配置&a…

Actor-ES框架:Ray-Handler之CoreHandler编写

如图右上角所示,Ray中有两类Handler(SubHandler和PartSubHandler),在使用中,SubHandler派生Actor的CoreHandler,PartSubHandler派生SQLToReadHandler,SQLToReadHandler派生Actor的ToReadHandler&#xff0c…

Dubbo(五)之动态配置中心

转载自 Dubbo动态配置中心 Dubbo 2.7 中的动态配置中心 配置中心(v2.7.0)在 Dubbo 中承担两个职责: 外部化配置。启动配置的集中式存储 (简单理解为 dubbo.properties 的外部化存储)。服务治理。服务治理规则的存储…

使用Mono将C#编译运行至WebAssembly平台

因为所有的主流网页浏览器都支持WebAssembly,开发者们现在可以寻找一个新的平台来部署他们的应用程序。由WebAssembly团队提供的标准工具链仅能将C、C编译成为WebAssembly,然而这对使用其他编程语言的开发者们并没有什么帮助。C#开发者就幸运的多了&…

Dubbo(六)之属性配置

转载自 Dubbo属性配置 属性配置 以属性配置的方式来配置你的 Dubbo 应用 如果你的应用足够简单,例如,不需要多注册中心或多协议,并且需要在spring容器中共享配置,那么,我们可以直接使用 dubbo.properties 作为默认…

使用Docker分分钟启动常用应用

前言Docker是目前比较火的一个概念,同时也是微服务中比较关键的一个容器化技术。但是,单从理论上好难看出Docker的优势,因此,我希望在这篇文章中提供一些Docker的使用示例,希望从实际应用上帮助大家理解Docker的优势&a…

nssl1337-矩形统计【单调栈】

正题 题目大意 一个n∗nn*nn∗n的矩阵,然后有些位置破损。求可以剪出多少个不破损的矩形。 解题思路 预处理upi,jup_{i,j}upi,j​表示从(i,j)(i,j)(i,j)向上多少格子都是非破损格子。 然后我们枚举下界LowLowLow,将图像变成一个下部平整的条形图&…

TypeScript 2.7 版本发布

TypeScript 2.7版本已经发布了,新增了几个主要功能特性并进行了一些bug的修正。其中一些亮点包括对类属性的赋值检查、固定长度的元组和改进对象文字的类型推断。总的来说,这个版本对类型系统、ES2015特性和总体的TypeScript开发者体验都进行了改进优化。…

Azure Functions + Azure Batch实现MP3音频转码方案

客户需求客户的环境是一个网络音乐播放系统,根据网络情况提供给手机用户收听各种码率的MP3歌曲,在客户没购买歌曲的情况下提供一个三十秒内的试听版本。这样一个系统非常明确地一个需求就是会定期需要将一批从音乐版商手中获取到的高比特率音乐文件转换成…

Springboot Mybatis多数据源配置MybatisProperties坑

一、场景复现 配置了两个数据源&#xff0c;查询Dao却报错表不存在。 &#xff08;1&#xff09;maven <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId> </dependency> …

dotnet core webapi +vue 搭建前后端完全分离web架构(一)

架构服务端采用 dotnet core webapi前端采用: Vue router elementUIaxios问题使用前后端完全分离的架构&#xff0c;首先遇到的问题肯定是跨域访问。前后端可能不在同个server上&#xff0c;即使前后端处在同个server上&#xff0c;由于前后端完全分离&#xff0c;前后端使用…

SpringBoot使用日志

转载自 SpringBoot使用日志 1、选什么日志框架 首先列举一下日志门面和实现SpringBoot默认选用SLF4J和Logback日志级别&#xff1a;springboot默认已经帮我们配置好了日志&#xff0c;日志级别为trace<debug<info<warn<error默认的日志级别为inifo&#xff0c;日…

Dotnet Core Windows Service

在dotnet 中有topshelf 可以很方便的写windows 服务并且安装也是很方便的&#xff0c;命令行 运行.exe install 就直接把exe 程序安装成windows 服务。当然代码也要做相应的修改&#xff0c;具体的可以参照例子。在dotnet core 2.0 中 我们也有一个很方便的dll 来使用 https://…

Dubbo(十)之配置加载流程

转载自 Dubbo配置加载流程 Dubbo 中的配置加载流程介绍 此篇文档主要讲在应用启动阶段&#xff0c;Dubbo框架如何将所需要的配置采集起来&#xff08;包括应用配置、注册中心配置、服务配置等&#xff09;&#xff0c;以完成服务的暴露和引用流程。 根据驱动方式的不同&…

.NET 文档数据库 RavenDB 4.0 发布

RavenDB 还有一个新的版本&#xff0c;RavenDB 4.0.0&#xff0c;一个ACID文档数据库&#xff0c;为数据操作中的高性能业务提供完全事务性的开源NoSQL解决方案。新版本更新了许多关键功能。平台Windows x64Windows x86Ubuntu 16.04 x64树莓派Docker&#xff08;Ubuntu 16.04和…

dotnetcore+vue+elementUI 前后端分离架 二(后端篇)

前言最近几年前后端分离架构大行其道&#xff0c;而且各种框架也是层出不穷。本文通过dotnetcore vue 来介绍 前后端分离架构实战。涉及的技术栈服务端技术mysql本项目使用mysql 作为持久化层本项目采用了 mysql 的示例 employees 数据库, 需要的朋友可以自行下载 。http://www…

SpringCloud Gateway配置自定义路由404坑

一、场景复现 微服务自定义路由&#xff0c;返回404页面。 ①如图&#xff1a; &#xff08;1&#xff09;springcloud-gateway的路由设置 Configuration public class RouteConfig {Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return buil…

Actor-ES框架:Ray-Handler之ToReadHandler编写

如图右上角所示&#xff0c;Ray中有两类Handler&#xff08;SubHandler和PartSubHandler&#xff09;,在使用中&#xff0c;SubHandler派生Actor的CoreHandler&#xff0c;PartSubHandler派生SQLToReadHandler&#xff0c;SQLToReadHandler派生Actor的ToReadHandler&#xff0c…

SpringCloud Zuul(十)之配置路由prefix坑

一、场景复现 配置prefixapi访问/api/micro-service/test接口404 &#xff08;1&#xff09;zuul配置 zuul:strip-prefix: true #转发路径截断匹配前缀prefix: "api"add-proxy-headers: falseset-content-length: truesemaphore:max-semaphores: 600 &#xff08;…

在Firefox 58中,WebAssembly组件性能提升了10倍

Mozilla在Firefox 58中为WebAssembly&#xff08;WASM&#xff09;组件推出了一套双层编译系统&#xff0c;号称解析和编译WASM代码的速度达到30-60MB/s&#xff0c;足够在有线网络中实现实时编译。基准测试表明&#xff0c;新版的性能比旧版提高了10倍&#xff0c;比Chrome快1…