东莞网站优化怎样,it程序员工资一般多少,网站开发工程师就业形势,品牌推广名词解释对于Web系统开发来说#xff0c;Net其实也是有好多知识点需要学的#xff0c;虽然目前JAVA是主流#xff0c;就业市场比较大#xff0c;但Net也在积极的拥抱开源#xff0c;大Net Core 2 出来了#xff0c;这无疑给Net开发者带来更大的希望#xff0c;好了#xff0c;以… 对于Web系统开发来说Net其实也是有好多知识点需要学的虽然目前JAVA是主流就业市场比较大但Net也在积极的拥抱开源大Net Core 2 出来了这无疑给Net开发者带来更大的希望好了以下是自己画的知识图给正在找工作的自己一个时间梳理下同时也希望给你带来些许帮助第一次画并鉴于自己知识点有限画的不好欢迎拍我我及时纠正谢谢 注图是总-分结构会针对一个知识点展开说明 总结构图 图一 分布式-结构图 图二 分布式缓存 Memcached : 当然非真正意义的分布式缓存系统分布式需要客户端自己实现特性key-value 方式存储内存缓存不支持持久化多台服务器负载之间不支持通信简单高效可靠性弱。 Redis:用途较多当缓存用高并发用提高吞吐量当分布式锁用SETNX 方式。特性key-value 方式存储二进制集群有事务却无事务回滚功能持久化可靠性强 Mongodb:No-SQL 数据库当然没有数据结构可以做海量数据存储特性主从复制集集群持久化基本支持所有的数据类型灵活强大的查询功能 算法 算法是我们解决分布式问题的利器。 取模公式 a hash(key)%N a 是哈希值hash 为哈希函数key 是我们的服务器IP或名称N是服务器数量从公式中可以直观看出当我们增加或删除服务器数量时会导致大部分失效如果是缓存则命中率大部分失效可能导致缓存雪崩另外分库分表 也可以采用取模算法因为数据库可以做复制集或镜像能进行数据同步也就是不存在失效的情况了。 哈希一致是一个环形链表首先hash(key)---key (可看作是key-value 的形式) 是均衡的分布在链表中同样的问题当我们动态增加和删除服务器时会动态重新负载到另外一台Key即服务器上這样就保证了新的请求仍然正常工作但会存在局部数据存在丢失的故障那解决办法是物理冗余做好数据同步。 网络通信-结构图 图三 WebApi基于Rest 架构风格采用Http协议使用Asp.net 编程模型进行实现其常见的规范和约束1,URLAPI 使用名称2使用Http行为来表述行为GetPOST,PUT,Delete;3请求和响应约定序列化方式Content-Type,Accept4返回状态码尽可以和http返回状态一致比如200代表成功500 代表服务端异常5无状态可方便扩展6使用HATEOAS约束对客户端提供一个URL响应中返回你所有资源的URL及行为方式后续客户端可根据响应中的链接进行资源访问无论服务端如何变化而对客户端而言始终透明以此降低客户端的维护成本。 WCF:采用SOAP 协议是以RPC-XML 规范为依据使用WSDL 进行描述和定义支持http/s TCPMSMQ 等通信协议定义契约实施开发客户端集成方式有多种可以直接引用服务可以继承ClientBase,可以通过ChannelFactory 信道工厂创建客户端实例当然无论采用方式都是采用客户端代理模式的方式来透明实现在代理中有很多技巧比如实现服务端的负载均衡比如自定义读取客户端WCF相关的配置文件和其它配置进行解耦方便维护WCF内部很多基础实施已然有很多扩展点对客户端的认证 可以使用 UserNamePassowrdValidator 进行扩展授权 可以使用 IAuthorizationPolicy 进行扩展并使用CASCode Access Securty 和 特性技术全局异常点可以对 IErrorHandler 进行扩展服务行为 可以对 IServiceBehavior 进行扩展而且这些扩展代码实现并能基于配置完成 C#-结构图 图四 数据类型总体分为值类型和引用类型值类型包括 int,double,enum,float等其特点是不变性引用类型包括string , class, interface 等这里面尤其说明的是string 也有不变性strng a1 和 string b1 中 a 和 b 是指向同一个引用而且 string a12 中间其实生成了临时的新对象并占用了一定内存建议使用 StringBulider ; 值类型和引用类型的转换为装箱和拆箱影响性能要尽量少的强制类型转换可以使用泛型进行强类型约定 集合List 无序可重复线程非安全存在泛型复杂度为 O(n) Dictionary 字典key 不可重复线程非安全存在泛型查找复杂度 O(1)HashTable 字典key 不可重复线程安全查找复杂度 O(1); 当然还有 QueueStack 等 一般情况有对应的线程安全集合在前面加Concurrent如 ConcurrentQueue,ConcurrentDictionary ; 委托和事件都可以进行内部解耦回调广播只是委托更加灵活可以做为函数参数传入而事件只能在内部调用当然委托和事件的定义也不同事件是建立在委托定义之上更强调的是消息通知。 类和接口多态封装继承是面向对象的基本数据和特性通过设计模式和设计原则能很清晰的熟悉面向对象的方式方法如5大原则开闭原则单一原则依赖倒置原则里氏替换原则接口隔离原则其定义不再赘述。 并发-结构图 图五 有高并发的开发需求首先要规划你的硬件、软件架构那规划的依据是量化的数据如PV,QPS;还要清楚软件的特性和用什么技术然后还要通过性能测试进行辅助如JMeter , 根据测试工具压测得出整体服务的响应时间吞吐量另外还要对数据进行分析看是否存在数据错乱的情况。 缓存主要是避免数据库IO的瓶颈而在内存进行处理当然单机缓存容量有一定局限可以N台机器互联共享内存则采用分布式缓存在高并发情况下使用缓存有一个思路是 相关业务操作及代码实现可以完全在缓存中操作有些数据可以先预热到缓存中服务运行的时候可以直接从缓存中读取那缓存中数据更改后最终要同步到数据库可以异步队列的方式进行消息订阅和发送或者采用轮询定时从缓存中取出数据写入到数据库在设计过程中格外注意同步失败或出现故障的情况要有重试机制其实在独立模块独立服务中有些服务并发并不高那数据可以直接先写入到数据库中而后再被缓存起来最后 依据CAP定律如果服务可用并是容量分区这里是如果采用分布式缓存最后只能是弱一致性所以我们设计是解决90%以上的问题当然如果能解决99.999%的问题更好了另外10% 可以人工介入加以解决。 限流高并发情况下肯定不能将全部请求全部接受并一次性处理那服务有被搞崩溃的可能那就可以将部分重复请求丢弃可以使用Nginx 的 对客户端IP进行限制同时高并发下肯定有些重要数据资源会存在竞争如何保持数据一致性使用锁机制悲观锁会严重影响性能但不会存在脏读写错的情况乐观锁会存在脏读的情况但能保证数据写入没有问题一般我们采用分布式锁使用Redis 的SETNX 特性Redis 是单线程存在事务但事务没有回滚机制Redis的事务是命令集的方式如 SETNX 如果不存在Key 值则返回true, 如果已存在Key 值则返回false 如果返回false 代表请求已存在则请求被直接丢弃其实Redis 的 SETNX 和 Membcached 的Add 有点类似然后使用队列将请求串行化到数据库基本访问不会太高最后的数据库起码要最好主从模式避免单一故障最好数据冗余。 算法对请求进行限流有个很常用的手法令牌桶我们先申请访问的token, 并注入到一个桶容器中设置容器的最大token 量超过的请求直接丢弃当请求访问时验证token 是否存在如存在则正常处理后续业务逻辑并删除token, 否则直接丢弃请求以上算法的实现方式可以使用 Redis 中的 SETNX Delete 命令实现 队列有很对成熟的队列消息中间件其中RabbitMQ 是较为常用支持消息的持久化避免中心服务DOWN 机后消息丢失支持ACK机制当消费者宕机或其它网络原因导致没有收到消息则队列会进行重发消息直到消费者确认收到通过BasicAck 命令进行发送则消息从队列中删除有限流机制可以通过内存大小磁盘大小及上游流量大小三种方式对请求进行限流可以集群但各服务器队列进程不互相通信所以需要客户端实现分布式算法可以采用哈希一致性 安全-结构图 图六 加密对称加密aE(key) , b D(key) a 是加密后值E 是加密算法key 是密钥b 是解密后值D 是解密算法可以看出加密解密的key 是一致的共享的所以只要知道key双方都可以进行加密解密存在不安全因素常用的对称加密算法 DES; 数字签名即对内容进行加密的一个字符串数字摘要主要是为了保证内容的完整性及身份认证常用的数字签名的算法MD5非对称加密 cE(key1),dD(key2) c 是加密后值key1 为私钥E 是加密算法d 是解密后值D 是解密算法key2 为公钥可以看出加解密所使用的密钥不同当然也可以私用私钥解密公钥加密双方的家解密的私钥不公开保证一定安全性,常见的非对称加密算法RSA. 认证常用的技术是使用Token或数字证书Token 一般可以认为是数字签名数字证书可以认为是X.509(是证书的标准规范和解析)X.509 使用的是非对称加密客户端根据证书中私钥对特定内容进行加密然后发送到服务端服务端通过公钥进行解密校验认证微信公众号开发中涉及的微信端和我们服务端的双向认证是Token但采用的对称加密. 授权Net 里面比较常用且规范的模式是RBAC,即基于角色控制授权具体实现可以是 HttpModule Attribute ; HttpModule 是对所有一般不包括静态资源请求线程进行权限实例初始化并进行维持该会话然后在每个需要授权的方法上标注Attribute及权限IDAttribute 可以对CodeAccessSecurityAttribute进行扩展实现。 SSO,一般我们有這样的需求比如有多个子系统我们在一个系统中登陆成功后其它系统就会共享此登陆状态而不用再进行登陆或者 我们有一个系统但是有多端可以使用比如PC端App端当在一个客户机上登陆成功后其它端或客户机即刻自动退出避免多端操作由此我们想到了肯定要把一端登陆成功的状态进行保存并能够在多端共享并能全局访问拥有此特点的想到了有分布式缓存。 Web后端框架-结构图 图七 从最开始的Asp.net 到 现在的MVC3 以上版本对开发越发灵活和成熟MVC 是一种模式而非技术实现此处具体技术不再阐述可以重点关注下一些比较实用的高级特性比如 Area , Filter 等。 SignalR 是实时性框架即主动通知客户端和服务端基于Http 建立长连接当服务端有新的消息时可以主动推送到客户端常见客户端订阅可以基于JavaScript , C# 实现Android 端也有叫SignalA但没用过SignalR 内部通信机制有4种最好的是WebSocket , 客户端可以指定采用何种通信机制一般是自动切换模式采用或切换到那种通信模式依据是客户端的环境理论上是越高配的性能就越好。 领域驱动设计是架构模式由此引申出来一套理论和方法值对象像C#里面的值类型也是不变性的只是值对象是一个Class实例的对象此Class 里面有1个或多个属性为此我们必须覆写它的Equal 和 GetHashCode 保证它的不可变GetHashCode 是在用到 字典时进行验证的所以保险起见也要覆写实体对象 是唯一的每次我们New 完都是使用的不同的对象实体避免内存对象不一致的情况所以需要给定一个唯一标识即也要对Equal 和 GetHashCode 进行覆写聚合根是包含了值对象和实体对象一个聚合根可以理解为一个领域内的模型一般聚合根可以通过接口进行标注说明而多个聚合根之间的会话通过领域事件来完成领域事件的实现一般采用发布-订阅模式事件通过接口进行标注发布者可以将订阅者注入到容器中容器的实现可以使用IOC框架如Unity,Autofac等发布时根据不同的事件通知给不同的订阅者进行触发由于事件通知的是另外一个聚合根而很可能出现跨网络边界进行通知依据CAP定律会出现数据不一致的情况所以使用Event Source 进行事件回放可以理解为重试机制Event Source 最好和当前聚合根在同一个事务中进行事件回放可以另一个进程来完成而另一个聚合根和Event Source 比如处理完成后修改其状态最好也是在一个事务中这样保证数据一致性当然这里面会存在事件重复发的可能解决方法增加一个字段标识当事件发出去后即可将此标识标记为一个特定状态比如发送中下次调度就不再取发送中的事件即可在高并发情况不建议使用事务所以另外一个Event Source 实现方法是 使用队列我们对操作进行抽象无非就是CRUD而CUD 我们可以抽象成命令也就是写操作R 我们知道是查询也就是读操作而CQRS就是命令查询职责分离一般用在读写分离的架构当中写操作一般使用的工作单元模式而读操作可以很灵活可以使用原生的Ado.Net而读写操作可能会存在一定的时间延迟比如写后异步处理读的时候可能还是脏数据所以这个延迟或者要求不能延迟具体项目要具体设计和实现。 多线程-结构图 图八 为什么会有线程为了进程的稳定一个进程死掉了不能影响到其他进程而为什么会有进程为了操作系统的稳定不能在操作系统上操作一个记事本就把整个系统给搞崩溃了线程是进程的逻辑单元多个线程存在共用一个CPU的情况会出现资源竞争为了保证数据不错乱要对线程进行调度每隔30毫秒进行一次切换当然切换的过程存在性能磨损也是为了用户体验和系统的可靠性牺牲一点性能在我们多核时代这一点性能其实也是可以忽略的 线程实现Net 中关键字 Thread , 分前台线程和后台线程通过IsBackgournd来标记一般我们都使用后台线程即异步线程分优先级去处理在调度过程中优先级高的优先处理Net 中提供了比较丰富的线程API比如Sleep,JoinAbort 就不再一一赘述了线程池是为了解决线程来回切换损失的性能它的主要作用就是 线程复用当一个线程处理完成任务后重新回到线程池中等待下次再用有时我们异步处理数据时为了提高性能对数据进行分组然后分别放在不同的线程中去处理比如 一个线程池中有5个线程一批数据有 1000 条则每一个线程处理200 条当然可能会出现不整除的情况取模当线程处理完成后重新回到池中等待下一个任务线程池也有不足比如无法实时查看线程进度不能反馈执行结果這样Task 就出现了Task 是在线程池的基础上进行了封装优化Net 同样也提供了丰富的API ,比如 Run, StartFactory, Wait,WaitAll,ContinueWith 等 线程模式有很多模式可以做为模板进行实现Single Thread 即我们常见的 线程内加锁的方式多线程时通过加锁来保证数据同步Product-Customer 即我们发布订阅的模式生产者、消费者可以是多线程而中间的数据容器可以使用内存列表数据库或者队列Thread-Pre-Message , 即线程池模式多个线程在池中进行生命周期的维护Asyn和Asyn And CallBack 即是我们常用的Task 来异步处理和带委托进行回调的方式当然你也可以架构方面更高层面进行理解 打的手有点疼了就先写到这吧以上是自己的一点心得体会如有不当还请指教谢谢。 原文地址http://www.cnblogs.com/wangzhiyong/p/7631534.html.NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注