GVKun编程网logo

记录自己运行 eShopOnContainers 过程中遇到的坑(eshoponcontainer讲解)

15

对于想了解记录自己运行eShopOnContainers过程中遇到的坑的读者,本文将是一篇不可错过的文章,我们将详细介绍eshoponcontainer讲解,并且为您提供关于.NET微服务最佳实践eS

对于想了解记录自己运行 eShopOnContainers 过程中遇到的坑的读者,本文将是一篇不可错过的文章,我们将详细介绍eshoponcontainer讲解,并且为您提供关于.NET微服务最佳实践eShopOnContainers、ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现、C# CefSharp MemoryStreamResponseFilter这个类使用过程中遇到的bug,dataIn.CopyTo(dataOut)异常、C/C++开发过程中遇到的坑的有价值信息。

本文目录一览:

记录自己运行 eShopOnContainers 过程中遇到的坑(eshoponcontainer讲解)

记录自己运行 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

.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的实现

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. 添加事件
  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)异常

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++开发过程中遇到的坑

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++开发过程中遇到的坑等相关内容,可以在本站寻找。

本文标签:

上一篇docker 集群 kubernetes 1.8 构建(docker搭建集群)

下一篇怎么控制Keywords密度做好seo优化?