标签:
下文是对 Chris Richardson(CloudFoundry 的创建者) 在 SlideShare 分享的“Developing applications with a microservice architecture”(需要科学上网,不会的同学学习吧,为了你们好,此处不发表评论)的注解。
在全球最大的视频网站上也有 Chris Richardson 的演讲的视频,自己找吧。我还没来及看,而且我也是普通码农一个,所以下面的内容难免有一些谬误,但技术胜在交流,所以下发表出来。以后我必定会做更新。
讲 Monolithic(单一的)应用程序的缺点:
影响伸缩性的三点
服务划分的太少和太多都不好,所以,这是一门艺术。划分服务的目的是让开发和部署更容易,而不能为了服务而服务。
构建模块化、多语言、多框架的应用
注:主要是说 Microservices 有这样的能力,让你能够选择合适的语言和框架完成工作。同样,不能为了语言而语言,为了框架而框架
举个栗子
会产生各种不正式的 API,同时还有对 Web 不友好的协议,比如 AMQP。解决方法是引入 API Gateway
没看懂,详细看这里 http://techblog.netflix.com/2013/01/optimizing-netflix-api.html
当然是对于大型网站来说,挑战很大
不再能通过单一的 URL 访问服务了,如何解决?可以用类似与 HAProxy 的技术
有同步的 HTTP,也有异步 AMQP。有流行的 JSON,也有像 Thrift 的那样的二级制协议(当然更有效率。基于 TCP)
接下来揭晓消息和 HTTP 分别作为通信机制的优缺点
选项1:负载均衡器。负载均衡器负责定位服务,接受服务的注册。亚马逊采用这种方式
选项2:客户端自己搞定:架构中只有一个服务注册中心。服务提供者向注册中心注册,客户端则向注册中心查找可用的服务,直接调用。Netflix 采用这种方式。
这两种方式均有链接做详细解释。
Content router 和 API Gateway 的不同。前者在整个系统(机房)之外,可能会包含如 CDN 的功能。后者是系统的一部分
比如订单服务中的订单(表)和客户服务中的客户(表)存在着多对一的关系,那解构的服务和解构的数据如何处理它们之间的管理关系呢?
通过 API 来实现,我们成这个方法是“拉”数据(呃。。。)。好处是实现简单,毕竟调用一下 API 就好了;保证数据是新鲜的(不会有脏数据的问题)
缺点:降低可用性(依赖于服务),增加相应时间
复制表:在订单服务中也有一个客户表(Customer‘),这个表是客户服务中的 Customer 表的一个复制,但是只包含订单系统所关心的信用额度的数据。同时,订单服务需要提供一个 API 去使得其 Customer‘ 的数据能和客户服务的数据同步
这种方法采用的 DDD 中的有界上下文的设计思想,详见领域驱动设计 Domain Driven Design
这种方法的好处是更好的可用性(不用依赖其它服务)、更好的延迟;缺点是额外的数据复制和同步的复杂度。
我只能说,信用额度这种和钱有关的一旦不同步就不好了啊。所以低延迟高可用的消息队列很重要,比如 Kafka
不说了,总之互联网很少用
只能保证最终一致(前提是消息队列靠谱)
互联网更多的是采用这种方法,所以经常能听到淘宝说它的消息队列多么多么牛X。一般来说一般的用 RabbitMQ,吞吐更大的用 Kafka。再满足不了需求的就自己搞。其实淘宝的 MetaQ也是抄的Kafka,只是前者用Java,后者用 Scala。再多说点 RabbitMQ 用的是 Erlang。所以如果想再学一门 Java 以外的服务器端开发语言,Scala、Erlang、Go 里面挑一个
说的简单,其实这事件驱动的架构不好设计
那用事件驱动如何解决前面的那个栗子呢?看图
API 和事件驱动这两种方法谈不上谁好谁坏
都是 Scala 的代码
PS. 开源中国博客的标题怎么限制字数限制的这么狠
标签:
原文地址:http://my.oschina.net/lifany/blog/359364