首页 文章 精选 留言 我的

精选列表

搜索[思考模型],共10000篇文章
优秀的个人博客,低调大师

# 云原生的新思考,为什么容器已经无处不在了?

作者| 易立 阿里云容器服务总监 4 月 24 日,中国信息通信研究院主办的首届云原生产业大会在北京举行,在《云原生数字引领未来》的主题演讲中,阿里云容器服务总监易立表示:“云原生不但可以很好的支持互联网应用,也在深刻影响着新的计算架构、新的智能数据应用。以容器、服务网格、微服务、Serverless 为代表的云原生技术,带来一种全新的方式来构建应用。”本文根据易立演讲内容整理而成。 拥抱云原生技术,解耦系统复杂度 如今,大多数企业开始全面拥抱云计算,在 All-in-Cloud 全面到来的时代,三个重要转变:基础设施的云化、核心技术的互联网化、业务的数据化和智能化。在各行各业中,都有很多业务应用从诞生之初就生长在云端,各个企业也因此越来越像互联网公司,而技术能力被视为不可或缺的核心竞争力。在 2019 阿里云峰会·北京站上,阿里云智能

优秀的个人博客,低调大师

云原生的新思考,为什么容器已经无处不在了

4月24日,中国信息通信研究院主办的首届云原生产业大会在北京举行,在《云原生数字引领未来》的主题演讲中,阿里云容器服务总监易立表示:“云原生不但可以很好的支持互联网应用,也在深刻影响着新的计算架构、新的智能数据应用。以容器、服务网格、微服务、Serverless为代表的云原生技术,带来一种全新的方式来构建应用。”本文根据易立演讲内容整理而成。 拥抱云原生技术,解耦系统复杂度 如今,大多数企业开始全面拥抱云计算,在All-in-Cloud全面到来的时代,三个重要转变:基础设施的云化、核心技术的互联网化、业务的数据化和智能化。在各行各业中,都有很多业务应用从诞生之初就生长在云端,各个企业也因此越来越像互联网公司,而技术能力被视为不可或缺的核心竞争力。在2019阿里云峰会·北京站上,阿里云智能总裁张建锋在谈及‘核心技术的互联网化’时,也提到

优秀的个人博客,低调大师

Java多线程 -- 公平锁和非公平锁的一些思考

在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。本文围绕ReenTrantLock来讲。 实现原理 那如何能保证每个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。 在公平的锁中,如果有另一个线程持有锁或者有其他线程在等待队列中等待这个所,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中(此时和公平锁是一样的)。所以,它们的差别在于非公平锁会有更多的机会去抢占锁。 公平锁: final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } #hasQueuedPredecessors的实现 public final boolean hasQueuedPredecessors() { Node t = tail; // Read fields in reverse initialization order Node h = head; Node s; return h != t && ((s = h.next) == null || s.thread != Thread.currentThread()); } 非公平锁: final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } 示例 公平锁: package com.thread.fair; import java.util.concurrent.locks.ReentrantLock; /** * Created by Fant.J. */ public class MyFairLock { /** * true 表示 ReentrantLock 的公平锁 */ private ReentrantLock lock = new ReentrantLock(true); public void testFail(){ try { lock.lock(); System.out.println(Thread.currentThread().getName() +"获得了锁"); }finally { lock.unlock(); } } public static void main(String[] args) { MyFairLock fairLock = new MyFairLock(); Runnable runnable = () -> { System.out.println(Thread.currentThread().getName()+"启动"); fairLock.testFail(); }; Thread[] threadArray = new Thread[10]; for (int i=0; i<10; i++) { threadArray[i] = new Thread(runnable); } for (int i=0; i<10; i++) { threadArray[i].start(); } } } Thread-0启动 Thread-0获得了锁 Thread-1启动 Thread-1获得了锁 Thread-2启动 Thread-2获得了锁 Thread-3启动 Thread-3获得了锁 Thread-4启动 Thread-4获得了锁 Thread-5启动 Thread-5获得了锁 Thread-6启动 Thread-6获得了锁 Thread-8启动 Thread-8获得了锁 Thread-7启动 Thread-7获得了锁 Thread-9启动 Thread-9获得了锁 可以看到,获取锁的线程顺序正是线程启动的顺序。 非公平锁: /** * Created by Fant.J. */ public class MyNonfairLock { /** * false 表示 ReentrantLock 的非公平锁 */ private ReentrantLock lock = new ReentrantLock(false); public void testFail(){ try { lock.lock(); System.out.println(Thread.currentThread().getName() +"获得了锁"); }finally { lock.unlock(); } } public static void main(String[] args) { MyNonfairLock nonfairLock = new MyNonfairLock(); Runnable runnable = () -> { System.out.println(Thread.currentThread().getName()+"启动"); nonfairLock.testFail(); }; Thread[] threadArray = new Thread[10]; for (int i=0; i<10; i++) { threadArray[i] = new Thread(runnable); } for (int i=0; i<10; i++) { threadArray[i].start(); } } } Thread-1启动 Thread-0启动 Thread-0获得了锁 Thread-1获得了锁 Thread-8启动 Thread-8获得了锁 Thread-3启动 Thread-3获得了锁 Thread-4启动 Thread-4获得了锁 Thread-5启动 Thread-2启动 Thread-9启动 Thread-5获得了锁 Thread-2获得了锁 Thread-9获得了锁 Thread-6启动 Thread-7启动 Thread-6获得了锁 Thread-7获得了锁 可以看出非公平锁对锁的获取是乱序的,即有一个抢占锁的过程。 最后 那非公平锁和公平锁适合什么场合使用呢,他们的优缺点又是什么呢? 优缺点: 非公平锁性能高于公平锁性能。首先,在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。而且,非公平锁能更充分的利用cpu的时间片,尽量的减少cpu空闲的状态时间。 使用场景 使用场景的话呢,其实还是和他们的属性一一相关,举个栗子:如果业务中线程占用(处理)时间要远长于线程等待,那用非公平锁其实效率并不明显,但是用公平锁会给业务增强很多的可控制性。

优秀的个人博客,低调大师

阿里云数字零售思考与实践

摘要:在如今,越来越多的企业开始以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。 何为新零售? 从新零售的本意回推,新零售其实也是一种商业行为,商业是有组织的向顾客提供需要的商品和服务,新零售有以下四个特点: 1.线上线下的商业融合。 2.以消费者体验为核心的数据驱动。 3.新技术重新定义新商业模式。 4.零售与品牌的数字化转型创新之路。 自从提出新零售的概念后,新零售的最新模式就是混搭模式,其实在身边有许多类似的模式。比如新加坡的樟宜机场,现在不仅仅是一个机场,更是新加坡国内的一个旅游景点,里面有购物中心、亲子乐园、酒店等等。另外在苏州也有一个理发店叫UpperCut,它除了理发之外,也是一个社交场地,大家

优秀的个人博客,低调大师

Bad Rabbit病毒引发的企业数据安全的思考与应对方案

十月底,欧洲地区爆发新型勒索病毒Bad Rabbit,感染范围包含俄罗斯、乌克兰、德国等多个东欧国家。据国内网络安全企业介绍,该病毒伪装成Adobe flash player欺骗用户安装,感染后会在局域网内扩散。目前国内暂时还没有感染到该病毒,但国家通信管理局今日也已广泛提醒国内用户及时采取应对措施,密切关注病毒演变情况,积极防范。 在过去的一年里,比特币勒索,WannaCry病毒等给很多企业带来了严重的损失,这一次bad rabbits再次敲响警钟。 数据是企业的重要资产,企业的核心数据更是企业最重要的资产之一,保障核心数据的安全是信息建设和运维过程中最重要的工作。数据的篡改和泄露给企业造成的损失是不可估量的。在信息安全形势日益严峻的国内外形势下,数据安全,尤其是中央企业的数据安全更加关键。 业务快速发展引发的数据安全隐患 随着业务快速增长和信息化建设不断发展,企业的数据库规模越来越大,数据在成为企业核心资产的同时,其被违规访问、删除、修改、复制等安全问题也成为了企业IT最大的威胁,企业基于数据库的安全防护也成为越来越迫切的课题。 对于电网行业来讲,数据的安全不但关系着电力业务的正常开展,而且直接关系到每一个用户的信息安全,因此保障安全、促进发展成为贯穿科学建立电力数据安全技术体系,促进电力业务发展的根本原则。 南网某网省公司在深入信息化建设的过程中,建立了以“6+1核心系统”为中心的业务系统生态圈,系统的整合集中给运维管理带来了极大的便利,也促进了企业的业务变革和创新。然而,由于各个系统之间的数据流向错综复杂,随着业务的发展数据量的增加,数据安全问题日益暴露出来,核心数据的副本难易控制,运维人员的操作无法跟踪,核心系统面临着关系难说清、安全难管控、运维难管理三大安全难题。 从数据库的安全生态角度来讲,安全可以分为五大方面:软件安全、备份安全、访问安全、防护安全、管理安全。确保使用正版安全的软件以及做有效的数据备份的安全管理的前提,除此之外,在数据库的安全防护层面,确保数据的访问来源和访问方式安全可控,以及加强企业内部的安全管理流程,都是必不可少的环节。 而目前对于该网省集团来说,随着业务系统变得复杂,在数据交互安全(防护安全)和管理安全上面临很大的隐患。 技术为本,安全管控 基于日常运维过程中面临的困境和行业信息化发展现状,集团内部打算从两方面加强企业的数据安全管控。 1、通过建立中间库,通过中间库隔离外围系统与核心系统之间的DBLink对外围系统对核心库的访问进行隔离 2、创建数据运维平台对数据库操作进行严格管控和审计 中间库的数据隔离 通过创建中间库隔离外围系统对核心数据库的访问,外围系统的数据访问请求创建DBlink到中间库,外围系统的数据访问需求按照访问范围、访问频率、访问目的等要素进行审核后同步到中间库,外围系统从中间库获取所需数据,同时对中间库进行细粒度审计,严格管控外围系统对中间库的访问。这样,不仅避免了外围系统对核心库运行的影响,中间库也能完全掌握数据的流向。 这对平台的稳定性、安全性、并发性、易管理性都有较高的要求。 从技术角度来讲,在保障核心系统安全稳定运行的情况下,部分核心数据能够被必要的外围系统获取到,需要在技术上保证同步技术的可行性。 从管控平台上,需要统一服务标准和流程,要实现易操作和易维护。 从基础架构角度,接入平台作为核心系统和外围系统的交互枢纽,是整个数据流的关键环节,为了保证接入平台的安全稳定高性能运行,需要基础数据库架构具有开放式、高可靠性、高性能、可扩展性、易管理性的特点。 基于以上的考虑因素,在其服务商云和恩墨专家的建议下,计划采用分布式存储架构是实现中间库的高可用。同时建立数据运维平台对日常操作进行管控,数据运维平台整体功能架构如下: 在服务和应用层面实现对数据的安全保护,针对当前系统DBlink流向复杂的问题,首先对系统化进行全方位的审计,包括数据库层面比如用户权限、SQL等审计,操作系统审计等,避免无权或没有必要的重复访问。同时对DBlink进行封装,保证相似任何情况下,核心数据都不会直接暴露出来,访问者只能看到其结果展示。 在支撑层面实现平台的高性能和高可用。基于zData的分布式管理平台,通过多台X86服务器配合InfiniBand交换机、InfiniBand HCA 卡及PCIe闪存卡协同工作,能够极大提升计算能力、IO吞吐能力,同时,降低维护成本。 对于展现层、应用层和服务层的操作,指定统一的标准和操作规范。对不同的操作人员进行合理的分组和权限分配,避免应用层的非法访问。 开发数据库运维平台实现管理安全 针对管理的安全问题,建立企业核心数据接入平台,保证核心数据的安全可控,在管理理念、管理方法、管理规范上进行全面提升,实现低成本、高效率的运维能力。这既是企业核心数据安全的迫切需求,也符合目前信息系统建设大环境的方向。 1、严格管控对生产库的DML/DDL高危操作 由于运维工作的需要,二、三线运维人员对数据库有DML/DDL的权限,这部分操作对于核心数据的安全威胁较大,因此对这部分操作实现审批流程,只有通过业务审批、技术审批的DML/DDL操作才能执行,同时在执行前会对数据进行强制备份,备份数据安装任务标识存储到中间库中,提供高效的恢复机制。 2、采用工具箱将日常重复的工作进行封装,规范日常查询,管控频繁的查询工作 对于运维工作中需要频繁对数据库进行查询的工作,经过调研发现这部分工作的查询语句不多,可以进行固化,因此将这部分查询语句进行封装,以服务的形式提供给运维人员使用,运维人员在对数据库查询时不再需要编写SQL语句,只需要选择对于的查询服务并输入相应变量即可,服务通过权限授予运维人员,对服务的调用都会被记录日志。这样既管控了运维人员频繁查询工作,也防止低效的SQL语句对生产库造成的冲击。 3、对于需要频繁进行查询即更新的运维工作,通过SQL解析器进行高效的执行 在网省内部的数据运维工作中有部分特殊的操作,比如数据治理工作,该项工作需要频繁的对生产库进行查询、修改,这部分工作对于核心数据的安全威胁较高,但是查询语句不能固化、更新操作不能走审批流程。针对类似的需求,数据运维平台提供SQL解析器功能,在SQL解析器中可以直接编写并运行增删改查语句,但是增删改查的操作权限会按需授予用户,同时通过对象黑白名单控制用户能操作哪些对象,对于非法的语句会被直接阻断,同时在SQL解析器中的操作都会记录操作日志。 在IT 技术高度发达的今天,风险是无处不在、层出不穷的。当今IT 安全建设的重点已经从传统的网络安全、系统安全等领域转向了如何加强 IT 系统核心的数据库安全防范。而对于IT核心的数据库系统,采取主动防护,将可以帮助我们监控、分析和屏蔽很多未知风险。 多重保护,杜绝隐患 除了在技术上进行安全管控之外,网省集团还在以下方面重点加强安全措施: 1、组织保障 比如成立领导小组,统一管理各项接轨工作;建立管控机制,协调工作资源与进度;设立专门的项目负责小组等。 2、制度保障 比如工作汇报机制、完善跟踪检查和监督机制、完善绩效管理机制、建设常态交流机制等。 该电网集团通过核心数据接入平台对数据的交互及数据运维工作进行统一管控,技术与管理双重加强,既能防止数据库的内部误操作导致的数据不安全,也能防范来自外围数据库的攻击。 原文发布时间为:2017-11-25 本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

优秀的个人博客,低调大师

由面试引发的思考:B/S与C/S究竟是何物

一、现状说明: 就在这金三银四的求职黄金时期,我有幸作为公司的独立技术面试官,拥有最终决定录用权,在倍受上级领导的充分信任下,我也向上级保证,一定要为公司找到合适的人才,就在我满怀信心的情况下面试了一个又一个的求职者,发现了大多数求职者共同的问题,一是:眼高手低,即工作年限虽长,但受工作内容及个人原因,基础知识薄弱,很多技术使用了N年,却不明白其原理,可以说是:只知道这样用,但为什么要这样用,能否有别的解决方案从来都没有去考虑过或总结过,知识的广度就更不用说了,薪资期望却都很高。二是:B/S与C/S分不清,认为B/S就是做与网页有关的东西,可以涉及到的技术点多,如:JS\CSS\HTML\C#\MVC,只想从事B/S方向的工作内容,觉得其热门与流行,而认为C/S就是做客户端桌面程序,如:WINFORM,WPF;觉得其太简单了或没有发展前景,那么实事是这样吗?本文主要就是来谈谈B/S与C/S究竟为何物,它们之间到底有什么异同点。 二、B/S B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的,Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。不依赖用户的电脑操作系统环境,只与浏览器环境有关,当然由于网页复杂性,又延伸出网页前端技术与后端技术,前端技术指的是在浏览器上编程的技术,比如:JS,HTML,CSS,这些前端技术是运行在客户端Browser浏览器上的,而并非在服务器端,如果不信,可以测试一下,当你的页面中包含JS脚本时,若将浏览器属性中的禁用JS启用,你会发现页面中那些依赖JS的技术都没办法使用。后端技术指的是运行在服务器上编程的技术(也就是Server端),比如:C#,JAVA,这些编程技术与我们通常所理解的C#编程,JAVA编程是一样的,只是这里需要考虑到基于HTTP协议的编程。架构图如下所示: 三、C/S C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的,这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大,比如:若想运行基于WINFORM开发的EXE程序,必需要先在电脑上安装.NET FRAMEWORK组件,否则无法正常运行。Server端这里是一个非必要的部份,若客户端是一个单机应用程序,无需数据库或其它分布式技术,那么Server端是可以省略的,若客户端需要数据库或其它分布式技术,那么这里的Server端指的是数据库服务器端或其它分布式技术(WEB API,WEB SERVICE等)所在的服务器端。架构图如下所示: 四、B/S与C/S异同点 B/S与C/S的共同点从英文缩写都能看得出来,都有S,这个S指的是服务器端(应用程序后端),服务器端只是一个统称,具体细分的话,有:应用程序服务器端、数据库服务器端、缓存服务器端、文件服务器端等,不同点同样也可从英文缩写中看得出,那就是B与C的区别,从前面分别介绍与B/S与C/S得知,B指的是浏览器端,C指的是客户端,但是如果从广义的角度来说,B同样也是一种客户端,浏览器同样需要安装,不安装同样B/S结构也一样不能工作,只是一般浏览器都默认安装罢了,从架构的层面来讲,B/S与C/S的唯一区别就是展现层不同,B/S可能需要懂网页前端技术,C/S可能需要懂WINFORM,WPF等应用前端技术,其余全部都相同,如果单纯讲从事C#或JAVA后端开发,那么B/S与C/S就是一样的,都是利用C#或JAVA之类的动态语言为展现层提供资源或对资源进行相关的处理。如果一个公司分工明确的话,那么C#或JAVA工程师所应该做的事情就是后端开发,与前端无关,也就没有必要强调B/S与C/S了,当然懂点前端技术更好,可以为自己的技术锦上添花,但如果要让公司为你懂得前端技术而买单(提高工资待遇)【全栈工程师除外】那多半有点一厢情愿了,换作我是老板,我肯定更愿意找专业的前端与专业的后端,这种前后端都略懂,但都不够专业的,还不如不要。B/S与C/S的统一架构如下图示: 为了让新手们能够理解上述B/S与C/S合二为一的架构图,我写了一个非常简单的DEMO,以体现B/S与C/S的共同点与不同点,代码如下: Server端: 1 2 3 4 5 6 7 8 9 10 namespace Demo.Server { public static class Logic { public static int Add( int a, int b) { return a + b; } } } Browser端(后端-属于Server端,但有别于上面的单独Server层,这里需要引用Server层): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 namespace Demo.Browser { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { } protected void Button1_Click( object sender, EventArgs e) { TextBox3.Text=Demo.Server.Logic.Add( int .Parse(TextBox1.Text), int .Parse(TextBox2.Text)).ToString(); } } } Browser端(前端): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Demo.Browser.WebForm1" %> <! DOCTYPE html> < html xmlns="http://www.w3.org/1999/xhtml"> < head runat="server"> < meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> < title ></ title > </ head > < body > < form id="form1" runat="server"> < div > < asp:Label ID="Label1" runat="server" Text="数值1:"></ asp:Label > < asp:TextBox ID="TextBox1" runat="server"></ asp:TextBox > < asp:Label ID="LabelAdd" runat="server" Text="+"></ asp:Label > < asp:Label ID="Label2" runat="server" Text="数值1:"></ asp:Label > < asp:TextBox ID="TextBox2" runat="server"></ asp:TextBox > < asp:Label ID="Label3" runat="server" Text="="></ asp:Label > < asp:TextBox ID="TextBox3" runat="server"></ asp:TextBox > < asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> </ div > </ form > </ body > </ html > 运行结果如下: Client端:创建一个WINFORM窗体,添加类似上面的三个文本框及一个提交按钮,最后写点击事件(需引用Server层) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 namespace Demo.Client { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { textBox3.Text = Demo.Server.Logic.Add( int .Parse(textBox1.Text), int .Parse(textBox2.Text)).ToString(); } } } 运行结果如下: 当然这个DEMO非常的简单,主要是为了体现除了展示层(网页与WINFORM窗体)不同外,Server端是相同的,如果需要变更算法,只需更改Server端,那么浏览器与WINFORM客户端的计算结果都会改变,当然我这里写得肯定不够规范,仅演示而矣,完整的架构思想需考虑多方面,比如:基于接口编程,依赖注入等。 五、给新手程序员的一点建议 如果对网页前端技术很感兴趣,建议直接从事网页前端开发,相应的职位有:UI设计师,WEB前端工程师,而软件开发程师一般指的是从事后端开发,即:纯C#或JAVA等之类的编程工作,当然不排除小公司或分工不明确的公司,要求前后端都要做,所以不要一味的或片面的认为,B/S就是比C/S好,我只能说各有各的好处,最理想的架构是:在后端代码不变的情况下,可以任意切换为浏览器或客户端应用程序。最后再说一句,这世界上没有最好的技术,只有最合适的技术,技术就如同武术,基本功很重要,只要基本功扎实了,再去学习架构、设计模式,就会比较容易,同时这些看似高大上的东西,如:AOP,SOA,DI,IOC,DDD,CQRS等,只要明白其原理,举一反三就能达到“无招胜有招”的最高境界。 另外,本文并没有详细的去讲B/S与C/S的区别,如果大家想更完整的了解两者的区别,可以参见这篇文章:C/S和B/S结构区别整理,也可以直接百度查询一下,上面全是我的个人观点,若有说得不对的地方,勿喷,还请大家见谅,谢谢! 补充说明: 看到大家的评论后,虽然意料之中大家会喷,所以在文章结尾也提醒大家不要喷,但没有想到还是有这么多的人喷,我想可能大家都没有真正理解我这篇文章的中心意思,我这篇文章绝不是去深入的讲解B/S与C/S的区别,如果是这样,那我就没有必要写这篇文章了,网上一搜一大把,其实我这篇文章想要说明的思想是:不要把网页设计等同于B/S架构,不要认为会用JS,CSS,HTML就认为会B/S架构,我上面也说了如果你只是对网页前端设计感兴趣,那么建议从事WEB前端工作,而不要在面试C#软件开发工程师时,强调我想搞B/S,想搞JS,CSS,HTML,同时对网页后端编程反而没什么兴趣。本文是站在架构的角度来分析B/S与C/S的异同点,认为B/S与C/S只是展示层的不同,我上面也列举了一个简单的例子,也从来没有否认B/S里面有网页设计(包含JS,CSS,HTML),同时写这篇文章的目的是想告诉所有的新人:强化编程基本功,提高编程知识面,认清各种框架与架构的本质,从而全面提升自己,也祝愿各位离职或即将离职的人们能够早日找到好的工作。 以下统一回复评论中的问题: 1.我并没有钻牛角尖,你可能没有理解本文所表达的中心意思,也可能我说的不够明白,补充说明里有说明了真实目的; 2.有人认为我抄袭别人的文章,这个我无需解释,你可以看我的发表时间,何况本文也没有涉及什么很高深的技术,有必要抄袭吗; 3.有人认为现在还在研究B/S与C/S很肤浅,那么不知你是否明白B/S与C/S,反正我觉得一些看似简单的问题,如果不去了解与深究,可能写了一辈子代码还是停留在B/S就是做网页设计,相反一些真正的大牛是不会这样认为的,从架构的角度来讲B/S与C/S是一样的,C/S有单机版,B/S也可以有单机版呀,什么不相信,那我告诉你,静态HTML页面(里面包含JS,HTML,CSS)可以直接打开运行看效果的,不需要发布到IIS或服务器上的。同时C/S有服务端,B/S也有服务端的,C/S若采用分布式架构(如:WEB服务、WCF、WEB API等技术封装业务逻辑),那么C/S本地应用程序就只有界面展示,而所有的业务逻辑全部在服务端的这与B/S的服务端有区别吗?理解B/S与C/S的架构本质有助于你如果以后有机会从事架构师,管理者,那么就能够很好的对一些技术与架构的方向有很好的把握; 4.面试中我并没有主动问求职者也没有强调求职者说明B/S与C/S区别,只是在面试时有的求职者(新手)自己说会B/S,同时也很想往B/S方向发展,我问他会B/S哪方面,他就说了本文开头的那些话,而C#方面反而没怎么过多的研究,所以我就建议其转作WEB前端开发可能更好,同时也是引发我写本文的原因; 5.同时也感谢那些能够看明白本文所表达含义的人们,没有枉费我的苦心,我写这篇文章也绝非是要反人类或引起口水仗,还望大家理性阅读并说说你的观点,欢迎交流。 本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/5313505.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

从“连接”到“交互”—阿里巴巴智能对话交互实践及思考

(本文根据孙健/千诀 2017年5月18在中国云计算技术大会上的演讲整理) 从连接的时代到交互的时代 纵观传统互联网时代,如果用一个词来总结和概括的话,“连接”这词再合适不过了,传统互联网时代,我认为主要建立了三种连接:第一,人和信息的连接;第二,人和人的连接;第三,人与商品服务的连接。第一种连接成就了Google和百度这样的互联网巨头;人和人的连接成就了Facebook和腾讯这样的互联网公司,人和商品服务的连接,成就了Amazon、阿里巴巴、京东这样的巨头。所以,从这个意义上看,传统互联网最典型的特征就是连接。 过去3-4年,我们可以看到,连接互联网的设备发生了很大变化,设备已经从PC和智能手机延伸到更广泛的智能设备,比如智能音箱、智能电视、机器人、智能汽车等设备。智能设备的快速发展正在改变着人和设备之间的交互方式。 我们梳理一下智能设

优秀的个人博客,低调大师

PgSQL · 案例分享 · 从春运抢火车票思考数据库设计

背景 马上春节了, 火车票又到了销售旺季, 一票难求依旧。 抢火车票是很有意思的一个课题,对IT人的智商以及IT系统的健壮性,尤其是数据库的功能和性能都是一种挑战。 为什么这么说呢,我们一起来缕一缕。 一、铁路售票系统的需求 铁路售票系统最基本的需求包括 查询余票、余票统计、购票、车次变化、退票、改签、中转乘车规划 等。 每个需求都有各自的特点,例如 1. 查询余票属于一个高并发的操作,同时需要一定的统计量在里面,需要很强的CPU来支撑实时的查询。 2. 购票则更新的操作居多,需要考虑锁冲突,尽量的让不同的人购买时可并行,或者可以合并多人的购票请求,来减少数据库的更新操作。 3. 中转乘车,当用户需要购买的起点和到达站无票时,需要计算中转的搭乘方案,这个涉及的是数据库的路径规划功能。 我们来逐一分析一下这些需求的特点。 1 查询余票 1. 普通

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册