对于想了解记录自己运行eShopOnContainers过程中遇到的坑的读者,本文将是一篇不可错过的文章,我们将详细介绍eshoponcontainer讲解,并且为您提供关于.NET微服务最佳实践eS
对于想了解记录自己运行 eShopOnContainers 过程中遇到的坑的读者,本文将是一篇不可错过的文章,我们将详细介绍eshoponcontainer讲解,并且为您提供关于.NET微服务最佳实践eShopOnContainers、ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现、C# CefSharp MemoryStreamResponseFilter这个类使用过程中遇到的bug,dataIn.CopyTo(dataOut)异常、C/C++开发过程中遇到的坑的有价值信息。
本文目录一览:- 记录自己运行 eShopOnContainers 过程中遇到的坑(eshoponcontainer讲解)
- .NET微服务最佳实践eShopOnContainers
- ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现
- C# CefSharp MemoryStreamResponseFilter这个类使用过程中遇到的bug,dataIn.CopyTo(dataOut)异常
- C/C++开发过程中遇到的坑
记录自己运行 eShopOnContainers 过程中遇到的坑(eshoponcontainer讲解)
由于各种各样的问题,依照官方文档运行 eShopOnContainers 项目遇到了好多莫名其妙的错误。
好在最后都解决了,在此记录,以防自己以后再遇到,也为遇到同样问题的同学提供参考。
参考的官方文档
问题 1:在命令行中运行时,运行命令 “Docker-compose build” 时,由于网速问题,镜像下载不下来,导致出现莫名其妙的问题。我这里显示的是找不到类似下面的目录:/src/src/Services/Basket/Basket.API
解决方法:Docker Settings 中添加 Registry mirrors:
http://f1361db2.m.daocloud.io
问题 2:用 vs2017 编译运行时,提示错误,mkdir permission deny
解决方法:docker setting 里 Shared Drives 点击 Reset credentials,重新将磁盘 Shared
问题 3:在 vs2017 中编译运行成功后,又尝试在 vs2019 中编译运行,结果出现错误,类似 “IConfigurationBuilder 未包含 AddAzureKeyVault 的定义” 这种缺少引用的错误
解决方法:取消勾选 vs2019 中使用.net core SDK 预览版的选项便正常了
.NET微服务最佳实践eShopOnContainers
本文翻译自微软Docs, 内嵌译者多年使用的参悟,如理解有误,请不吝赐教。
微软与社区专家合作,开发了功能齐全的云原生微服务示例应用eShopOnContainers。
该应用旨在展示使用.NET、Docker以及可选的Azure,Kubernetes技术来构建电商平台。

功能 & 要求
简要回顾eShopOnContainers应用的业务功能和技术目标,示例应用代表一个出售各种实体产品的(例如T恤和咖啡杯)电商平台。
电商平台要实现的一些基本功能:
•列出商品目录•按类型过滤商品•按品牌过滤商品•将商品添加到购物车•编辑或删除购物车中的物品•支付•注册帐号•登录•登出•订单审核
示例应用还具有以下非功能性要求:
•必须具有高可用性,并且必须自动扩展以满足不断增长的流量(并在流量减少后再缩减)。•提供易于使用的运行状态监视和诊断日志,以帮助解决遇到的问题。•它应该支持敏捷开发,包括对持续集成和部署(CI/CD)的支持。•除了支持传统的Web前端和SPA Web前端,该应用程序还必须支持不同系统的移动客户端应用程序。•支持跨平台托管和跨平台开发。

Web或移动客户端通过HTTPS访问ASP.NET Core MVC服务器程序或API网关程序
。
API网关具有多种优势,例如将后端服务与各个前端客户端解耦,并提供更好的安全性。
该应用程序还利用了BFF模式(服务于前端的后端)
,该模式建议为每个前端客户端创建单独的API网关。
上面的体系图演示了基于请求是来自Web客户端还是来自移动客户端的API网关
。
示例应用的功能被分解为许多不同的微服务:
•负责身份验证和身份•列出产品目录中的商品•购物车管理以及订单管理。这些独立的服务都有其自己的持久化存储,没有可以与所有服务交互的单个主数据存储,
服务之间的协调和通信是通过消息总线
来完成的。
每个微服务根据其各自的需求独立设计。因此它们的技术堆栈是可以不同的(目前服务均是.NET构建并为云设计)。
简单的服务提供了基本的创建、读取、更新、删除访问(CRUD),而更高级的服务则使用领域驱动设计方法
和模式来管理业务复杂性。

代码结构
因为eShopOnContainers示例程序使用微服务,其GitHub存储库中包含许多独立的项目文件。
除了独立的项目方案和可执行文件之外,各种服务还被设计为在独立的容器中运行。
下图显示了完整的Visual Studio解决方案,管理组织了各种不同的项目。

该代码被组织为支持不同的微服务,并且在每个微服务中,代码分为领域逻辑、基础设施以及用户界面/服务端点。
Ref
• https://docs.microsoft.com/en-us/dotnet/architecture/cloud-native/introduce-eshoponcontainers-reference-app• https://github.com/dotnet-architecture/eShopOnContainers


更多干货及最佳实践分享
关注并星标我们
本文分享自微信公众号 - dotNET跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现
这个EventBus的实现是基于微软微服务https://github.com/dotnet-architecture/eShopOnContainers项目的,我把它从项目中抽离出来,打包成nuget包方便大家快速集成到项目中
从Nuget.org中安装
PM> Install-Package Toosame.EventBus.RabbitMQ -Version 1.1.2
使用
共3步:
- 添加事件
- 添加事件处理器
- 从控制器发布事件
1.添加事件
创建YourEvent.cs文件

1 public class YourEvent : IntegrationEvent
2 {
3 public string Name { get; set; }
4
5 public int Age { get; set; }
6 }

1.添加事件处理器
创建YourEventHandler.cs文件

1 public class YourEventHandler : IIntegrationEventHandler<YourEvent>
2 {
3 private readonly IConfiguration _configuration;
4
5 public YourEventHandler(IConfiguration configuration){
6 //这里只是告诉你,可以使用依赖注入的服务.
7 _configuration = configuration;
8 }
9
10 public Task Handle(YourEvent @event)
11 {
12 //你可以拿到 @event.Name
13 //你可以拿到 @event.Age
14
15 //实现你自己的事件处理逻辑...
16
17 return Task.CompletedTask;
18 }
19 }

1.从控制器中发布事件
刚刚创建了一个事件,并且添加了事件处理器来处理事件,这里演示了如何发布事件;虽然刚刚添加了事件处理器,但是没有将事件处理器注册到ASP.NET Core中,下面的安装环境将演示如何注册。

1 public class HomeController : Controller
2 {
3 private readonly IEventBus _eventBus;
4
5 public YourEventHandler(IEventBus eventBus){
6 _eventBus = eventBus;
7 }
8
9 [HttpGet]
10 public IAcionResult Index(){
11 _eventBus.Publish(new YourEvent(){
12 Name: "my name",
13 Age: 22
14 })
15 }
16 }

安装:注册事件和事件处理器
共2步:
1.配置appsettings.json
2.在Startup.cs中安装
1.配置appsettings.json

{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"RabbitMQ": {
"EventBusConnection": "<yourRabbitMqHost>[:port(default 5672)]",
"EventBusUserName": "<rabbitMqUserName>",
"EventBusPassword": "<rabbitMqPassword>",
"EventBusRetryCount": 5,
"EventBusBrokeName": "<rabbitMqExchangeName>",
"SubscriptionClientName": "<queueName>" //在微服务中,不同的微服务的应该是不同的名字
}
}

2.在Startup.cs中安装
经典安装:

1 public void ConfigureServices(IServiceCollection services)
2 {
3 services.AddEventBus(Configuration.GetSection("RabbitMQ").Get<RabbitMQOption>(),
4 eventHandlers =>
5 {
6 eventHandlers.AddEventHandler<YourEventHandler1>();
7 eventHandlers.AddEventHandler<YourEventHandler2>();
8 });
9
10 services.AddMvc()
11 .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
12 }
13
14 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
15 {
16 app.UseEventBus(eventBus =>
17 {
18 eventBus.Subscribe<YourEvent1, YourEventHandler1>();
19 eventBus.Subscribe<YourEvent2, YourEventHandler2>();
20 });
21
22 app.UseMvc();
23 }

请把YourEvent和YourEventHandler换成你自己的事件和事件处理器
使用Autofac安装:
请先安装Autofac.Extensions.DependencyInjection这个包再使用以下代码

1 public IServiceProvider ConfigureServices(IServiceCollection services)
2 {
3 services.AddMvc()
4 .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
5 .AddControllersAsServices();
6
7 return services.AddEventBusAsAutofacService(Configuration.GetSection("RabbitMQ").Get<RabbitMQOption>(),
8 eventHandlers =>
9 {
10 eventHandlers.AddEventHandler<YourEventHandler1>();
11 eventHandlers.AddEventHandler<YourEventHandler2>();
12 });
13 }
14
15
16 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
17 {
18 app.UseEventBus(eventBus =>
19 {
20 eventBus.Subscribe<YourEvent1, YourEventHandler1>();
21 eventBus.Subscribe<YourEvent2, YourEventHandler2>();
22 });
23
24 app.UseMvc();
25 }

这样刚刚我们创建的EventHandler就能正常的收到事件了;
注意:不同微服务通过事件总线交换消息,Event的名字在不同的微服务项目中必须一致,因为RabbitMQ是通过事件名找队列(一个队列对应一个微服务)
项目github:https://github.com/lhdboy/Toosame.EventBus
C# CefSharp MemoryStreamResponseFilter这个类使用过程中遇到的bug,dataIn.CopyTo(dataOut)异常
使用这个类,可以获取请求的所有数据,可用来下载网站的图片、js等
cef给出的源码
dataIn.CopyTo(dataOut);这句代码,有时候会有问题。问题是这个:dataIn.length 会大于 dataOut.length,这样的话,这里就会报错,原因还没找到。
下面为测试该bug的截图:
这个是测试页面,仅仅几张大小不同的图片。
测试的WinFormApp,会有两张图片没有加载出来。
WinFormApp主要就改了两句代码,如图:
下载第一张图片没有问题,dataIn的长度和 等于 文件的字节大小
下载的第4张图片就出现问题了,最后一个 输入流的长度 大于了 输出流的长度,dataIn.CopyTo(dataOut);这里就会报异常,超出流长度之类的。
目前没找到该解决方案,不知道是什么原因,正在研究源码中。。。
C/C++开发过程中遇到的坑
1、在C++中不要定义bool类型,可以定义BOOL类型,因为C语言中没有bool型,对于指针地址访问比较麻烦。BOOL类型实际上就是Int型。
2、C数据计算是取绝对值要注意fabs与abs的区别。fabs针对浮点型,abs针对整型
3、在数据计算过程中,除法计算取余和获取除法结果是有差别的。1/6 和1/6.0差别很大,如果取余使用1/6,如果是获取除法值1/6.0
4、字符串处理时要谨慎,不要轻易使用等号,最好一个byte一个byte比较,
情况一,计算字符串长度,需要算上换行符或结束符,计算字符个数就是有几个用几个,需要设置,不要把长度当字符个数,尤其在做char *,[],数组的过程中尤其需要谨慎
情况二,不要轻易使用compare,尤其在跨平台操作过程中,需要明确说明比较几个字符,compare(“”,5),表示比较5个字符,因为在不同的文件处理过程中会导致字符的占位符或结束符不一致,或者\r\n与\n的区别。
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
关于记录自己运行 eShopOnContainers 过程中遇到的坑和eshoponcontainer讲解的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于.NET微服务最佳实践eShopOnContainers、ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现、C# CefSharp MemoryStreamResponseFilter这个类使用过程中遇到的bug,dataIn.CopyTo(dataOut)异常、C/C++开发过程中遇到的坑等相关内容,可以在本站寻找。
本文标签: