外观
NET Core
跨平台、跨架构、支持命令行、灵活部署、开源
体积更小,启动速度更快,占用资源更少
- 管道是什么?
- app.use(): 有next可以交给下一个管道
- app.run():终端短路管道
对请求做处理 响应请求 。在任意位置插入新的逻辑 而不影响原有逻辑 AOP?
初始常见问题
- 静态资源跨域处理
- 注意UseStaticFiles()是否重复调用
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = (c) =>
{
c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
}
});
- 运行没有样式
- 拷贝wwwroot文件 ,startup中使用usestaticfiles
- 还原nuget `dotnet restore`静态文件
- libman 类似 nuget 的工具
- bundle 捆绑压缩前端的cssjs文件 需要nuget下载 并添加配置文件
发布
配置文件
- 引入配置文件包
Microsoft.Extensions.Hosting包含了所有的东东,什么Microsoft.Extensions.Configuration啊,Microsoft.Extensions.Configuration.FileExtensions啊,Microsoft.Extensions.Configuration.Json啊
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory()) // 读取配置文件的基础目录,绝对路径
//optional:文件不存在不会异常,reloadOnChange:文件改变后重载配置
.AddJsonFile("appsettings.json",path, optional: true, reloadOnChange: true)
.Build();
services.AddSingleton<IConfiguration>(configuration);
services.AddSqlSugar(configuration);
return this;
/// 配置扫描配置文件
private static IConfiguration BuildConfig()
{
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())//Microsoft.Extensions.Configuration.FileExtensions.
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);//Microsoft.Extensions.Configuration.FileExtensions.json
var configuration = configurationBuilder.Build();
var scanDirs = configuration.GetConfig<string[]>("ConfigurationScanDirectories");
if (scanDirs == null) throw new Exception("配置文件节点未找到");
foreach (string dir in scanDirs)
{
string dirPath = Path.Combine(Directory.GetCurrentDirectory(), dir);
if (Directory.Exists(dirPath))
{
var files = Directory.GetFiles(dirPath, "*.json");
foreach (var file in files) configurationBuilder.AddJsonFile(file, optional: true, reloadOnChange: true);
}
}
configuration = configurationBuilder.Build();
return configuration;
}IConfiguration
IConfiguration 本身是一个高层抽象接口,它不直接读取文件。真正执行底层 I/O 操作(如打开文件、读取字节流、解析内容)的是各个具体的
IConfigurationProvider实现类(例如JsonConfigurationProvider)。而ConfigurationRoot的作用是聚合多个 Provider 的结果,并提供统一的访问入口。
部署
部署类型
- 依赖框架部署(FDD)
包含自己的代码以及第三方依赖 包含dll文件
优点 不必预先定义应用运行的目标操作系统,生成的是可执行文件以及库是通用的,部署包很小
缺点 依赖目标系统的 .NET Core版本
- 独立部署(SCD)
部署到指定系统 包含.exe dll文件
优点 不依赖目标系统.NET Core版本 独立
缺点 续指定目标系统发布 包大
- 依赖框架的可执行文件(FDE)
IIS
需要发布之后生成的web.config文件才能在iis上运行
进程内:
配置文件里的hostingModel属性 改为inprocess 推荐进程内, 效率高于进程外
进程外:
hostingModel属性 改为outofprocess iis就只做转发,转发到kestrel
dotnet KnowLedge.dll --urls="http://*:8848" --ip="127.0.0.1" --port=8848
- kestrel
kestrel 速度快但是功能弱 一般采用kestrel结合nginx或者iis
- Docker
- 有linux、windows容器
在项目中添加docker的支持 docker配置文件
# 基础阶段
# 构建阶段
# 发布阶段
# 最终截断构建镜像
docker images # 查看镜像
docker run --name=adsfa -p 5000:80 -d 镜像名称生命周期
- AddTransient: 瞬时生命周期 每次从服务实例里请求时,都创建一个新的对象
- AddSingleton:单例 每次使用同一个单实例 全程唯一 。适用于配置文件、连接池
- AddScoped:作用域 同一个线程(请求)里 只实例一次 容器单例
AOP
Filter
一般控制MVC流程内的事 关于aciton controller中的事 具体的某个请求
IActionFilter
IResourceFilter:资源管理过滤器
- 一般用作缓存 因为他发生在控制器实例化之前,这个时候缓存更加节约资源 不用过多请求
IResultFilter
中间件
在中间件中实现的 比如反扒,防盗链 还没到业务层面
AutoFac
针对action 之类的业务类型做扩展
Casstle
- 用于扩展AOP(类(需要virtual标记)、接口(所有方法)) 原理适配器的代理模式
- nuget castle.Core
- 三个对象
- proxyGenerator--Castle提供的动态代理对象
- 注入对象 需要实现StandardInterceptor
- 原始对象
- 可以用特性注入 更加灵活
- 用于扩展AOP(类(需要virtual标记)、接口(所有方法)) 原理适配器的代理模式
缓存
ResponseCache:前端缓存
属性
- Duration:缓存时间
缓存问题解决
- 缓存穿透:利用不存在的数据 进行查询 穿透缓存 解决:可以把null存下来或者根据业务来指定规则
- 缓存击穿:在某个值过期时 大量数据涌入造成,解决:更新缓存,不过期 重写回收方法
- 缓存雪崩:大量key同时过期,数据库压力增大,解决:均衡分配数据,随机过期时间,不过期 只更新
IOC
- IOC与依赖注入的区别
- IOC是一种设计模式,依赖注入是实现IOC的方式。依赖注入是实现抽象一个对象依赖的对象还需要注入
- 在.NET Core的依赖注入中,通常情况下,如果一个类的构造函数中注入了容器中已注册的服务,那么这个类本身也会成为容器管理的服务,即它也可以被注入到其他类中。
GRPC
简单RPC: 跟普通API相同 一问一答式
服务端流式:一次请求多次返回,没有并发限制
客户端流式:多次请求一次返回
GRPC 和 WCF的区别
- wcf 一次请求一次应答,数据包返回 适合做即时通讯。冗余 性能差 IIS MQ TCP
- grpc: tcp 高性能 跨语言
- webapi:http1.1 跨语言 调用麻烦 压缩率低
Castle
autofac 基于castle实现的
需要三个对象(动态代理对象、注入对象、原始对象)
注入类型
类型注入(CreateClassProxy(),只对virtual方法生效)
- 原始对象需要aop的方法必须是虚方法
- 因为普通方法在类实例化时已经确定了生成,虚方法可以在生成时去重写 覆盖他 所以方便做到aop
接口注入(CreateInterfaceProxyWithTarget(),全部方法都会生效)
- 可以使用特性扩展,指定不同特性 调用不同的方法
