web服务器知识

了解.NET架构师知识

mrye 发表于 2019-07-27 12:50

俗话说,不想当将军的士兵不是好士兵。不想成为架构师的程序员。他们不是试图改进的程序员。 有人说架构师是一群秃顶的人,程序员是一群XX,其实现实中很多架构师都不是秃顶的,不用担心自己成为架构师变成秃顶,这是吓自己的。

俗话说,不想当将军的士兵不是好士兵。不想成为架构师的程序员。他们不是试图改进的程序员。

有人说架构师是一群秃顶的人,程序员是一群XX,其实现实中很多架构师都不是秃顶的,不用担心自己成为架构师变成秃顶,这是吓自己的。

程序员也知道如何变得浪漫,或者有多少浪漫的程序,实现了多少很酷的技巧。

1、C#中的委托是什么?事件是不是一种委托?

委托是一种引用类型,它表示对具有特定参数列表和返回类型的方法的引用。

委托用于将方法作为参数传递给其他方法。事件是由委托调用的方法。

例如:


public class DelegateTest
{
   public delegate int AddDelegate(int a, int b); //定义委托类型
   public AddDelegate addDelegate; //定义委托
   public event AddDelegate AddDelegateForEvent; //定义事件
   public int Add(int a, int b) {
       Console.WriteLine($"a:{a},b:{b}");
       return a + b;
   }
   //委托和事件的使用
   public static void Test() {
       DelegateTest text = new DelegateTest();
       text.addDelegate = text.Add; ;
       text.addDelegate(1, 2);

       text.AddDelegateForEvent += text.addDelegate;
       text.AddDelegateForEvent += text.addDelegate;
       text.AddDelegateForEvent(10, 20);//或者下面的使用
       //AddDelegate d = text.AddDelegateForEvent;
       //d(10, 20);
       //结果
       //a: 1,b: 2
       //a: 10,b: 20
       //a: 10,b: 20
   }
   //Func和Action的使用
   public static void Test2() {
       Func<int, int, int> add = (int a, int b) => { return a + b; };
       Action<int, int> addVoid = (int a, int b) => { int c = a + b; };
   }
}


C#中委托这篇文章,有更多关于委员会的介绍。Fun和Action都是微软封装的委托,一个有返回值,一个没有,c#高级函数(3)Action, Func, Tuple这篇文章更详细。

2、聊聊.NET的管道和.NET Core的中间件

. net管道:在管道模型运行之前,首先将HTTP请求传递给HttpRuntime类的一个实例。然后实例对象检测请求并找到接受的应用程序。然后管道模型使用HttpApplicationFactory对象。要创建一个HttpApplication对象来处理这个请求(它还将创建HttpContext、HttpRequest和HttpResponse), HttpApplication可以包含一系列HttpModule对象。

ASP.NET MVC请求生命周期

URL Routing Module →→ Matching Route Entry →→ Route Handle →→ Http Handle →→ Controller Factory →→ Controller →→ Action Invoker →→ Module Binders →→ Authentication Filter →→ Authorization Filter →→ Action Filter →→ Action Execution →→ Action Filter →→ Action Result

简单就是:Url →→ Route →→ Controller →→ Action →→ View

.NET Core的中间件

中间件是一个程序,它被组装到应用程序管道中来处理请求和响应,使用Run、Map和使用扩展方法来配置请求委托。请求委托用于构建请求管道并处理每个HTTP请求。

每个委托都可以在下一个委托之前和之后执行操作。委托还可以决定不将请求传递给下一个委托,这称为请求管道的短路。短路通常是可取的,因为它避免不必要的工作。


public class Startup
{
   //此处省略部分代码,创建一个新的Core web项目,可以自行查看
   public void Configure(IApplicationBuilder app, IHostingEnvironment env)
   
{
       if (env.IsDevelopment())
       {
           app.UseDeveloperExceptionPage();
       }
       else
       {
           app.UseExceptionHandler("/Home/Error");
           app.UseHsts();
       }
       app.UseHttpsRedirection();
       app.UseStaticFiles();
       app.UseCookiePolicy();
       app.UseMvc(routes =>
       {
           routes.MapRoute(
               name: "default",
               template: "{controller=Home}/{action=Index}/{id?}");
       });
   }
}

在Configure方法中是中间件。中间件组件的顺序定义了在请求中调用它们的顺序,以及响应的相反顺序,这对于安全性、性能和功能非常重要。

常用的中间件顺序

1. 异常/错误处理

2. HTTP 严格传输安全协议,HTTP协议介绍

3. HTTPS 重定向

4. 静态文件服务器

5. Cookie 策略实施

6. 身份验证

7. 会话

8.MVC

中间件例子:


public class LogMiddleware
{
   private readonly RequestDelegate _next;
   public LogMiddleware(RequestDelegate next)
   
{
       _next = next;
   }
   public async Task Invoke(HttpContext context)
   
{
       Debug.WriteLine("程序运行 开始。");
       await _next(context);
       Debug.WriteLine("程序运行 结束。");
   }
}

public static class LogMiddlewareExtensions {
   public static IApplicationBuilder UseLog(this IApplicationBuilder app) {
       return app.UseMiddleware<LogMiddleware>();
   }
}


在Configure中 app.UseLog();就可,程序运行,会在VS调试输出的地方显示

程序运行 开始。

Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "Index", controller = "Home"}. Executing action ----此处省略部分输出

Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action WebCore.Controllers.HomeController.Index (WebCore) in 13.9555ms

程序运行 结束。

3、说说数据库的隔离级别,数据库有哪些锁

数据库事物的四个特征:原子性、一致性、隔离性、持久性(永久性)。原子的:要么全部做,要么不做;一致性:事务的结果必须是将数据库从一种一致状态更改为另一种一致状态。

一致性与原子性密切相关;隔离:事务的执行不受其他事务的干扰;永久性:一旦提交了事务,它对数据库中数据的更改应该是永久性的。

事务隔离:读取未提交、读取已提交、可重复读取、可序列化。

未提交读:最低级别,无论如何不保证;提交读:可以避免脏读的发生;可重复读取:可避免脏读、不可重复读取的发生;串行化:避免脏读、不可重复的读和虚读的发生。

举例:未提交读:A更新了数据没有提交B可以看到;已提交读:A更新了数据没有提交B看不到,提交之后可以看到;可重复读:A插入一条数据,提交之后,B看不到,B事物结束之后,在查询可以看到;可串行化:A执行完之后B才可执行。

(所有的一切操作都是并行操作)

数据库中的锁:分为独占锁(即排它锁),共享锁和更新锁,细分又可分为表锁、行锁、页锁等。

你为什么需要锁?当并发事务同时访问资源时,可能会导致数据不一致,因此需要一种机制对数据访问进行排序,以确保数据库数据的一致性。

共享锁意味着对数据执行select操作,多个事务可以同时向对象添加共享锁。独占锁也称为写锁。独占锁表示对数据的insert、update或delete操作,如果事务向对象添加独占锁,则其他事务不能向其添加任何锁。

更新锁的初始化阶段用于锁定可能被修改的资源,这避免了共享锁导致的死锁。

4、口述下如何设计一个SOA框架

SOA的全称是面向服务的体系结构,一种面向服务的体系结构。它可以根据需要通过网络分布、组合和使用应用程序组件。服务层是SOA的基础,应用程序可以直接调用服务层,从而有效地控制系统的松散耦合。

简单地说,A函数被安排在A服务器中,B函数被安排在B服务器中,它们都为C打开了出站接口。

等访问,C不用知道A,B是如何实现的,只管用就可以了。

简单的例子Webservice、WCF、Web api等等。

SOA框架的文章,Web Service 和WCF的比较

5、SOA和微服务架构之间的主要区别是什么?

我的理解是SOA和微服务处于同一条线上。两者都是中立的、独立于语言的、跨平台的。微服务的目的是有效地分割应用程序、细粒度服务、重用组合,甚至每个操作(或方法)都是独立开发的服务,小到可以分割。SOA更适合于大型企业中的业务流程编排和应用程序集成。

6、了解各个framework的底层不?

C#源码文件 →→ C#编译器 →→ 程序集 →→ 本机语言

底层的库:CLR(Common Language Runtime)公共语言运行时,CTS(Common Type System)通用类型系统,CLS(Common Language Specfication)公共语言规范,CIL(Common Intermediate Language)公共中间语言,CLI(Common Language Infrastructure)公共语言基础结构

7、说说浏览器页面的渲染过程

DNS查询 →→ TCP链接 →→ HTTP请求 → 服务器响应 →→ 客户端渲染(HTML,CSS,JS)

8、说说中介模式的设计原理和应用场景

中介模式用于减少类类之间的耦合,因为如果类类之间存在依赖关系,则不利于函数的扩展和维护。只要修改了一个对象,就必须修改其他相关的对象。中介模式只需要关心与中介类的关系。将特定类与调度之间的关系提供给中介。房地产中介、QQ游戏平台、聊天室、QQ群、短信平台

9、请问如何构架一个高负载的系统?

分离应用程序服务和数据服务,使用缓存来提高网站的性能,使用应用程序服务器集群来提高网站的并发处理能力,数据库读写分离,使用反向代理和CDN加速网站回应,使用分布式文件系统和分布式数据库系统,使用NoSQL和搜索引擎将业务和构建分布式服务。

10、.NET系统如何实现水平扩展、如何解决高并发问题

水平扩展:利用Nginx建立分布式系统,增加服务器,增加CPU

解决高并发问题:增加缓存、禁止用户重复操作、建立请求队列


11、说说IIS的工作原理?

与IIS相反,它依赖于内置的HTTP。系统程序监听外部HTTP请求。如果请求是可访问的URL,则使用HTTP。SYS将把请求传递给IIS工作进程,并将信息保存到HttpWorkRequest。在隔离的应用程序域AppDomain中加载HttpRuntime,调用HttpRuntime的ProcessRequest方法,然后进行程序操作,最后返回数据流,并返回到HTTP。SYS, HTTP。SYS将数据返回给客户机浏览器。

12、手写一个千万并发的商品秒杀功能

Redis缓存秒杀的商品ID,

数量,一个请求数量减少,数量等于0时,直接返回失败,成功的数据保存到消息队列,然后保存到数据库中,尖的产品的数量是相对较小的,直接使用一个线程安全的列表是很好。

评论 (0人参与

最新评论

暂无评论
mrye


文章:233