• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 利用Service Fabric承载eShop On Containers的实现方法

利用Service Fabric承载eShop On Containers的实现方法

作者:云上的翅膀 字体:[增加 减小] 来源:互联网 时间:2018-08-20

云上的翅膀 通过本文主要向大家介绍了Service,Fabric,承载,eShop,On,Containers等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

从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的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Remoting和Webservice的详细介绍及区别
  • ASP.NET中基于soaphead的webservice安全机制
  • ASP.NET中Webservice安全 实现访问权限控制
  • ASP.NET调用WebService服务的方法详解
  • 完美解决api、WebService跨域的问题
  • 利用Service Fabric承载eShop On Containers的实现方法
  • 通过Web Service实现IP地址查询功能的示例
  • 获取WebService的请求信息方法实例
  • Web Services使用多态的方法
  • ASP.NET如何定时调用WebService服务

相关文章

  • 2017-05-11Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)
  • 2017-05-11C# 通用文件上传类
  • 2017-05-11asp.net DataTable导出Excel自定义列名的方法
  • 2017-05-11ASP.NET技巧:同时对多个文件进行大量写操作对性能优化
  • 2017-05-11HTTP错误500.19解决方法(定义了重复的节点)
  • 2017-05-11ASP.NET数据库存取图片的方法
  • 2017-05-11.net jMail邮件发送(含抄送、密送、多发、日志记录)实例代码
  • 2017-05-11asp.net下让Gridview鼠标滑过光棒变色效果
  • 2017-05-11ASP.NET User Control使用技巧一则
  • 2017-05-11asp.net生成字母和数字混合图形验证码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • .NET实用扩展方法详解
    • asp.net 操作excel的实现代码
    • asp.net实现批量删除实例
    • asp.net(c#) MS AJAX的安装
    • 利用Timer在ASP.NET中实现计划任务的方法
    • .net socket客户端实例代码分享
    • 一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载
    • nunit使用指南之—NUnit Quick Start
    • c#中带头(声明)的xml(封装)生成
    • Asp.net之数据过滤浅析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有