HTML5技术

我眼中的ASP.NET Core之微服务 (二) - Savorboard

字号+ 作者:H5之家 来源:H5之家 2017-07-21 11:00 我要评论( )

我眼中的ASP.NET Core之微服务 (二) 前言 接上一篇。 上一篇未完待续的原因是当时刚好是6-30号晚上马上12点了还没写完,然后我想赶在7月1号之前发出去,所以当时就发了。然后在发的时候出了一点问题,结果发出去的时候刚好是 7.1号 00:00分,所以就很尴尬~~

我眼中的ASP.NET Core之微服务 (二)

前言

接上一篇。

上一篇未完待续的原因是当时刚好是6-30号晚上马上12点了还没写完,然后我想赶在7月1号之前发出去,所以当时就发了。然后在发的时候出了一点问题,结果发出去的时候刚好是 7.1号 00:00分,所以就很尴尬~~

这一篇,我们就接着说一说微服务吧。

接上文

第四步,重构。

当你写完代码之后,我认为有一个比较重要的步骤就是对写的代码进行一番重构,重构一般从两方面下手,第一方面是代码的命名以及格式,第二方面是代码的组织结构。

针对于代码命名以及格式的重构其实是有方法和技巧的,比如方法的命名以及方法的拆分等可以从<>这些书中来获取一些指导意见等,对于代码格式的话基本上现代的IDE都提供了很好的格式化工具,使用便是。

针对于组织结构的重构有时候是需要依赖很多你的经验的,经验丰富的程序员知道如果的去对写过的代码进行抽象,然后利用某种设计模式或者是面向对象的原则来让代码更加的利于维护和扩展,这种技能往往更难掌握,需要你去阅读很多的别人优秀的代码,然后去思考和学习。

OK,以上就是在构建单个微服务程序的个人总结的一些指导原则吧。

部署方式

指导原则可以帮助我们在构建系统的时候使其保持一个良好的结构,但是你还需要从整体上来把控整个微服务的布局。什么意思呢?

我们知道,微服务最良好的部署方式就是使用 Docker 容器进行部署,因为这样便于管理和配置。
在以前的单体结构的项目中也可以使用Docker进行整块的部署,我们可能部署到多个容器中,然后前置一个负载均衡器进行路由的转发,这样也是可以的。

通常情况下,即使我们的程序架构风格不是微服务,那么在组织代码结构时,也会进行模块的划分,比如划分为会员,商品,库存等。下面是一个单体应用整块部署使用Docker的部署图:

但是这种模式其实与容器的初衷是有一点违背的,容器所倡导的是一个容器只做一件事情。整块部署有一个明显的缺点是,如果随着应用程序的扩展那么每次代码的修改都要全部进行重新发布,但是我们经常修改的代码可能就是某一快的功能,而另外一些代码则永远不会动,这样不但发布程序的时候发布包很大,也容易出错,出问题造成的影响也比较广。

比如,在一个电商网站中,有一些模块是经常发生变化的,比如一些促销,产品等页面,这些页面的访问量也很大,而另外一些页面比如用户中心积分查看,历史订单查看这些功能则不会经常变动,并且访问量要小很多。那么如果他们都在一个系统中,势必会引起这些问题:1、性能优化,如果访问量很高的模块出现性能问题,那么你只能针对整个程序进行扩展部署,而不是单个模块。2、测试,由于模块的依赖,那么在修改一块地方的时候,必须重新对整个应用程序进行一次测试,并且重新部署所有这些实例。3、无法进行扩展,你无法简单的进行接口或者服务的扩展,这会使SOA变得很困难。

那么我们就再顺便说一下SOA,我们知道大多数的公司在 .NET FX 时代使用 WCF 技术进行项目的 SOA 化,比如常见简单的会使用 SOAP ,HTTP,MQ等进行通讯,他们也会把系统进行划分(子系统)和分层。听起来可能和微服务有点像,那么他们有什么区别呢? 想必这是一个很多人讨论过的话题,那么直接说结论吧。 微服务它来自于SOA,但是和SOA不同的是它并没有那么重量级,什么意思呢?比如它没有SOA中的像集群的Broker, 那么大的组织的划分,中央负责人, 还有企业服务总线 (ESB)等。

然后就是我们的主题微服务,微服务架构的定义就是一组小型的服务。每一个服务都位于自己的进程中,并且使用诸如HTTP, WebSockets,或者 AMQP 之类的协议进行通讯。它很小,并且专注于做好一件事,这个很重要,它看起来像OOP中的单一职责原则,如果你2周之内不能完成一个微服务模块,那么可能你对于边界划分出了点问题。

关于微服务的优缺点不做过多的介绍了,有兴趣的同学可以看一下在我博客里面的 Martin Fowler 的 这篇文章。

这篇文章提到了『微服务设计』这本书,如果你想对微服务有更多了解的话可以看一下这本书,建议购买。

微服务中的一些技术挑战

下面需要说的是个人对于在构建微服务的过程中会面临的一些问题,或者说叫做挑战吧。

1、微服务的边界怎么定义。

上一篇文章已经提到过了,在定义微服务边界的过程中,DDD中的指导原则会帮助你大忙。 这可能是你在构建微服务过程中遇到的第一个难题,一个良好的微服务能够对其他微服务尽可能少的依赖,同一个应用程序中你需要用不同的上下文进行解耦,每个上下文有可能是使用不同的程序语言的。这些上下文应该被独立的定义和管理。比如一个User,在 Identity 上下文可能是一个用户,在 CRM 中是一个客户,在订单上下文是一个买家,等等。

2、如何跨微服务进行查询。

因为我们已经微服务化了,所以我们的应用程序数据可能分布在不同的数据库中,那么如何实现从多个为微服务器数据库中查询数据成为一个难题了。

比如,我们前台的数据展示页面需要一个销售统计的报表,其中的数据分别来源于订单,库存和商品。那么我们应该怎么样来处理这种复杂性呢? 目前流行的解决方案有以下几种:

API网关。 使用API网关来对多个微服务器的数据库进行聚合。 但是在实现这种模式的时候你需要非常的小心,它有可能是你系统中性能的瓶颈,甚至它有可能违背微服务的自治原则。为了尽可能避免这个陷阱,你需要设计多个细粒度的 API 网关,每个网关关注系统一个垂直领域的“切片”区域,或者是一个业务领域。现在大部分的云提供商都提供的有 API 网关相关服务,比如AWS的 Amazon API Gateway,Azure 的 Establish API Gateways 等,借助于这些服务可以方便的对 API 进行管理。

CQRS与读表。 不知道大家有没有听说话物化视图(Materialized View)这个名词。你可以理解为远程视图,使用这种方法,你可以提前准备好一个只读表,其中包括多个微服务的数据,这个只读表的结构和你展示给客户的页面数据是对应的。

那么有同学可能会存在这样一个问题,假如我基于不同的数据库建立一个物化视图,那么在我建立物化视图的过程中,我应该怎么样进行查询,因为对于单个数据库的查询可能仍然是复杂的。确实如此,在以前单个应用程序的时候,我们在呈现个客户端需要的数据的时候,可能会是一个复杂的SQL Join连接查询的结果。那么这里的解决方案就是,我们需要建立一个和我们业务无关的一个单独的数据库,然后这个数据库中会包含一些和界面上需要的数据进行一一对应的一些查询用的表,然后我们应用程序中引入 CRQS 这种模式,将需要的数据写入到这些查询表中。

这不仅解决了跨微服务查询这个难题,并且也提高了性能。但是引入CQRS也就意味着你需要拥抱最终一致性。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • ASP.NET Core 开源论坛项目 NETCoreBBS - LineZero

    ASP.NET Core 开源论坛项目 NETCoreBBS - LineZero

    2017-07-19 15:01

  • 关于meta标签中的http-equiv属性使用介绍 - 予沫笙

    关于meta标签中的http-equiv属性使用介绍 - 予沫笙

    2017-07-18 15:00

  • ASP.NET Core之跨平台的实时性能监控 - GuZhenYin

    ASP.NET Core之跨平台的实时性能监控 - GuZhenYin

    2017-07-15 13:00

  • 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序 - SmallProg

    在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序 - Sma

    2017-07-08 16:01

网友点评
(