- 博客(95)
- 收藏
- 关注
原创 【橙子老哥】C# CAP源码原理剖析深入解读
CAP,当然这个cap是NCC下的一个开源工具包,用于解决分布式下事务最终一致性问题跟一样,被ncc收编,所以代码质量还是杠杠的,推荐大家阅读学习有人疑惑了,这个之前不是讲过一遍吗?【橙子老哥】C# 实操分布式事务解决方案其实分布式事务解决方案内容非常多,每个场景都有不同的方案,不是几篇文章就能讲完的,之前那篇讲了经典的3类tcc2pc3pc同步执行(适合实时性要求不高,并发不高,不引入任何中间件)基于数据库的分布式事务(适合实时性要求高,并发要求高,资源足,只依赖数据库)
2025-02-18 18:23:58
564
原创 【橙子老哥】C# 硬核ShardingCore执行流程源码解读
我们把前面的过程理一理,说简单一点,它通过预编译结果表达式解析,组装了预解析结果,然后通过一层一层一层一层的套娃,层层将各种情况进行解析,最后!上面,根据表达式解析的方法结果,直接找到对应的处理引擎,这里我们挑一个,max为例子,不过先不着急,因为到了这里,我们都没有到shardingcode的核心逻辑。
2024-12-18 22:38:06
305
原创 【橙子老哥】.NetCore 震惊!Configure选项在Build之前获取
这里有关键的几点对象访问器是为了方便使用依赖注入的单实例访问PreConfigureActionList是为了将多个委托包装成一个单实例对象PreConfigure就是将他们组合起来,方便使用还有最关键的一点,允许这样玩的前提,是各个模块之间有明确的加载顺序看到这里,恭喜你,学习到了Abp.VNext注入原理,在多模块中,也算是一种很有实际意义的奇淫技巧讲本期的原因,是最近很多人刚好问到我abp对象访问器到底有啥用,干脆扩展全面讲解一遍,如果你还有想研究的东西,可以加入我们一起学习哦~
2024-12-05 15:19:04
754
原创 【橙子老哥】C# RabbitMQ-RPC/发布确认/延迟队列(二)
我们在上一期,实操了前5个模式,因为篇幅有限,以及前5种模式用的比较多,还剩下RPC和发布者确认留在下一期讲简单模式(Simple)工作队列模式(Work Queue)发布订阅模式(Publish/Subscribe)路由模式(Routing)通配符模式(Topics)RPC模式(RPC)发布确认模式(Publish Confirms)废话少说,直接来吧!
2024-11-23 20:49:49
798
原创 【橙子老哥】C# 实操RabbitMQ七大模式(一)
作为高并发组件,消息队列我们肯定离开不了,里面很多简单的概念(消费者、生产者等)网上资料都讲烂了,这里就不在赘述了,我们长话短说接入消息队列,用的比较多的场景流量削峰异步操作应用解耦消息通讯在数据结构中,就有队列的概念,我们可以使用这个结构去实现很多种类型的功能,比如:消息订阅、队列竞争消费、消息持久重试等,这类功能都可以抽象出来,部署成一个单独的成熟组件今天我们挑一个最经典的消息队列来-RabbitMQ消息队列讲一讲,并用c#代码去实现各各模式简单模式(Simple)
2024-11-16 17:00:01
1514
原创 【橙子老哥】C# 模拟Mysql索引查询底层原理
我们通过链表存储,遍历查询确实是快,插入也快,但是不适合搜索查询,比如我想查询年龄等于10的人,还是需要从链表的一个开始遍历,我们数据库肯定不能每次都要全表扫描。查询数据,也是这个道理,我们的数据保存在硬盘中,通过什么操作,能让更快的查询到想要的数据呢?这里就要用到数据结构。例如,一本书,想要找到一个内容,从第一面开始翻,耗时耗力,但是我们给它加一个目录,这查起来,快了不是一个级别。,这下,我们像遍历数据,又可以直接走链表的查询,我们想插入数据,又可以走B树的分裂和合并操作。
2024-11-08 16:56:29
826
原创 【橙子老哥】C# 逆天!AddNewtonsoftJson使用惊人问题
中,并且是一个用起来非常广泛的包,说这个有问题,我自己都有点不相信,不过经过大量社区人员验证,都出现了这个问题。5:于是我们认为,这个可能是abp.vNext的问题,我们做了极简的abp示例,但是发现并没有这个问题。虽然得出看结论很简单,但是这个发现过程,非常的漫长,我们几乎用了不间断的9个小时,才真正定位到问题。4:之后,我们想到应该是事务问题,他的事务是在请求结束后提交的,我们打上断点,看看是不是没有执行。好的,到了这里,我们开始漫长的枚举,将代码模块,一个一个放在示例,看看是否能够还原。
2024-10-28 14:43:52
924
原创 【橙子老哥】C# 实操分布式事务解决方案
如果我们分布式的2个服务,库存其实早就已经没有了,每次都去预执行事务,最后又不提交回滚,对订单服务会有一个连带效应,它也要每次去预执行事务,特别是微服务中,拆的非常细,很浪费资源。,用户创建订单,订单数+1,库存数量-1,像这种场景,我们必须要确保数据的一致性,如果出现了订单加的多了,库存减的少了,那不就产生了超卖的严重生产事故?相比于2pc,它多了一个步骤,先把各各服务询问一下,准备好了没有,这里只是做一个基础的校验,如果库存都没有,那后面事务也不需要去提交再回滚的操作。
2024-10-23 22:52:52
929
原创 【橙子老哥】C# 实操高并发分布式缓存解决方案
答:先更新数据库,后删除缓存,也有可能会存在问题,A去读取缓存,发现没有把数据库的值读取到了,准备去写给缓存,B把数据库更新,同时还删了缓存,A更改数据库,问题很难复现,因为在B更新数据的之前,A要去读取完数据库,同时还没有写到缓存的时候,(这步难)B要去执行删除缓存,A在覆盖缓存。当然,如果是方案3,也可以玩出花,由于是先删除缓存,再更新数据库,我们再最后一步,和上面一样再来个删除,确保最后一步一定是删除缓存,也能保证缓存的一致性,由于这里被删了两次,也叫做-延迟的时间内,是不是都是不一致的情况?
2024-10-17 21:15:43
1052
原创 【橙子老哥】.NetCore IOC依赖注入源码剖析(二)
依赖注入的本质,递归构造函数参数+构造函数反射实例化本篇难度较高,如果你能看到这,恭喜你,看到了这里。我们回到前一节的开头,现在,你还敢说IOC简单吗?
2024-10-13 12:40:47
881
原创 【橙子老哥】.NetCore IOC依赖注入源码剖析(一)
至此,我们只是走完了最外一层,这些大致流程的是清楚的,只是留下很多核心对象没有进行深入,但是也不会太妨碍我们阅读,这其实也是精妙之处,微软将构建引擎、CallSite等对象抽象出来,不着急,关注橙子老哥,一步一步带你深入。(我其实不太喜欢将文章拆分很多个,奈何微软的IOC相对于其他组件来说,难度确实高了很多,所以篇幅有限,也为了让大家更好理解,特意将后续内容拆分多个章节)为什么要使用IOC,IOC的生命周期,IOC的好处。这些留给大家仔细思考吧~这里也是扩展方法,一层包一层的,最终,走到以下内容。
2024-10-10 22:59:07
934
原创 【橙子老哥】.NetCore IConfiguration配置源码剖析解读
.Net意社区,高频发布原创有深度的.net相关知识内容,与你一起学习,一起进步。
2024-10-07 16:31:00
901
原创 【橙子老哥】.NetCore 管道模型源码深度解读
同时,每一个管道,又可以叫做中间件,对请求做了一个aop的操作,不就是中间件做的事情吗?微软考虑了这一点,也是用心了。最近遇到很多小伙伴们问我,自己会.netframework想学.netcore,到底难不难,思考一下,其实基本大同小异,区别比较大的,主要是.netcore的管道模型。这里刚好和我们的管道模型执行流程对应上了,我们给管道模型新增中间件的时候,并不会执行,而只有到有请求进来的时候,才会执行这个委托。不过,到这里,我们的中间件并不会执行,这里很巧妙,由于我们传入的是。
2024-10-06 11:24:25
1075
原创 【橙子老哥】c# 探究属性与字段本质
这里的get、set,本质上就是一个方法的语法糖,会编译成对应的get方法和set方法,如果熟悉java的人,对这个印象肯定深刻。看到这里,其实答案也就写在脸上了,c# 中的属性,本质上是使用get、set方法,包了一层私有字段。另外,属性本质是给一个私有字段包一层,那我们理论上不是可以直接操作字段?属性是什么,字段是什么,这里不在这篇文章赘述了,我来直接探究下它的原理。,来点关于属性与字段有趣的骚操作,废话少说,我们直接开始。这个操作也很简单,需要注意的是,在条件中,需要指明。我们可以给私有属性赋值吗?
2024-10-02 16:03:01
495
原创 【橙子老哥】.NetCore ILogger日志源码剖析解读
方法,真相大白了,我们通过ILoggerProvider的AddProvider方法,将自己的日志组件添加到了List _providerRegistrations 这个结合里面,然后打印日志的时候,会通过泛型的名称找到每一个日志提供者并缓存,通过日志提供者去找到它对应的logger去打印消息。很好,走到AddLogging这里,基本形成了一个闭环,他的注册是Singleton单例的,所以值一直不会丢失,就这个道理,其实这个也是一个很常见的操作。首先,你需要创建一个自定义日志记录器类。
2024-09-30 12:01:09
710
原创 【橙子老哥】c# AsyncLocal底层原理
众所皆知,AsyncLocal是用于异步方法之间的数据隔离,而 ThreadLocal是用于多线程之间的数据隔离,需要明白,多线程!当我们切换线程的时候,就会将上下文进行传递出去,最终交给操作系统,当我们切换回来的时候,又会执行回调,将原先的copy的数据进行恢复。我们先抛砖引玉,有这么一种情况,当我们的泛型是一个对象,并在子异步方法里面进行赋值,并不会影响到外层的数据。关于他们的区别,相信大家看过很多的文章了,我总结放两个例子,不多赘述,带过即可。如果,我们不更改它的引用,不就可以实现传递了吗?
2024-09-29 14:28:18
1080
原创 【橙子老哥】c# await关键字底层原理
3:第二次进入的时候,又会走else里的内容,因为状态为0继续改成-1,回到起点,直到等到下次状态机机再判断到完成为止。相信大家对await用法肯定很清楚了,这篇文章主要介绍他的原理,因为要看底层,就要看他的il代码了。所以这一块的代码是固定的,目的是为了生成一个状态机,我们看看状态机<$>d__0,这个里面做什么的。一样的,我们去掉多余代码,并修改命名,try catch也去掉,假设它一定成功。这里来看,其实道理是一样的,每当一个await完成之后,状态就改为下一步的状态。首先,我们先看第一种情况。
2024-09-27 15:32:03
507
原创 【23种GOF设计模式】C#代码完整案例详解--原型模式
来自:CCNetCore社区,一个关注.Netcore领域的社区团队。原型模式PrototypePattern原型模式PrototypePattern 创建型设计模式用于对象的创建,通常用于单例模式中。由于单例模式的对象始终为1个,又要用到单例模式又想每次调用有不一样的结果,可以使用原型模式。添加一个创建实例的方法即可。可通过内存复制或者with关键字进行浅拷贝可通过序列化再反序列化进行深度拷贝要区分一下值类型与引用类型。栈中存储变量,堆存储值。string是一个特殊的引用对象,每次赋值时
2022-01-28 21:41:46
463
1
原创 【23种GOF设计模式】C#代码完整案例详解--建造者模式
来自:CCNetCore社区,一个关注.Netcore领域的社区团队。建造者模式BuilderPattern建造者模式BuilderPattern 创建型设计模式用于更复杂的对象创建,通过类似与组装的方式进行构建。用户无需知道具体实现细节,只用按照每个提供好的方法进行组装调用即可。例如:一辆汽车由方向盘、轮胎、灯光进行构建,可将这些制作过程拆开,通过用户调用进行组装。当然,当零件过多的时候,更可以外面包一层,将多个组装方法放入即可。Program.csusing System;using Sy
2022-01-28 21:39:09
453
原创 【23种GOF设计模式】C#代码完整案例详解--抽象工厂
来自:CCNetCore社区,一个关注.Netcore领域的社区团队。抽象工厂AbstractFactory抽象工厂AbstractFactory 创建型设计模式用于复杂对象的创建,是工厂方法的进阶。只是将工厂方法再次继承一个抽象类,用抽奖类接受不同的工厂。Program.csusing FactoryPattern.Sanguosha.Interface;using System;using System.Collections.Generic;using System.Linq;usi
2022-01-27 15:49:25
360
原创 【23种GOF设计模式】C#代码完整案例详解--单例模式
来自:CCNetCore社区,一个关注.Netcore领域的社区团队。单例模式Singleton单例模式Singleton 创建型设计模式为了保证对象的唯一性,还可提高程序的性能。单例模式有3种实现方式每次创建时进行判断(需要双重判断)将对象放入静态构造函数种实例将对象放入静态字段中注意:单例模式并不能保证多线程的安全性,一万次并发中可能会错误50次左右Program.csusing System;using System.Collections.Generic;using Syst
2022-01-27 15:46:39
347
原创 【23种GOF设计模式】C#代码完整案例详解--简单工厂
来自:CCNetCore社区,一个关注.Netcore领域的社区团队。简单工厂SimpleFactory简单工厂SimpleFactory 创建型设计模式创建对象交由工厂的方法完成,通过枚举switch来进行判断创建什么对象。在一个简单工厂类中会实例化多个具体对象,其实也进行了高度耦合。那么创建对象可有以下方式:枚举,switch判断直接new实例化从配置文件中获取字符串,通过反射进行实例化对象注意:该简单工厂方法并未被23种GOF收录Program.csusing FactoryPat
2022-01-27 15:41:15
288
原创 【23种GOF设计模式】C#代码完整案例详解--工厂方法
来自:CCNetCore社区,一个关注.Netcore领域的社区团队。单例模式Singleton单例模式Singleton 创建型设计模式为了保证对象的唯一性,还可提高程序的性能。单例模式有3种实现方式每次创建时进行判断(需要双重判断)将对象放入静态构造函数种实例将对象放入静态字段中注意:单例模式并不能保证多线程的安全性,一万次并发中可能会错误50次左右Program.csusing System;using System.Collections.Generic;using Syst
2022-01-27 15:18:51
238
原创 【橙子日记40】从零开始的毕业设计
更新时间:2021年2月27日今天到学校了昨天发现的bug,今天基本已经解决网站发布地址https://jiftcc.com毕竟学生党,服务器不太行,加载速度比较慢,耐心等待即可测试账号学生:123456密码:123456另外,地图新型冠状病毒数据实时数据已经在昨天晚上实现。其中调用了:新浪的新冠数据接口和百度地图的经纬度接口我还只是一个学生,还有太多东西学习了。。。我发现自己的不足,我还需要更多的学习。经历本次项目之后,我确实学到了很多,关于分布式技术,后面有空的时候会把坑填上
2021-02-27 21:24:24
227
1
原创 【橙子日记39】从零开始的毕业设计
更新时间:2021年2月26日项目我先就这样了,其他的先留坑,之后再填由于后期我们给改了很多东西,现在可能会炸所以我们全部功能测试一下功能测试:验证码功能:昨天已经解决登录功能:测试通过账户功能:界面bug错误不通过更新通过试卷答题功能:通过文件作业提交功能:界面bug不通过提交文件错误不通过图片作业提交:水印通过(昨天晚上解决的)提交图片类型作业通过教师模块:删除课程操作:通过添加课程操作:添加成功,但是无法刷新,不通过修改课程操作
2021-02-26 15:22:33
168
原创 【橙子日记38】从零开始的毕业设计
更新时间:2021年2月25日项目发布设置后端启动端口:后端将会在44362端口开放先打包前后端文件前端:后端:上传至服务器:配置nginx:前端:然后重启一下nginx:nginx -s reload效果:不过说真的,服务器真的不行,加载老慢了!后端:启动一下:http://127.0.0.1:44362已经开放了现在需要nginx进行配置端口转发:注意,这里我们把数据从44362转发到了44366,等下我们前端也得改改重启nginx效果:
2021-02-26 00:56:53
166
原创 【橙子日记37】从零开始的毕业设计
更新时间:2021年2月25日由于快要发布linux操作系统我们是时候要转移数据库了sql转mysql数据库:由于我们使用的ef,更换数据库非常的简单我使用navicat,一键转换,然后自己微调由于sql的DateTime2类型,mysql不好对应,于是我都换成了string记得,创数据库的时候要把数据库字符集改成utf-8,不然可能输入不了中文依赖性更换:Pomelo,以前的全部都要替换掉我们只需要更换一下数据库连接字符串即可由于有之前的经验,很轻松,我们更换了mysql数据
2021-02-25 15:10:29
126
原创 【橙子日记36】从零开始的毕业设计
更新时间:2021年2月24日完善细节:信息界面优化:添加收缩菜单操作:主要都是前端优化:代码:封装圆饼图:<template> <div> <div ref="chart" :style="{ width: w+'px', height: h+'px' }"></div> </div></template><script>export default { props: ["my
2021-02-24 15:54:26
152
原创 【橙子日记35】从零开始的毕业设计
更新时间:2021年2月23日是时候要加快脚步了注册功能:后端: [HttpPost] public IActionResult Register([FromForm] string mail, [FromForm] string username, [FromForm] string pwd, [FromForm] string code) { string codeData = "abcd".ToUpper();
2021-02-23 19:23:04
154
原创 【橙子日记34】从零开始的毕业设计
更新时间:2021年2月22日今天来实现一个难点验证码问题普通的版本就是生成是一个图片,让你输入数字但是要作为我的毕业设计,那肯定不够要用就用高级的操作滑动验证码+选择文字验证码高级验证码:我曾经想过,是不是花点钱买第三方的验证码API当我看到腾讯云的费用是1000起步的时候,我放弃了。。。借鉴github的源码,我们自己弄一套出来后端:common新建2个处理验证码的工具类依赖注入,这里不用接口在处理登入控制器中添加API [HttpGet] [Rout
2021-02-22 19:03:07
225
原创 【橙子日记33】从零开始的毕业设计
更新时间:2021年2月20日实现课程,作业的修改,删除功能毕业设计看来看去,也就是看后端数据的增删改查增和查的功能已经实现了,现在实现修改和删除修改功能:修改和添加的框是几乎一样的,我们可以进行重用这里我们可以修改的是:开始时间,结束时间,作业名字修改前端api:调用:后端api:界面优化一下:我们测试一下效果:ok,一次就成功了!我们继续,删除功能:删除操作:删除相对于修改要比较简单点:删除要彻底删除,不仅要把work表中的数据删除还要删除学生作
2021-02-20 18:38:16
168
原创 【橙子日记32】从零开始的毕业设计
更新时间:2021年2月17日今天是作业模块最后一个内容:图片类型作业:这里我们是之前弄好的文件和图片是一个性质,所以添加作业可以直接公用,只用修改作业类型就可以现在我们主要是要弄,学生提交图片的功能为什么要把图片类型作业分来开呢?1:大部分作业只是一张截图2:我们要实现自动打水印的功能3:我们要实现图片自动识别,不能上传差距过大的图片api:进入页面跳转:注意,这里我们传过去的是workid,我们后端需要student_id提交数据:我们后端: [HttpPost
2021-02-18 23:57:49
164
原创 【橙子日记31】从零开始的毕业设计
更新时间:2021年2月15日真的,不知不觉竟然都到了31更!好家伙今天跟上上次的脚步,继续把试卷作业给完善一下昨天只能展示出来,今天要能提交功能试卷作业提交模块:思路:前端将传给后端后端根据列表里面的workid来判断是属于哪个作业在给对应的作业根据昨天提出来的算法进行计算分数打分我们现在把前端api弄下:后端测试:好像不能这样,只能接受到第一个值而已我就知道入宫我们改成这样:可以看出请求的3个数据是无序的,这样后端也肯定识别不了,我们再改一下:这种情况也是和
2021-02-16 19:44:08
128
原创 【橙子日记30】从零开始的毕业设计
更新时间:2021年2月14日今天任务:完成后端3种作业类型表实体(选择题,判断题,问答题)数据库设计思考了一下,这样弄是行不通的!教师创建作业,会在学生作业关系表种添加字段,代表,某个学生需要做什么作业后面的题目根据学生作业关系表中的workid分别去选择题表和判断题表和问答题表中找workid=workid的数据,然后分别展示出来哇!这个操作的话,数据量会非常非常大一开始我想着,只需要后端判断一下前端传过来的数据,根据数据来自动给分,但是明显有几个问题:教师批改作业:如果后端不保存
2021-02-14 20:57:57
192
原创 【橙子日记29】从零开始的毕业设计
更新时间今天开始进入本系统最核心的模块,有一定的难度思路想了很久,是一个比较大的工程在线作业模块:该模块分为3个部分:教师添加在线作业学生在线写作业教师批改在线作业没有打算弄的很复杂,还是那个原因:我很清楚的认知,这只是一个毕业设计而已。在之后的路上,可能与这些东西毫不相干。这只是一个毕业设计,只是证明大学没有浪费了,只能算是打发打发时间吧。由于在线作业不属于文件每个数据应该放到数据库中我们放3种题型做代表:单项选择题,判断题,问答题其他的,不打算弄,因为真的没那个必要,
2021-02-13 22:03:28
161
原创 【橙子日记28】从零开始的毕业设计
更新时间:2021年2月12日更新模块效果:前端代码:<template> <div class="block p-5"> <el-timeline> <el-timeline-item v-for="(activity, index) in activities" :key="index" :size="normal" :color="'#006eff'" :timestamp="act
2021-02-12 23:14:37
321
原创 【橙子日记27】从零开始的毕业设计
更新时间:2021年2月11日今天是除夕今天测试配置一下linux环境Linux:之前租过几年的腾讯云服务器现在还有一年过期撑到毕业还是问题不大的安装软件:有这3个就够了之前已经配置好了部分的环境现在我们准备一个静态网页,看看能不能发布出去之前安装mysql都已经配置好了,navcat也连接上了现在来配置一下nginx反向代理服务:yum -y install gcc pcre-devel zlib-devel openssl openssl-devel先安装gcc p
2021-02-11 17:28:18
186
原创 【橙子日记26】从零开始的毕业设计
更新时间今天分配的任务有点多除此之外,我心血来潮,分析了一下csdn的评论机制花了几分钟看看能不能弄一个自动回复的机器人尝试优快云自动回复csdn的评论都是post请求https://blog.youkuaiyun.com/phoenix/web/v1/comment/submit网址post请求添加内容和文章id即可伪造这个很容易的using System;using System.IO;using System.Net;using System.Text;namespace PostT
2021-02-10 21:21:11
156
1
原创 【橙子日记25】从零开始的毕业设计
更新时间想了想后面的工程还很多很多我们得改造改造才行继续扩展后端架构采用T4模板将添加模型的要手写的代码减到最少!扩展T4模板我们来理清一下,如果我们添加新的模型,需要手动添加哪些代码1:添加模型层这个没办法,无法自动生成的,无法使用T4模板2:Dal层:IDbSession:using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namesp
2021-02-09 15:15:13
161
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人