How to distribute a database among microservices
在为相对复杂的企业域构建微服务时,我们需要找到在这个域中不同责任的边界。在每个边界中,我们会创建领域模型,这个模型是针对业务责任所设计的,并反映了这种业务责任。针对每个边界的数据模型会由同一个边界中的领域模型来驱动。采用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的更多相关文章
- Microservices
Microservices What are Microservices? What are Microservices - microservices.io Microservices - mart ...
- 【转】Everything you need to know about NoSQL databases
原文: https://dev.to/lmolivera/everything-you-need-to-know-about-nosql-databases-3o3h ---------------- ...
- 阿里云DRDS:分布式数据库服务
最近在做阿里云相关的项目,用到阿里的很多接口服务的API,于是想把这段项目做个总结,顺便梳理下阿里云的云计算的相关知识点. DRDS:分布式数据库服务. 1.相关术语 DRDS(Distribute ...
- mongodb与mysql区别(超详细)
MySQL是关系型数据库. 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺 ...
- 阿里巴巴分布式数据库服务DRDS研发历程
淘宝TDDL研发历史和背景 分布式关系型数据库服务(Distribute Relational Database Service,简称DRDS)是一种水平拆分.可平滑扩缩容.读写分离的在线分布式数据库 ...
- Exploring Micro-frameworks: Spring Boot--转载
原文地址:http://www.infoq.com/articles/microframeworks1-spring-boot Spring Boot is a brand new framework ...
- MySQL 中间件汇总比较
360 Atlas 较为活跃,Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础上,对其进行了优 ...
- MySQL中间件介绍
360 Atlas Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化 ...
- 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 ...
随机推荐
- Xcode中iOS模拟器程序中的plist路径
Xcode6.4里写了个简单的iOS程序在模拟器中跑. 其中用到了NSUserDefaults来保存属性文件plist,那么这个文件实际路径在哪里呢?在网上搜了一下,发现几种说法(*表示当前用户名): ...
- C语言关键字static的绝妙用途
为什么要说static妙,它确实是妙,在软件开发或者单片机开发过程中,大家总以为static就是一个静态变量,在变量类型的前面加上就自动清0了,还有就是加上static关键字的,不管是变量还是关键字, ...
- 如何修改linux开机运行配置脚本
开机运行级别的配置角本 /etc/inittab 开机运行级别 init 是切换运行级别的指令 0.关机 //init0 1.单用户模式(自动获取超级用户权限,无网络,无服 ...
- SharePoint 搜索爬网第三方网站配置
介绍:SharePoint的搜索着实强大,而且最近用到SharePoint搜索第三方爬网,感觉收获挺大,而且网上资料没找到太多类似的,就小记录一下,分享给大家. 首先,我自己写了一个net页面,里面读 ...
- MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- saltstack安装部署以及简单实用
一,saltstack简介: SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位. SaltSta ...
- redis+twemproxy实现redis集群
Redis+TwemProxy(nutcracker)集群方案部署记录 转自: http://www.cnblogs.com/kevingrace/p/5685401.html Twemproxy 又 ...
- LAMP的搭建
可以在网上找整合包: httpd-2.4.18 + mysql-5.6.29 + php-5.5.30编译安装过程: 编译源代码后安装软件的位置:/usr/local/ 一.编译安装apache ap ...
- IDEA 下新建 Hibernate 项目
Hibernate 概述 什么是 Hibernate 一个 Java 领域的持久化框架 一个 Java 领域的ORM 框架 什么是持久化 持久化是指把对象永久保存到数据库中 持久化包括和数据库相关的各 ...
- Vue 仿B站滑动导航
仿照B站制作的滑动导航功能,进行了部分优化,例如可定制默认选中元素,并将选中元素居中显示,可动态更改数据,可定制回调函数取的下标和选中元素内容,可根据需求制作N级联动 已开发成插件,使用方法与源码请前 ...