了解.NET架构师知识
发表于 2019-07-27 12:50
俗话说,不想当将军的士兵不是好士兵。不想成为架构师的程序员。他们不是试图改进的程序员。
有人说架构师是一群秃顶的人,程序员是一群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人参与)
最新评论