在为相对复杂的企业域构建微服务时,我们需要找到在这个域中不同责任的边界。在每个边界中,我们会创建领域模型,这个模型是针对业务责任所设计的,并反映了这种业务责任。针对每个边界的数据模型会由同一个边界中的领域模型来驱动。采用DDD的方式我们能够找到这些边界,并会为每个边界创建一个 有界上下文(bounded context) ,每个上下文将会成为一个微服务。

http://www.tuicool.com/articles/UNRZ3mm

【编者的话】如何在微服务之间共享使用数据库?本文介绍了一个该领域很容易犯错的架构问题,并且提出了解决方案和反思。

几年前,我是一个团队的首席开发人员,该团队为客户端开发Java web应用程序。本文里我们称之为“项目A”。我们在客户现场构建web应用,还有其他团队在相关项目上共同工作。因为我们在项目早期沟通合作一直很愉快深入,所以会定期在团队间交换软件的架构思想。

一天,一个新项目(项目B)启动了。该项目会由另外一个团队完成。我认为在这个新项目中我们也能有所贡献,我们将项目A的记录用户,角色和权限的通用认证的数据库schema共享给了项目B。最终,这两个项目都是使用相同用户数据库的内部web应用程序。对了,还忘记说一点,这些应用程序没有中央的用户数据库 -- 每个新项目都是从头开始的。我们发现通过共享已有的基础架构和最佳实践,不仅仅可以节省开发时间,而且还能够节省很多客户支持的时间,因为他们不需要处理单独的用户目录了。

项目进展顺利,第二个项目使用单独的数据库用户账号访问我们的数据库表,这样两个项目可以隔离开从而避免混乱。

一段时间之后。。。

毕竟存储用户,角色和权限不是什么难事。大概一年后,我们计划开发项目A的新版本。我们都很兴奋,因为有机会可以将项目A中工作不太好的地方改进,同时保留好的功能。我们也改进了一些项目A里工作得还可以的部分 -- 其中,包括改进了存储用户,角色和权限的数据库表的schema。老实说,当时根本没有想到会影响项目B。

当然,很快项目B就崩溃了。我们的错误之处在于给了项目B直接访问数据库的权限。不仅仅就现在的标准而言,就算是根据以前的标准,正确的决定也是去创建一个单独的认证服务,来共享通用的API,而不是直接共享数据库访问。

还有更多的。。。

因此,我们犯了一个严重的架构错误,但是这里还有另外一个问题。具有讽刺意味的是,项目B使用的人不多。当时要求项目B的团队都没怎么使用项目B。这个项目就一直停滞着,可以使用,但一直没有正式启用。因此在两周之后才有人发现项目B不工作了。

在第一个可怜的用户报告出问题的时候,我们的开发人员已经到其他项目上工作去了。在做问题定位分析的时候,我们检查了错误日志,尝试找出是什么问题。现在来看,我们当时没有规划精细的监控方案,能够自动监测到应用程序的问题,这也是失误决策的一部分。

虽然这次事故听上去很古老,但是我真的希望大家能够从中学习到经验教训。

一定要确保通过稳定的API来访问数据库,从而将简单的数据库转变为服务,也使得共享使用更为容易。
并且确保正确监控应用程序和服务。
围绕API构建的环境会长期保持基础架构的动态性。监控则能确保能够有效控制日益增长的复杂度。

我期望这篇文章的问题能够在你在Eclipse IDE里打开File菜单,选择Export as .war来开启部署之旅的时候就对你有所启示。

原文链接: How to distribute a database among microservices

How to distribute a database among microservices的更多相关文章

  1. Microservices

    Microservices What are Microservices? What are Microservices - microservices.io Microservices - mart ...

  2. 【转】Everything you need to know about NoSQL databases

    原文: https://dev.to/lmolivera/everything-you-need-to-know-about-nosql-databases-3o3h ---------------- ...

  3. 阿里云DRDS:分布式数据库服务

    最近在做阿里云相关的项目,用到阿里的很多接口服务的API,于是想把这段项目做个总结,顺便梳理下阿里云的云计算的相关知识点. DRDS:分布式数据库服务. 1.相关术语 DRDS(Distribute  ...

  4. mongodb与mysql区别(超详细)

    MySQL是关系型数据库. 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺 ...

  5. 阿里巴巴分布式数据库服务DRDS研发历程

    淘宝TDDL研发历史和背景 分布式关系型数据库服务(Distribute Relational Database Service,简称DRDS)是一种水平拆分.可平滑扩缩容.读写分离的在线分布式数据库 ...

  6. Exploring Micro-frameworks: Spring Boot--转载

    原文地址:http://www.infoq.com/articles/microframeworks1-spring-boot Spring Boot is a brand new framework ...

  7. MySQL 中间件汇总比较

    360 Atlas 较为活跃,Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础上,对其进行了优 ...

  8. MySQL中间件介绍

    360 Atlas Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化 ...

  9. The Microservices Workflow Automation Cheat Sheet

    Written by Bernd Rücker on Dec 12 2018 in the Best Practices category. Editor’s Note: This post orig ...

随机推荐

  1. ANDROID 中设计模式的采用--结构型模式

            结构型模式中的适配器模式.外观模式.装饰模式.代理模式都属于包装模式,都是对另外的类或对象的包装,只是各自的意图不同. 适配器模式通过对另外的类或对象的包装,将其接口转换为用户期望 ...

  2. C/C++语言中NULL、'\0’和0的区别

    注:本文参考了http://blog.csdn.net/mylinx/article/details/6873253及书籍<征服C指针>([日]前桥和弥著). NULL.'\0'和0的值是 ...

  3. Testbench(转)

    本来还打算自己写下对Testbench的理解,后来发现百度百科名片解释得很好,所以就直接转了. 原文百度百科链接:http://baike.baidu.com/link?url=dxzsOAs32IE ...

  4. Java IO学习--(三)通道

    Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力.所以管道也可以作为数据源以及目标媒介. 你不能利用管道与不同的JVM中的线程通信(不同的进程).在概念上,Java的管道不同于U ...

  5. spring事务探索

    spring自建事务管理模块.而且这个事务管理是一个抽象设计,可以应用到很多场合,包括普通的DataSource,jta,jms和hibernate上.  要正确使用spring的事务,首先需要了解s ...

  6. subclipse下svn: E200015: authentication cancelled问题的解决

    今天要把新建的一个项目要share到一个Ubuntu下SVN服务上,总是让我不断的重复输入密码,实在是太要命了,点取消就报错如标题,Google了一下,最后在后面参考那篇帖子的启发下,到SVN配置里面 ...

  7. Neo4j安装后的密码修改

    首先默认用户名/密码是neo4j/neo4j. 在安全验证打开的时候,你访问服务器/db/data之类的地址可能会提示您以下信息: { "password_change" : &q ...

  8. CPA、CPS、CPM、CPT、CPC 是什么

    http://www.a-edm.com/cpa.html 网络营销之所以越来越受到重视一个主要的原因就是因为“精准”.相比较传统媒体的陈旧广告形式,网络营销能为广告主带来更为确切的效果与回报,更有传 ...

  9. [ SSH框架 ] Struts2框架学习之二

    一.Struts2访问Servlet的API 前面已经对 Struts2的流程已经执行完成了,但是如果表单中有参数如何进行接收又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习 Str ...

  10. Spring-mvc设置@RequestMapping标签更改返回头及@RequestMapping简述

    1. 引子:设置返回头 2. 简述 3. value 4. method 5. consumes/produces 6. params 7. headers 1. 引子:设置返回头 返回JSON内容时 ...