.NET Core 开发实战
肖伟宇
校宝在线架构师、SkyWalking .NET 探针贡献者、NetCorePal 组件库创建者
20086 人已学习
新⼈⾸单¥59
课程目录
已完结/共 61 讲
第一章:必备知识 (25讲)
时长 06:28
时长 02:13
.NET Core 开发实战
登录|注册
留言
17
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 33 | 集成事件:使用RabbitMQ来实现EventBus
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | .NET Core的现状、未来以及环境搭建
04 | Startup:掌握ASP.NET Core的启动过程
05 | 依赖注入:良好架构的起点
06 | 作用域与对象释放行为:你知道IDisposable对象释放的时机和坑吗?
07 | 用Autofac增强容器能力:引入面向切面编程(AOP)的能力
08 | 配置框架:让服务无缝适应各种环境
09 | 命令行配置提供程序:最简单快捷的配置注入方法
10 | 环境变量配置提供程序:容器环境下配置注入的最佳途径
11 | 文件配置提供程序:自由选择配置的格式
12 | 配置变更监听:配置热更新能力的核心
13 | 配置绑定:使用强类型对象承载配置数据
14 | 自定义配置数据源:低成本实现定制化配置方案
15 | 选项框架:服务组件集成配置的最佳实践
16 | 选项数据热更新:让服务感知配置的变化
17 | 为选项数据添加验证:避免错误配置的应用接收用户流量
18 | 日志框架:聊聊记日志的最佳姿势
19 | 日志作用域:解决不同请求之间的日志干扰
20 | 结构化日志组件Serilog:记录对查询分析友好的日志
21 | 中间件:掌控请求处理过程的关键
22 | 异常处理中间件:区分真异常与逻辑异常
23 | 静态文件中间件:前后端分离开发合并部署骚操作
24 | 文件提供程序:让你可以将文件放在任何地方
25 | 路由与终结点:如何规划好你的Web API
26 | 工程结构概览:定义应用分层及依赖关系
27 | 定义Entity:区分领域模型的内在逻辑和外在行为
28 | 工作单元模式(UnitOfWork):管理好你的事务
29 | 定义仓储:使用EF Core实现仓储层
30 | 领域事件:提升业务内聚,实现模块解耦
31 | APIController:定义API的最佳实践
32 | 集成事件:解决跨微服务的最终一致性
33 | 集成事件:使用RabbitMQ来实现EventBus
34 | MediatR:轻松实现命令查询职责分离模式(CQRS)
35 | MediatR:让领域事件处理更加优雅
36 | HttpClientFactory:管理向外请求的最佳实践
37 | gRPC:内部服务间通讯利器
38 | gRPC:用代码生成工具提高生产效率
39 | Polly:用失败重试机制提升服务可用性
40 | Polly:熔断慢请求避免雪崩效应
41 | 网关与BFF:区分场景与职责
42 | 网关与BFF:使用JWT来实现身份认证与授权
43 | 安全:反跨站请求伪造
44 | 安全:防开放重定向攻击
45 | 安全:防跨站脚本
46 | 安全:跨域请求
47 | 缓存:为不同的场景设计合适的缓存策略
48 | 部署:演示一个部署流程
49 | ConfigMap:实现基本配置方案
50 | 配置:使用分布式配置中心方案版本化管理配置
51 | 健康检查:与Liveness、Readiness、Startup探测集成实现高可用
52 | 健康检查:搭建全量健康检查探针和看板
53 | ForwardedHeaders:确保服务在负载均衡下正常工作
54 | 安全:介绍强制HTTPS的两种方式
55 | 日志:与EFK日志三件套集成
56 | 日志:Exceptionless日志系统
57 | 追踪:集成SkyWalking .NET实现追踪
58 | 监控与告警:Prometheus与AlertManager
59 | 监控与告警:用Granfana实现监控看板
60 | prometheus-net:自定义监控指标利器
61 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(17)

  • 最新
  • 精选
艾roger
应该发布器包装下接口,不要将icappublisher等cap框架直接在领域层引入,而造成领域事件的依赖污染

作者回复: 很好的建议,这里应该设计接口进行隔离

2020-03-28
2
张志炜
老师,在这节课遇到了3个问题: 1、序列化的时候,提示DomainEvents序列化死循环,导致我需要增加[IgnoreDataMember]注解,可是看老师的案例里面没有这个问题,不知道为什么。 2、在领域事件中,领域事件可以确定只推送了一次,但是Handler这边,却处理了2次,这是为什么了。 3、在集成事件这边,事件正常发出去了,然后接收到的时候,ID和Address却反序列化失败了,直到我将ID { get; protected set; }改成了ID{get;set;}之后,才能成功获取,Address同样,都需要将Set设置成功Public之后才能正常获取。 但是其他Order中的参数,Set依然是private,却没有问题? …… 然后我运行了老师的Demo,都没有这些问题。。可是我对比起来,总感觉代码是没有区别的。。老师能说下,这问题出在哪里么。 或者可能出现在哪些原因上么。。

作者回复: 看看组件版本的区别

2020-06-03
陈正文
把mysql换成sqlserver后报错如下:System.InvalidOperationException:“ValueFactory attempted to access the Value property of this instance.” 此异常最初是在此调用堆栈中引发的: System.Lazy<T>.ViaFactory(System.Threading.LazyThreadSafetyMode) System.Lazy<T>.ExecutionAndPublication(System.LazyHelper, bool) System.Lazy<T>.CreateValue() System.Lazy<T>.Value.get() Microsoft.Extensions.Options.OptionsCache<TOptions>.GetOrAdd(string, System.Func<TOptions>) Microsoft.Extensions.Options.OptionsManager<TOptions>.Get(string) Microsoft.Extensions.Options.OptionsManager<TOptions>.Value.get() DotNetCore.CAP.SqlServer.SqlServerStorageInitializer.GetPublishedTableName() DotNetCore.CAP.SqlServer.SqlServerDataStorage.SqlServerDataStorage(Microsoft.Extensions.Options.IOptions<DotNetCore.CAP.CapOptions>, Microsoft.Extensions.Options.IOptions<DotNetCore.CAP.SqlServerOptions>, DotNetCore.CAP.Persistence.IStorageInitializer)

作者回复: 看起来像是配置没注册对,你需要引入: Microsoft.EntityFrameworkCore.SqlServer 将: builder.UseMySql(connectionString); 改为: builder.UseSqlServer(connectionString);

2020-03-02
3
👑 👑
出现 ValueFactory attempted to access the Value property of this instance.错误好像是因为初始化时不应该EFContext的构造函数中进行服务的注册。 可以将它从构造函数中移除新建一个静态的赋值方法来进行处理。并且在Controller的构造函数中进行注册并调用该方法进行赋值。 EFContext: public static void SetICapPublisher(ICapPublisher capBus) { _capBus = capBus; } Controller: public UserController(IMediator mediator, ICapPublisher capBus) { this._mediator = mediator; DomainContext.SetICapPublisher(capBus); } StartUP: UserMySql修改为 UseSqlServer 如果出现_capPublisher.PublishAsync方法提示“cap.published”不存在 可能是ICapPublisher初始化时数据库连接失败,这个时候可以看一下controller构造函数中ICapPublisher赋值时它的ConnectionString是否为空。 通常都是缺少 options.UseEntityFramework<DomainContext>();造成的。 ConnectionString查看: capBus加入监控,Non-Public members =》_storage =>Non-Public members=>_initialzer=>Non-Public members=>_options=>Value
2021-08-08
2
XINGHE
请教老师,使用CAP框架,如果B服务接收A服务的事件,但是无法完成处理,服务A服务进行回滚,应该如何设计呢?
2020-09-04
2
再见理想
services.AddCap(x => { x.UseEntityFramework<AppDbContext>(); 在dbContext中 使用Icappublish 会有循环引用的问题,调试了一天最后看了一下 cap的源码, We detected that you are using ICapPublisher in DbContext, please change the configuration to use the storage extension directly to avoid circular references! eg: x.UseMySql()
2022-06-24
1
beReply
sqlserver数据库 使用options.UseEntityFramework<DomainContext>();注册会报ValueFactory attempted to access the Value property of this instance.” 使用options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));正常运行 在这之前对sqlServer进行了注册, service.AddDbContext<DomainContext>(options => options .UseSqlServer(connectString));
2020-09-10
1
1
沐雪
services.AddTransient<ISubscriberService, SubscriberService>() 这里的生命周期应该是使用 单例模式吧?
2021-07-11
老师,请教一下 现在公司这边可能让我负责为一个大型企业的生产制造执行(mes)系统做技术框架选型和设计,主要特点是业务功能比较庞大复杂,高并发高可用不用考虑。想来想去,如果就是简单做个前后分离,再将后端设计一个三层架构,好像也不够。 不知道一般大型的业务功能庞大复杂的mes系统,用.net都是怎么设计,都用到哪些框架,不知道您这边有没有案例和建议可供参考,
2021-04-16
魏杨杨
public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration) { //services.AddDbContext<DomainContext>(options => options.UseSqlServer(configuration.GetValue<string>("MySqlServer"))); services.AddTransient<ISubscriberService, SubscriberService>(); services.AddCap(options => { options.UseSqlServer(configuration.GetValue<string>("MySqlServer")); //options.UseEntityFramework<DomainContext>(); //options.UseSqlServer(); options.UseRabbitMQ(options => { configuration.GetSection("RabbitMQ").Bind(options); //options.Port }); options.FailedRetryCount = 20; //重试20次结束 options.FailedThresholdCallback = failed => { var logger = failed.ServiceProvider.GetService<ILogger>(); logger.LogInformation($@"A message of type {failed.MessageType} failed after executing {options.FailedRetryCount} several times, requiring manual troubleshooting. Message name: {failed.Message.GetName()}"); }; options.UseDashboard(); }); return services; } 我也是报错 使用options.UseEntityFramework<DomainContext>();注册会报ValueFactory attempted to access the Value property of this instance.” public static IServiceCollection AddSqlServerDomainContext(this IServiceCollection services, string connectionString) { return services.AddDomainContext(builder => { builder.UseSqlServer(connectionString); }); } 改成了这个 现在项目不会报错 订阅事件接收不了
2020-09-11
收起评论