#
IOC:
1.解耦
2.屏蔽细节。
DI依赖注入,是实现IOC的手段。
DI:构造对象,能自动把依赖的对象生成并传入,支持递归无限级的。
IOC是目标,DI是手段。
net core生命周期:
AddTransient //瞬时生命周期
AddSingleton //单例:全程唯一实例
AddScoped //作用域单例,一个请求一个实例
单例:没有线程单例,不建议太多单例,多个线程对单例操作,线程不安全。
适合单例:配置文件、容器实例、连接池、线程池
Scope:一次Http请求就是一个实例,一次请求创建一个容器实例
瞬时:大部分场景使用瞬时生命周期
不要再长生命周期的对象中引用比他短的生命周期对象
切面编程AOP:Aspect Oriented Programming
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种方式
- 中间件
- 过滤器
- 拦截器
什么时候使用AOP:不是业务逻辑的逻辑。
相比OOP:OOP不能为分散的对象引入公共行为。
切面编程应用场景:日志、事务、缓存、异常处理、性能优化
AOP异常
三种方法:1.直接用特性 2.用内置的ServiceFilter 3.全局注册AddControllersWithViews
AOP的使用
- 使用Autofac:引用动态代理、设计拦截器、注入拦截器、拦截器服务的列表分配给注册(引入Autofac.Extensions.DependencyInjection:依赖注入;引入Autofac.Extras.DynamicProxy:动态代理)
- 自定义动态代理
中间件、过滤器、AOP拦截器区别与联系
名称 | 级别 | 拦截 | 拦截机制 | 根本区别 |
---|---|---|---|---|
中间件 | Http | 管道 | ||
过滤器 | Http | url,Controller里的action | 只是一个前置条件判断,只能过滤请求,并不能对url中的service调用产生影响 | |
拦截器 | 对象的元数据(类、方法名、参数等) | 反射 | 可以穿插在方法调用前、return、异常、甚至是对象的实例化,利用代理来实现 |
DTO:数据传输对象
AutoMapper映射,安装依赖包
- AutoMapper
- AutoMapper.Extensions.Microsoft.DependencyInjection
AutoMapper使用:属性需要完全一致
WebApi
get | put | post | delete |
---|---|---|---|
数据获取 | 数据的插入 | 数据更新 | 数据删除 |
##浏览器向服务器请求的数据有: |
1. QueryString字符串
2. Form
3. Cookie
4. Session
5. Header
EF core
用swagger时,必须有访问方式
EntityFrameworkCore安装包:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Pomelo.EntityFrameworkCore.MySql
DbFirst
设为启动项目->程序包管理控制台->默认项目->输入(MySql): Scaffold-DbContext -Force -OutputDir Entity -ContextDir Context -Context CimdbContext "server=127.0.0.1;user id=root;database=cimdb;password=itc123!@#" -Provider "Pomelo.EntityFrameworkCore.MySql"
命令参数 | 作用 |
---|---|
OutputDir | 实体文件所存放的文件目录 |
ContextDir | DbContext文件存放的目录 |
Context | DbContext文件名 |
Schemas | 需要生成实体数据的数据表所在模式 |
Tables | 需要生成实体数据的数据表的集合 |
UseDatabaseNames | 直接使用数据库中的表名和列名(某些版本不支持) |
Force | 强制执行,重写已经存在的实体文件 |
Code First
/ | / |
---|---|
[AllowAnonymous] | 跳过授权校验 |
微服务架构
SOA:总线,中介者模式
微服务:门面模式
进程间通信
/ | / |
---|---|
1.共享存储 | Redis,DB,Queue,硬盘文件 |
2.服务通信 | WebService,WCF,WebApi,ashx/aspx |
3.RPC | .Net平台独有 |
鉴权授权
- 第一步:在app.UseRouting()之后、app.UseEndpoints之前增加鉴权授权;
鉴权 | 检测用户是否登录 |
授权 | 检测有没有权限,是否能访问后续的页面功能 |
-
第二步:在ConfigureServices中增加
-
第三步:指定哪些Action需要做鉴权授权[Authorize]
鉴权授权 identity server4与.net core融合比较好
User (登录请求)-> Authorization
<- 返回token
Gateway识别并解析token
即由identity server4发放token带到httpcontext中,由Gatewa识别解析token
角色授权
不同的用户不同角色,做不同拦截。
Token校验
User <—> app.UseAuthorization(返回Token)
User <—> Api(带着Token访问)
User <—> Third Party(带着Token访问,第三方Api)Token的有效性,通过加密解密完成
identity server 4
- openid 去中心化的框架
- OAuth
- ODIC
- Ids4
集群
服务实例必须集群/负载均衡:多台服务器做相同的事,共同承载压力(高可用,可伸缩)(比如应对服务器挂了)
Nginx:单纯是负载均衡,不够用
1.增加/减少服务实例,动态增减,要重启Nginx,服务注册与发现不智能
2.健康检查(微服务实例代码小于2000行),如遇到网络断网,即时发现问题,下线
分布式
一个进程做的事,分成多个进程协作完成
集群与分布式区别
集群:多台服务器做相同的事,属于均摊关系
分布式:一个进程做的事,分成多个进程协作完成。一个事情分成多个步骤,协作完成(狭义理解:串行)
Consul
服务启动时注册-Consul-调用者调用
|Health check|
网关Gateway
作用:更换ip、端口、更新程序时
1.提供统一服务入口
2.聚合后台服务,节省流量,提升性能
3.提供安全,过滤,流控等API管理功能,实现对外部请求的协议转换、参数校验、鉴权、切量、熔断、限流、监控、风控等通用服务
服务治理:
缓存:共享缓存
熔断:服务挂了,请求还不断,即时通知。单位时间内异常多少次,网关返回失败
限流:单位时间内流量只允许多少次,多了排队
降级:特殊情况,可以降低服务等级,甚至关闭
分布式事务
CAP,分布式锁
任何分布式系统只可同时满足C一致性、A可用性、P分区容错性中的两点,没法三者兼顾。满足可用性、最终一致性。实现最终一致性三种模式:
1.可靠事件模式 2.业务补偿模式 3.TCC模式
启动微服务命令
dotnet BBSWeb.dll --urls=“http://*:5002” --ip=“127.0.0.1”–port=5002
集群和服务注册发现
string url = “http://localhost:5000/aip/user/all”
string content = InvokeApi(url);
public static string InvokeApi(string url)
{
using (HttpClient httpClient = new HttpClient())
{
HttpRequestMessage message = new HttpRequestMessage();
message.Method = HttpMethod.Get;
message.RequestUri = new Uri(url);
var result = httpClient.SendAsync(message).Result;
string content = result.Content.ReadAsStringAsync().Result;
return content;
}
}
组件统计
- docker:容器化
- Jenkins:CI/DI;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。(提交代码后,构建测试、发布)
- Nacos/Consul:服务发现
- Ocelot:网关处理
- Nginx:负载均衡
- Identity Server 4:认证中心
- K8S:容器编排;把容器当资源,说明书,管理docker进程、资源、docker的关系。docker是宿舍,K8S是宿舍阿姨
- Polly:瞬态故障处理;一种.NET弹性和瞬态故障处理库,允许以非常顺畅和线程安全的方式来执行重试、短路、超时、故障恢复等策略
- Exceptionless:开源的日志收集和分析框架,能为应用程序提供实时错误、特性和日志报告
- Apollo:统一配置中心;配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。(集中的配置中心,不同集群不同环境可以配置推送)
Skywalking Skyapm:分布式追踪和APM的server端,它将包含Collector,Storage,独立的WebUI,并使用OpenTracing规范来设计追踪数据(分配一个Guid,统计在各个环节流程的信息)