美文网首页.NETMicroservice微服务
.netcore/.net6/.net7面试题汇总

.netcore/.net6/.net7面试题汇总

作者: Seven奇 | 来源:发表于2020-12-01 10:17 被阅读0次

    嗨,你好,陌生人,你的头发掉光了么ლ(′◉❥◉`ლ),哈,我的还在,气人不。已经好久没有更新此文章了,最近很荣幸在公司给大家做了.net7开发实战培训,一共8节,已经顺利结课,非常感谢各位同事的支持。培训之后忽然想到这篇文章还没有补全,然后又到了一年一度金三银四的季节,所以接下来要完善一下此文章,希望可以帮助到大家(有些问题还没补全答案,如果没有大家先思考一下怎么回答,如果你有更好的问题或者答案,欢迎在下方评论)。

    目前楼主在备考高项(已获取PMP,ACP证书),要是你也在考,我们可以一起交流学习。

    先说一下我培训课程的目录:net7入门,依赖注入,中间件,Orm,DDD,Identity,docker,微服务入门。下面的问题也会在我的PPT中找到。

    【腾讯文档】.net7培训课程
    https://docs.qq.com/pdf/DYnF4QllwYnlsZ3da?

    【项目】git地址:
    https://gitee.com/seven-lu/IntelliRay.git

    net7面试题

    1、.netcore框架为什么可以跨平台?

    采用了kestrel跨平台WEB服务器。

    2、net7的启动过程是core框架的核心,请简要说明net7的启动过程。

    CreateHostBuilder(args).Build().Run()
    先创建webApplicationbuilder配置类,配置之后生成webApplication对象。
    1、创建了HostBuilder
    2、为hostbuilder添加 aspnet core运行时的配置
    3、启用各类web 运行时需要的配置
    4、根据加载好的各种配置构建主机运行时需要提供的服务(configuration, DI Container, 应用程序配置等)

    3、如何获取appsetting配置文件中的数据?

    1、Iconfiguration
    2、使用强类型对象承载配置数据 IOptions IOptionsSnapshot IOptionsSnapshot

    4、请说明你对restfulapi风格的理解。

    REST是一种风格,而不是一种约束或规则,过于理想的RESTful API 会付出太多的成本,无论那种风格的API都是为了方便团队开发、协商以及管理,不能墨守成规

    5、什么是依赖注入?

    依赖注入是ASP.Net Core的核心,依赖注入我们可以分开来理解
    依赖:当一个类需要另一个类协作来完成工作的时候就产生了依赖
    注入:把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入。

    举个例子理解控制反转:
    假设我们有这么一个场景,一个四、五岁的小朋友,想要吃东西。如果他自己从冰箱里找东西吃,可能会造成一些不好的结果,比如可能会拿到无法直接直接食用的食物,或者忘记关冰箱门等灯。你可以思考一下,一个四、五岁的小孩儿,自己去冰箱拿食物,甚至自己去加工食材,你是不是觉得这不太正常?那么正常情况是什么样的呢?作为一个四、五岁的小孩儿,只需要找父母陈述一下需求,比如"我饿了、我想吃XX",这个时候,父母就会做好他所需要的食物,然后拿给他。从主动去冰箱拿(正转)食物,到你想要吃的食物而被动获得(反转),这其实就是一个对象调用权转移的过程。前者是主动获取食物,后者是由父母,也就是第三方把食物给他,而他并不关心食物从哪来,以及怎么得来。
    在前面的场景中,一个四、五岁的小孩,想要吃东西。他只需要陈述一下需求,父母就会做好他需要的食物(依赖),然后拿给他(注入)。
    依赖注入不是目的,它只是实现控制反转的方式。使用依赖注入的目的,是为了管理应用中复杂的依赖关系,它可以帮助我们开发出松散耦合、可维护、可测试的代码和程序。
    在小孩子吃东西的场景里,有一方扮演着 IoC 容器的角色,你们分析下是谁?我想很多人的第一直觉是“父母”?其实,不严谨的来说,冰箱才是扮演 IoC 容器的角色,父母则是扮演依赖注入中控制系统的角色。IoC 容器是依赖注入中一个保存已创建实例的东西,如果实例已创建,并且具有有效的生命周期,那么控制系统会直接从 IoC 容器获取实例,否则才会创建实例。冰箱中的东西,都是父母买回来放进去的,同样也需要他们从冰箱中拿出来。
    所谓依赖注入系统,本质上就是一个实现了类型注册、实例解析和实例生命周期管理的组件

    6、依赖注入的生命周期有哪些,请详细说明含义。

    Transient 瞬时,每个请求都会创建一个实例,同一个请求,使用多次server,用的不同实例。(轻量级无状态服务尽量用Transient)
    Scoped 作用域,在同一个Scope内只初始化一个实例,同一个请求,使用多次server,就用的同一个实例。(日常用Scope)
    Singleton:单例,整个应用程序生命周期内只创建一个实例

    7、依赖注入的方式都有什么?

    方法特性注入
    构造函数注入
    属性注入(https://www.cnblogs.com/loogn/p/10566510.html

    8、什么是中间件,谈谈你对中间件的理解

    1、中间件是组装到应用程序管道中以处理请求和响应的软件。
    2、每个组件选择是否将请求传递给管道中的下一个组件。
    3、每个组件可以在调用管道中的下一个组件之前和之后执行工作。
    4、请求委托(Request delegates)用于构建请求管道,处理每个HTTP请求。

    9、中间中有map,use和run三种方式,说明每种方式的功能。

    Map:扩展用作约定来创建管道分支, Map*创建请求管道分支是基于给定请求路径的匹配项。 对特定的路径指定中间件,一旦进入管道分支则不再回到主管道
    MapWhen:做特殊判断
    Use:中间件负责调用管道中的下一个中间件,也可使管道短路(即不调用 next 请求委托)
    Run:是一种约定,一些中间件组件可能会公开在管道末端运行的Run[Middleware]方法

    10、什么是认证,什么是授权?

    验证就是鉴定应用程序访问者身份的过程
    授权是决定验证通过的用户应该拥有何种级别的访问安全资源的权限

    11、请列出Outh2.0四种授权模式

    客户端模式(client_credentials)
    密码模式(password)
    授权码模式(authorization_code)
    简化模式(implicit)

    12、EFCore 怎么做性能优化

    EF SQL监控 ,优化效率
    使用AsNoTracking(),无跟踪查询技术
    EF预热
    对于复杂的可以使用sqlquery 用sql语句查询

    扩展问题

    1、说一下常用的状态码,并分别说出他们的含义。

    200:正常
    204:无内容
    400:Bad Request 错误请求
    401:认证失败
    403:未授权
    404:未找到
    405:方法不允许
    415:媒体格式不支持
    500:服务器错误
    502:网关错误

    2、如何理解敏捷开发。

    开放问答:
    planMeeting,reviewMeeting
    简单,以用户为中心,拥抱变化

    3、谈谈你理解的软件开发流程。

    开放问答:
    定义需求,计划,执行,监控,测试

    架构层面,设计思想

    1、谈一谈你对DDD思想的理解。

    DDD,领域驱动设计。就是通过领域来指导软件设计,是一种十分抽象的软件设计思想,它主要分为战略设计和战术设计
    战略方面,通过事件风暴进行领域模型的划分,划分出核心域,子域,支撑域,定义通用语言,划分出界限上下文。
    在战术设计方面,ddd将架构分层,“松耦合,高内聚”是架构设计的整体思想。按照DDD思想,可以分为领域层,基础设施层,应用层,接口层。
    接口层为前端用户提供api接口。基础设施层可以放一些第三方的服务,数据库连接等内容。应用层是对领域服务的编排,是很薄的一层(目前我自己的架构,应用的是cqrs,所有的相关逻辑都是放在了应用层,而领域层只是放了实体,因为暂时还不是特别理解领域层的服务和事件都应该写什么)。领域层包括实体,值对象,聚合根,领域服务,领域事件等内容

    2、DDD有四种领域模型,都有什么,在战术层面是怎么实现的?

    1、失血模型
    失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成
    2、贫血模型
    简单来说,就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。
    3、充血模型
    充血模型和第二种模型差不多,所不同的就是如何划分业务逻辑,即认为,绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而Service层应该是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。
    4、胀血模型
    基于充血模型的第三个缺点,干脆取消Service层,只剩下domain object和DAO两层,在domain object的domain logic上面封装事务。

    3、DDD四层架构是什么?

    接口层,应用层,领域层,基础设施层

    4、谈谈你对CQRS架构的理解,在net7中通过什么方式实现?

    Command Query Responsibility Seperation(命令查询职责分离)为了解耦
    MeditR有两种分派消息的方式: -请求/响应消息,适用于CQRS,消息分发给单个处理程序 - 通知消息,发布/订阅模式 ,消费分发给多个处理程序

    微服务

    1、什么是微服务架构,什么时候使用微服务架构?.

    服务架构使我们能够更频繁,更独立地部署应用程序,并可靠地满足现代软件应用程序开发要求。
    微服务架构几乎解决了单体架构的所有缺点。微服务提供了故障隔离,满足应用更小,更快的部署,具备应用的可伸缩性,使得不同服务可以采用不同的开发技术,提高了开发效率,满足了以业务为中心的需求。

    2、微服务架构的需要注意的问题有哪些?

    数据一致性
    微服务间通讯
    监控
    多点故障
    网络可靠性,延迟,带宽和网络安全性

    数据库

    1、mysql的数据引擎有哪些

    myisam
    innodb

    2、数据库事务

    数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成

    3、什么是sql注入?

    利用sql语言漏洞获得合法身份登陆系统

    4、如何做数据库优化?

    设计:存储引擎,字段类型,范式与逆范式
    功能:索引,缓存,分区分表。
    架构:主从复制,读写分离,负载均衡。
    详解:https://www.cnblogs.com/sharpest/p/10390035.html

    docker

    1、列出docker常用命令

    docker images  //查看所有镜像文件
    docker ps  //查看运行中的容器
    docker ps -a //查看所有容器
    docker exec -it xx /bin/bash //进入容器内部
    docker logs -f xx //查看容器日志
    docker run //启动容器
    docker login //登录镜像仓库
    docker pull //拉取镜像
    docker push //推送镜像
    docker save -o //将指定镜像保存成 tar 归档文件
    docker load -i //导入使用 [docker save] 命令导出的镜像
    docker cp   //用于容器与主机之间的数据拷贝
    docker history  //查看指定镜像的创建历史。
    docker build //用于使用 Dockerfile 创建镜像。
    docker tag // 标记本地镜像,将其归入某一仓库。
    

    2、docker部署的方案有哪些,如何将打包的镜像在另一台机器上运行?

    上传至镜像仓库
    打包镜像到本地,docker save
    加载镜像 docker load

    Redis

    1、说一说redis数据类型以及使用场景

    string 字符串(可以为整形、浮点型和字符串,统称为元素)
    list 列表(实现队列,元素不唯一,先入先出原则)
    set 集合(各不相同的元素)
    hash hash散列值(hash的key必须是唯一的,hash 特别适合用于存储对象)
    sort set 有序集合

    2、什么是缓存雪崩,缓存击穿?

    缓存雪崩:在请求redis的时候,key大面积失效,导致大量请求到数据库
    缓存击穿:在请求数据的时候,key值不存在或者失效,导致请求直接穿透到数据库进行请求

    3.redis持久化方式以及优缺点

    RDB:
    RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式.
    1、RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
    2、生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
    3、RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
    劣势
    RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。

    AOF:
    redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。
    优势:
    1、AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。
    2、AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。
    3、AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。
    4、AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据
    劣势:
    1、对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大
    2、AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
    3、以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。

    c#基础

    1、什么是aop?

    面向切面编程-通过预编译方式和动态代理实现程序功能的统一维护的一种技术。降低业务逻辑部分的耦合度,提高程序的可重用性,提高开发效率。
    比较常见的场景是:日志记录,错误捕获、性能监控等

    2、什么是托管和非托管?

    托管代码:是由公共语言运行库(CLR)执行的代码,而不是由操作系统直接执行。有关内存管理(内存申请,内存释放,垃圾回收之类的)全部都是.net的CLR来管理

    非托管代码:直接编译成目标计算机码,由操作系统直接执行的代码,内存回收要继承IDisposable接口手动回收

    3、string和stringbuilder的区别

    string 每次内容发生变化,都会生成一个新对象,重新分配内存
    stringbuilder 每次操作都是对自身进行操作,而不是生成新的对象

    4、ref和out的区别

    ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;

    out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

    5、重载与重写

    overload重载:同一个类下,相同的函数名,不同参数列表
    override重写:是对父类的方法进行重写;基类函数用virtual修饰,派生类用override修饰
    注:不能重写非虚方法或静态方法

    6、一个类可以继承几个父类,几个接口?

    在创建一个类的时候只能继承一个父类 但可以实现多个接口

    7、委托和事件,委托中action和func的区别用法

    委托是面向对象的、类型安全的,是引用类型。使用delegate关键字进行定义
    详解:https://www.cnblogs.com/wangjiming/p/8300103.html

    8、常用修饰符

    public: 同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
    private: 只有同一类或结构中的代码可以访问该类型或成员。
    protected: 只有同一类或结构或者此类的派生类中的代码才可以访问该类型或成员。
    internal: 同一程序集中的任何代码都可以访问该类型或成员,但别的代码不可以。

    9、C#中,string str = null 与 string str =""的区别

    String str=null没有分配内存,String str=""分配了内存

    10、是否可以继承String类

    String类是一个最终类,被final修饰,所以不能被继承

    11、String s = new String("xyz");创建了几个String Object?

    两个对象,一个是“xyx”,一个是指向“xyx”的引用对像s。

    12、堆和栈

    引用类型存在堆上,值类型存在栈上

    13、什么是GC。Idispose的用法

    GC,垃圾回收器,用于自动回收托管堆中无效对象的内存,释放内存空间。
    程序在运行过程中 ,有很多对象分配内存空间后,使用一次就不再使用了,这不仅占用内存空间,导致内存溢出,还可能影响程序的性能。所以我们自动释放内存
    原理可参考:https://my.oschina.net/u/4354590/blog/4321333

    14、抽象类abstract class与接口interface的异同

    同:都不能被实例化。都可以被继承。都可以包含方法声明。派生类必须实现抽象类(接口)中未实现的方法。

    异:接口可以被多重实现,抽象类只能被单一继承。

    15、using关键字的使用场景

    作为指令:用于导入其他命名空间中定义的类型或为命名空间创建别名
    作为语句:用于定义一个范围,在此范围的末尾将释放对象

    16、task异步用法,它和thread有什么区别?

    1.什么是thread
    当我们提及多线程的时候会想到thread和threadpool,这都是异步操作,threadpool其实就是thread的集合,具有很多优势,不过在任务多的时候全局队列会存在竞争而消耗资源。thread默认为前台线程,主程序必须等线程跑完才会关闭,而threadpool相反。
    总结:threadpool确实比thread性能优,但是两者都没有很好的api区控制,如果线程执行无响应就只能等待结束,从而诞生了task任务。
    2.什么是task
    task简单地看就是任务,那和thread有什么区别呢?Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。

    17、异步方调用同步方法和同步方法调用异步方法性能上有什么区别?
    18、静态类在程序的生命周期,何时初始化,静态类的静态方法和类的静态方法啥区别

    1.全局唯一,任何一次的修改都是全局性的影响
    2.只加载一次,优先于非静态
    3.使用方式上不依赖于实例对象。此外,静态类不可以实例化。
    4.生命周期属于类级别,从开始访问类时到程序运行结束时。
    5.只包含静态成员
    6.不能包含实例构造函数。

    其他大佬整理的,希望可以帮助到你

    https://www.yuque.com/ysgstudyhard/da6e0c/wlcivg
    https://zhuanlan.zhihu.com/p/526163635

    相关文章

      网友评论

        本文标题:.netcore/.net6/.net7面试题汇总

        本文链接:https://www.haomeiwen.com/subject/bvlywktx.html