动用Service Fabric承载eShop On Containers

By admin in 亚洲必赢app在哪下载 on 2019年1月15日

从模块化到微服务化

从Pet Shop 到eShop on
Container
都是Microsoft在技能形成的路线上给开发者展示.Net的开销力量和架构能力的Sample工程,Petshop的时候更多的是突显应用的分支架构,设计的抽象与模块间的通讯。到了eShop
on Container更多的关爱在架构设计与微服务化的,下边我们先来探望eshop on
Container的架构图

亚洲必赢app在哪下载 1

在上图,我们得以看来后端服务分为了

  1. Identity microservice(验证服务)
  2. Catalog microservice(商品归类服务)
  3. Ordering microservice(订单服务)
  4. Basket microservice(购物车服务)
  5. 马克eting microservice(市场营销服务)
  6. Locations microservice(地理地点新闻服务)

亚洲必赢app在哪下载 2

在以前的道岔架构中,通常这一个服务都是以某一模块来反映的,为啥现在要将她们拆分成了各样服务吗?当我们从事情场景上边来看这一个服务时,大家会意识各种服务的拜访峰值时间间隔、容量规划都是不同等的,甚至实现这一个服务最有利最简便易行的技艺栈都有可能是不均等的(当然强大的.net
core无所不可能,可是公司内不同业务线上的技术储备不雷同,就有可能选拔不同的技巧实现)。这是因为只要我们都将这一个模块组合到了一个程序如故服务中的时候,就会境遇在不同时间内服务高峰期扩充系统容量困难,要不就是资源缺少,要不就是资源过剩。譬如抢购业务先导前我们提前个半钟头登录了系统,这时候系统最忙的是登录模块,到了启幕抢购时间,系统最忙的是订单模块。不拔取微服务架构的话,半刻钟前准备给登录模块使用的资源不自然能够及时的释放出来给订单模块。假如多少个模块都采纳单一程序架构的话,很可能出现的事态就是抢购的事情把持有资源都占满了了,连其他常规访问系统的用户资源都被挤占掉,导致系统崩溃。在注重Dev/Ops的前几天,开发人士和架构师需要更多的设想硬件架构层面对程序采纳带来的影响。

用Service(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

亚洲必赢app在哪下载 3

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的Service(Service)Manifest.xm和ApplicationManifest.xml文件之后,我们可以用同样的格局将此外服务一一配置完成,然后我们就可以将Service(Service)Fabric的布局Publish到Cluster下边了。

亚洲必赢app在哪下载 4

Service(Service) Fabric会自动遵照配置在Cluster下面Pull
Image和将Docker运行起来。万分简单

用Service(Service) Fabric承载eShop on Container微服务的措施二:用瑟维斯(Service) Fabric的Runtime运行eShop on Container的微服务

Service(Service) Fabric本身就是个微服务的开销框架,现在曾经直接帮助了.net Core
2.0了所以,我们改进了Service Fabric的SDK之后就足以直接创设.net
core的劳务了

亚洲必赢app在哪下载 5亚洲必赢app在哪下载 6

eShop on Container的代码都早就是一份成型的.net core
2.0的代码,所以不需要再度编写服务。

1.由此nuget添加最新的Service Fabric最新的SDK。

亚洲必赢app在哪下载 7

2.改动programe.cs,启动瑟维斯(Service)(Service)Fabric 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>

亚洲必赢app在哪下载,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那么些服务改造成可以通过ServiceFabric来治本的微服务了。通过Publish,大家可观察多少个服务都早已在瑟维斯(Service)Fabric下边接受管理和编制了。

亚洲必赢app在哪下载 8

访问localhost:5100

亚洲必赢app在哪下载 9

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 亚洲必赢app官方下载 版权所有