引言

在微服务大行其道的今天,Java阵营的Spring Boot、Spring Cloud、Dubbo微服务框架可谓是风水水起,也不得不感慨Java的生态圈的火爆。反观国内.NET阵营,微服务却不愠不火。

微软在其官网的架构体系上推出了eShopOnContainers微服务参考应用,用来推广基于.NET Core的微服务架构。我也将基于此来学习研究微服务,并分享自己的所学所得,形成一个系列,为.NET社区微服务的推广略尽绵薄之力。

eShopOnContainers 简介

Easy to get started sample reference microservice and container based application. Cross-platform on Linux and Windows Docker Containers, powered by .NET Core 2.1, Docker engine and optionally Azure, Kubernetes or Service Fabric. Supports Visual Studio 2017, VS for Mac and CLI based environments with Docker CLI, dotnet CLI, VS Code or any other...

简单来说:eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用

该参考应用是一个简化版的在线商城/电子商务应用

虽然是简化版的微服务参考示例,但对没接触过Docker、DDD、微服务的同学来说,并不简单。其中不仅包含了很多术语、设计模式、架构风格,还使用了一系列的常见技术(RabbitMQ、EventBus、IdentityServer4、Polly、Api Gateway、Redis、CQRS、CAP、CI/CD等),还有一些相关工具(Docker、K8S等)。所以这将是一个难啃的骨头。

总体介绍

eShopOnContainers作为跨平台的微服务架构,得益于.NET Core能够在Linux或Windows容器上运行。其包含基于浏览器的Web应用、基于Xamarin的Android、IOS、Windows/UWP 移动应用,以及服务端应用。其中服务端包含多个自治微服务(每个都拥有自己的数据/ db),并且每个微服务都有不同的实现形式(简单的CRUD与DDD / CQRS模式)。使用Http作为客户端应用程序之间的通信协议。支持异步通信,使用Integration Events(集成事件)和Event Bus(事件总线)进行数据更新传播。

开发环境架构

一图胜千言,从上图可知,该架构主要包括两个部分:客户端应用和Docker主机中运行的服务端应用。

  1. 客户端应用:基于浏览器的Web应用;基于Xamarin开发的Android、IOS、UWP移动应用。
  2. 服务端应用:部署在在Doker主机的系列微服务。

其中服务端主要包括六大微服务:

  1. Identity Micsroservice(身份微服务):用于身份认证和授权。使用SQL Server数据库。
  2. Catalog microservice(产品目录微服务):用于产品资料的维护。使用SQL Server数据库。
  3. Ordering microservice(订单微服务):用于订单逻辑的处理。使用SQL Server数据库。
  4. Basket microservice(购物车微服务):用于购物车逻辑的处理。使用Redis数据库。
  5. Marketing microservice(市场营销微服务):用于市场营销逻辑的处理。使用MongoDB/CosmosDB 和SQL Server数据库。
  6. Locations microservice (位置微服务):用于提供位置服务。使用MongoDB/CosmosDB 数据库。
  7. [New] Payment microservice (支付微服务):用于处理支付逻辑。

另外从上图我们还可以清晰看出其通信架构

  1. 客户端与微服务通过API网关通信:用于查询和接收来自客户端应用程序的更新或事务命令。
  2. 异步事件通信:通过事件总线传播来自微服务的更新或与外部应用程序集成。事件总线可使用任何消息代理架构技术(如 RabbitMQ)来实现,也可使用诸如 Azure 服务总线、NServiceBus、MassTransit 或 Brighter 等更高级的服务总线。

微服务架构模式

上图列举的四个微服务主要使用了两种架构模式:

  1. 基于数据驱动的CURD微服务
  2. 基于DDD的微服务

而实际上,软件架构师和开发人员会使用不同的架构模式,比如(混合架构风格和架构模式):

  1. 简单的 CRUD,单层
  2. 传统N层
  3. DDD N层
  4. 整洁架构
  5. 命令和查询分离(CQRS)
  6. 事件驱动架构

在由多个微服务组成的应用程序中,可以用不同方式实现每个微服务。每个微服务可能具有不同架构模式,并根据应用程序的性质、业务需求和优先级使用不同的语言和数据库。

这也就是微服务的灵活性与复杂性的源头。

代码结构

系列计划

对于微服务我也只是初步了解,该项目也将是我学习微服务的起点。所以我将以小白的视角(难免有所纰漏,请大家积极交流指正),尽量以通俗易懂的语言来梳理每一个知识点,并形成eShopOnContainers知多少系列,与大家共同学习进步。该系列会首发在我的个人订阅号『微服务知多少』上,请扫描下文二维码,关注更新!

参考资料

eShopOnContainers 官方文档
.NET 微服务:容器化 .NET 应用架构指南.pdf

eShopOnContainers 知多少[1]:总体概览的更多相关文章

  1. [转]eShopOnContainers 看微服务 ①:总体概览

    本文转自:https://www.cnblogs.com/tianyamoon/p/10081177.html 一.简介 eShopOnContainers是一个简化版的基于.NET Core和Doc ...

  2. eShopOnContainers 看微服务 ①:总体概览

    一.简介 eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用. 该参考应用是一个简化版的在线商城/电子商务微服务参考示例应用. 其 ...

  3. eShopOnContainers 知多少[5]:EventBus With RabbitMQ

    1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需 ...

  4. eShopOnContainers 知多少[8]:Ordering microservice

    1. 引言 Ordering microservice(订单微服务)就是处理订单的了,它与前面讲到的几个微服务相比要复杂的多.主要涉及以下业务逻辑: 订单的创建.取消.支付.发货 库存的扣减 2. 架 ...

  5. eShopOnContainers 知多少[10]:部署到 K8S | AKS

    1. 引言 断断续续,感觉这个系列又要半途而废了.趁着假期,赶紧再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现大家常说的微服务上云. 2. 先了解下 Helm 读过我 ...

  6. eShopOnContainers 知多少[9]:Ocelot gateways

    引言 客户端与微服务的通信问题永远是一个绕不开的问题,对于小型微服务应用,客户端与微服务可以使用直连的方式进行通信,但对于对于大型的微服务应用我们将不得不面对以下问题: 如何降低客户端到后台的请求数量 ...

  7. eShopOnContainers 知多少[6]:持久化事件日志

    1. 引言 事件总线解决了微服务间如何基于集成事件进行异步通信的问题.然而只有事件总线正常运行,微服务之间基于事件的通信才得以运转. 而现实情况是,总有这样或那样的问题,导致事件总线不稳定或不可用,比 ...

  8. eShopOnContainers 知多少[4]:Catalog microservice

    引言 Catalog microservice(目录微服务)维护着所有产品信息,包括库存.价格.所以该微服务的核心业务为: 产品信息的维护 库存的更新 价格的维护 架构模式 如上图所示,本微服务采用简 ...

  9. eShopOnContainers 知多少[3]:Identity microservice

    首先感谢晓晨Master和EdisonChou的审稿!也感谢正在阅读的您! 引言 通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问.那进行 API 级别信任决策的第一步就是身份认 ...

随机推荐

  1. tk.mybatis.mapper.provider.SpecialProvider.<init>()

    2017-03-26 23:44:29.192 ERROR 48392 --- [p-nio-80-exec-5] c.t.global.exception.GlobalExHandler : nes ...

  2. JavaScript设计模式 Item 4 --继承

    1.继承 在javascript中继承是一个非常复杂的话题,比其他任何面向对象语言的中的继承都复杂得多.在大多数其他面向对象语言中,继承一个类只需要使用一个关键字即可.与它们不同,在javascrip ...

  3. ConcurrentHashMap简介

    ConcurrentHashMap为了高并发而设计,相比于HashTable和HashMap有更多优势.HashTable是同步的,在多线程环境下,能保证程序执行的正确性,每次同步执行的时候都要锁住整 ...

  4. client.go

    package)*time.Second) ], {         hasConn := false         waitc := time.After(cfg.DialTimeout)     ...

  5. 理解 RxJava 的线程模型

    来源:鸟窝, colobu.com/2016/07/25/understanding-rxjava-thread-model/ 如有好文章投稿,请点击 → 这里了解详情 ReactiveX是React ...

  6. MySQL数据库创建表报错的解决方案

    实体类 package com.tao.pojo; public class Student { private String id; private String name; private Str ...

  7. 【缩点+拓扑判链】POJ2762 Going from u to v or from v to u?

    Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has ...

  8. 钉钉机器人zabbix报警

    首先在钉钉群聊里添加一个自定义的机器人 并复制webhook的内容 https://oapi.dingtalk.com/robot/send?access_token=37e23308d1b84eb4 ...

  9. 同源策略 & 高效调试CORS实现

    # 目录 为什么有同源策略? 需要解决的问题 CORS跨域请求方案 preflight withCredentials 附:高效.优雅地调试CORS实现 ----------------------- ...

  10. WebRTC系列(1)-手把手教你实现一个浏览器拍照室Demo

    1.WebRTC开发背景 由于业务需求,需要在项目中实现实时音视频通话功能,之前基于浏览器开发的Web项目要进行音视频通话,需要安装flash插件才能实现或者使用C/S客户端进行通信.随着互联网技术的 ...