音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

利用Service Fabric承载eShop On Containers的实现方法
日期:2021-09-07 22:33:53   来源:脚本之家

从Pet Shop 到eShop on Container都是Microsoft在技术演进的路径上给开发者展示.Net的开发能力和架构能力的Sample工程,Petshop的时候更多的是展现应用的分层架构,设计的抽象与模块间的通讯。到了eShop on Container更多的关注在架构设计与微服务化的,下面我们先来看看eshop on Container的架构图

在上图,我们可以看到后端服务分成了

1 Identity microservice(验证服务)

2 Catalog microservice(商品分类服务)

3 Ordering microservice(订单服务)

4 Basket microservice(购物车服务)

5 Marketing microservice(市场营销服务)

6 Locations microservice(地理位置信息服务)

在以前的分层架构中,通常这些服务都是以某一模块来体现的,为什么现在要将他们拆分成了各个服务呢?当我们从业务场景上面来看这些服务时,我们会发现每个服务的访问峰值时间区间、容量规划都是不一样的,甚至实现这些服务最方便最简单的技术栈都有可能是不一样的(当然强大的.net core无所不能,但是公司内不同业务线上的技术储备不一样,就有可能选择不同的技术实现)。这是因为如果我们都将这些模块整合到了一个程序或者服务中的时候,就会碰到在不同时间内服务高峰期扩展系统容量困难,要不就是资源不足,要不就是资源过剩。譬如抢购业务开始前大家提前个半小时登录了系统,这时候系统最忙的是登录模块,到了开始抢购时间,系统最忙的是订单模块。不采用微服务架构的话,半小时前准备给登录模块使用的资源不一定能够及时的释放出来给订单模块。如果两个模块都使用单一程序架构的话,很可能出现的情况就是抢购的业务把所有资源都占满了了,连其他正常访问系统的用户资源都被占用掉,导致系统崩溃。在讲究Dev/Ops的今天,开发人员和架构师需要更多的考虑硬件架构层面对程序应用带来的影响。

用Service Fabric来承载eShop on Container微服务的方法一,通过Service Fabric直接管理Docker

首先我们先到Azure上申请一个Container Registry来承载eShop各个微服务程序的镜像(image).创建Azure Docker Registry可以参考官方文档:https://docs.microsoft.com/zh-cn/azure/container-registry/

现在最新版本Service Fabric已经可以直接管理编排Docker了。

1.创建一个类型为Container的Service

image

2.在servicemanifest.xml中描述清楚image所在路径

<CodePackage Name="Code" Version="1.0.0">
 <!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers -->
 <EntryPoint>
 
  <ContainerHost>
  <ImageName>eshopsample.azurecr.io/catalog:latest</ImageName>  
  </ContainerHost>  
 </EntryPoint>
 <!-- Pass environment variables to your container: --> 
 <EnvironmentVariables>
  <EnvironmentVariable Name="HttpGatewayPort" Value=""/>
 </EnvironmentVariables>
 </CodePackage>

这里非常简单,指定了image所在位置就好了,如果本身Docker Image里需要很多配置信息譬如:数据库链接串、其他服务的地址等等都可以在EnvironmentVariables里面去配置。

3.配置Registry的访问账号密码,需要在ApplicationManifest.xml上面来配置

<ServiceManifestImport>
 <ServiceManifestRef ServiceManifestName="CatalogService_Pkg" ServiceManifestVersion="1.0.1" />  
 <Policies>
  <ContainerHostPolicies CodePackageRef="Code" Isolation="hyperv">
  <RepositoryCredentials AccountName="youraccount" Password="xxxxxxxxxxxxx" PasswordEncrypted="false"/>
  <PortBinding ContainerPort="80" EndpointRef="CatalogServieEndpoint"/>
  
  </ContainerHostPolicies>
 </Policies>
 </ServiceManifestImport>

整个过程不会太复杂,只要配置好了Catalog microserivce的ServiceManifest.xm和ApplicationManifest.xml文件之后,我们可以用同样的方法将其他服务一一配置完成,然后我们就可以将Service Fabric的配置Publish到Cluster上面了。

image

Service Fabric会自动根据配置在Cluster上面Pull Image和将Docker运行起来。非常简单

用Service Fabric承载eShop on Container微服务的方法二:用Service Fabric的Runtime运行eShop on Container的微服务

Service Fabric本身就是个微服务的开发框架,现在已经直接支持了.net Core 2.0了所以,我们更新了Service Fabric的SDK之后就可以直接创建.net core的服务了

imageimage

eShop on Container的代码都已经是一份成型的.net core 2.0的代码,所以不需要重新编写服务。

1.通过nuget添加最新的Service Fabric最新的SDK。

image

2.修改programe.cs,启动ServiceFabric Runtime而不是直接启动Asp.net WebHost

public static void Main(string[] args)
  {
   try
   {
    // ServiceManifest.XML 文件定义一个或多个服务类型名称。
    // 注册服务会将服务类型名称映射到 .NET 类型。
    // 在 Service Fabric 创建此服务类型的实例时,
    // 会在此主机进程中创建类的实例。
    ServiceRuntime.RegisterServiceAsync("Catalog.API",
     context => new CatalogAPI(context)).GetAwaiter().GetResult();
    ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(CatalogAPI).Name);
    // 防止此主机进程终止,以使服务保持运行。 
    Thread.Sleep(Timeout.Infinite);
   }
   catch (Exception e)
   {
    ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
    throw;
   }
}

3.编写

CatalogAPI 类用于启动WebHost

internal sealed class CatalogAPI : StatelessService
 {
  public CatalogAPI(StatelessServiceContext context)
   : base(context)
  { }
  /// <summary>
  /// Optional override to create listeners (like tcp, http) for this service instance.
  /// </summary>
  /// <returns>The collection of listeners.</returns>
  protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
  {
   return new ServiceInstanceListener[]
   {
    new ServiceInstanceListener(serviceContext =>
     new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
     {
      ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");
            return new WebHostBuilder()
           .UseKestrel()
         .ConfigureServices(
          services => services
           .AddSingleton<StatelessServiceContext>(serviceContext))
         .UseContentRoot(Directory.GetCurrentDirectory())
         .ConfigureAppConfiguration((builderContext, config) =>
         {
          IHostingEnvironment env = builderContext.HostingEnvironment;
          config.AddJsonFile("settings.json", optional: false, reloadOnChange: true)
           .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
          
         })
         .UseStartup<Startup>()
         .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
         .UseUrls(url)
         .UseWebRoot("Pics")
         .Build();     
     }))
   };
  }
 }

4.编写serviceManifest.xml描述服务端口等信息

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="Catalog.APIPkg"
     Version="1.0.3"
     xmlns="http://schemas.microsoft.com/2011/01/fabric"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <ServiceTypes>
  <StatelessServiceType ServiceTypeName="Catalog.API" />
 </ServiceTypes>
 <!-- Code package is your service executable. -->
 <CodePackage Name="Code" Version="1.0.3">
 <EntryPoint>
  <ExeHost>
  <Program>Catalog.API.exe</Program>
  <WorkingFolder>CodePackage</WorkingFolder>
  </ExeHost>
 </EntryPoint>
 <EnvironmentVariables>
  <EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="Development"/>
 </EnvironmentVariables>
 </CodePackage>

 <ConfigPackage Name="Config" Version="1.0.1" />
 <Resources>
 
 <Endpoints> 
 
  <Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="5101" />
 </Endpoints>
 </Resources>
</ServiceManifest>

5.修改AppcationManifest.xml增加几个服务的描述信息

添加ServiceImport节

<ServiceManifestImport>
 <ServiceManifestRef ServiceManifestName="Catalog.APIPkg" ServiceManifestVersion="1.0.3" />
 <ConfigOverrides />
 </ServiceManifestImport>

在DefaultService中描述Service

<Service Name="Catalog.API" ServiceDnsName="catalog.fabric.api">
  <StatelessService ServiceTypeName="Catalog.API" InstanceCount="[Catalog.API_InstanceCount]">
  <SingletonPartition />
  </StatelessService>
 </Service>

这样我们就可以将Catalog这个服务改造成可以通过Service Fabric来管理的微服务了。通过Publish,我们可看到几个服务都已经在Service Fabric下面接受管理和编排了。

image

访问localhost:5100

image

以上这篇利用Service Fabric承载eShop On Containers的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程