溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么利用Service Fabric承載eShop On Containers

發(fā)布時間:2021-07-27 21:55:21 來源:億速云 閱讀:166 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“怎么利用Service Fabric承載eShop On Containers”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么利用Service Fabric承載eShop On Containers”吧!

從模塊化到微服務(wù)化

從Pet Shop 到eShop on Container都是Microsoft在技術(shù)演進(jìn)的路徑上給開發(fā)者展示.Net的開發(fā)能力和架構(gòu)能力的Sample工程,Petshop的時候更多的是展現(xiàn)應(yīng)用的分層架構(gòu),設(shè)計的抽象與模塊間的通訊。到了eShop on Container更多的關(guān)注在架構(gòu)設(shè)計與微服務(wù)化的,下面我們先來看看eshop on Container的架構(gòu)圖

怎么利用Service Fabric承載eShop On Containers

在上圖,我們可以看到后端服務(wù)分成了

  1. Identity microservice(驗證服務(wù))

  2. Catalog microservice(商品分類服務(wù))

  3. Ordering microservice(訂單服務(wù))

  4. Basket microservice(購物車服務(wù))

  5. Marketing microservice(市場營銷服務(wù))

  6. Locations microservice(地理位置信息服務(wù))

怎么利用Service Fabric承載eShop On Containers

在以前的分層架構(gòu)中,通常這些服務(wù)都是以某一模塊來體現(xiàn)的,為什么現(xiàn)在要將他們拆分成了各個服務(wù)呢?當(dāng)我們從業(yè)務(wù)場景上面來看這些服務(wù)時,我們會發(fā)現(xiàn)每個服務(wù)的訪問峰值時間區(qū)間、容量規(guī)劃都是不一樣的,甚至實現(xiàn)這些服務(wù)最方便最簡單的技術(shù)棧都有可能是不一樣的(當(dāng)然強(qiáng)大的.net core無所不能,但是公司內(nèi)不同業(yè)務(wù)線上的技術(shù)儲備不一樣,就有可能選擇不同的技術(shù)實現(xiàn))。這是因為如果我們都將這些模塊整合到了一個程序或者服務(wù)中的時候,就會碰到在不同時間內(nèi)服務(wù)高峰期擴(kuò)展系統(tǒng)容量困難,要不就是資源不足,要不就是資源過剩。譬如搶購業(yè)務(wù)開始前大家提前個半小時登錄了系統(tǒng),這時候系統(tǒng)最忙的是登錄模塊,到了開始搶購時間,系統(tǒng)最忙的是訂單模塊。不采用微服務(wù)架構(gòu)的話,半小時前準(zhǔn)備給登錄模塊使用的資源不一定能夠及時的釋放出來給訂單模塊。如果兩個模塊都使用單一程序架構(gòu)的話,很可能出現(xiàn)的情況就是搶購的業(yè)務(wù)把所有資源都占滿了了,連其他正常訪問系統(tǒng)的用戶資源都被占用掉,導(dǎo)致系統(tǒng)崩潰。在講究Dev/Ops的今天,開發(fā)人員和架構(gòu)師需要更多的考慮硬件架構(gòu)層面對程序應(yīng)用帶來的影響。

用Service Fabric來承載eShop on Container微服務(wù)的方法一,通過Service Fabric直接管理Docker

首先我們先到Azure上申請一個Container Registry來承載eShop各個微服務(wù)程序的鏡像(image).創(chuàng)建Azure Docker Registry可以參考官方文檔:https://docs.microsoft.com/zh-cn/azure/container-registry/

現(xiàn)在最新版本Service Fabric已經(jīng)可以直接管理編排Docker了。

1.創(chuàng)建一個類型為Container的Service

怎么利用Service Fabric承載eShop On Containers

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里需要很多配置信息譬如:數(shù)據(jù)庫鏈接串、其他服務(wù)的地址等等都可以在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>

整個過程不會太復(fù)雜,只要配置好了Catalog microserivce的ServiceManifest.xm和ApplicationManifest.xml文件之后,我們可以用同樣的方法將其他服務(wù)一一配置完成,然后我們就可以將Service Fabric的配置Publish到Cluster上面了。

怎么利用Service Fabric承載eShop On Containers

Service Fabric會自動根據(jù)配置在Cluster上面Pull Image和將Docker運行起來。非常簡單

用Service Fabric承載eShop on Container微服務(wù)的方法二:用Service Fabric的Runtime運行eShop on Container的微服務(wù)

Service Fabric本身就是個微服務(wù)的開發(fā)框架,現(xiàn)在已經(jīng)直接支持了.net Core 2.0了所以,我們更新了Service Fabric的SDK之后就可以直接創(chuàng)建.net core的服務(wù)了

怎么利用Service Fabric承載eShop On Containers怎么利用Service Fabric承載eShop On Containers

eShop on Container的代碼都已經(jīng)是一份成型的.net core 2.0的代碼,所以不需要重新編寫服務(wù)。

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

怎么利用Service Fabric承載eShop On Containers

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

public static void Main(string[] args)

        {

            try

            {

                // ServiceManifest.XML 文件定義一個或多個服務(wù)類型名稱。

                // 注冊服務(wù)會將服務(wù)類型名稱映射到 .NET 類型。

                // 在 Service Fabric 創(chuàng)建此服務(wù)類型的實例時,

                // 會在此主機(jī)進(jìn)程中創(chuàng)建類的實例。

                ServiceRuntime.RegisterServiceAsync("Catalog.API",

                    context => new CatalogAPI(context)).GetAwaiter().GetResult();

                ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(CatalogAPI).Name);

                // 防止此主機(jī)進(jìn)程終止,以使服務(wù)保持運行。 

                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描述服務(wù)端口等信息

<?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增加幾個服務(wù)的描述信息

添加ServiceImport節(jié)

<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這個服務(wù)改造成可以通過Service Fabric來管理的微服務(wù)了。通過Publish,我們可看到幾個服務(wù)都已經(jīng)在Service Fabric下面接受管理和編排了。

怎么利用Service Fabric承載eShop On Containers

訪問localhost:5100

怎么利用Service Fabric承載eShop On Containers

感謝各位的閱讀,以上就是“怎么利用Service Fabric承載eShop On Containers”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么利用Service Fabric承載eShop On Containers這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI