大型网站技术架构之可扩展性
可扩展性首要步骤:
1、将整个系统按照纵向划分多个层次(应用层、服务层、数据服务层),横向分割成多个模块
2、保证模块之间是高内聚、低耦合的,将耦合降到最低
实现可扩展性的方式(降低耦合)
1、使用消息队列来保证分布式服务之间进行通讯,这种通讯方式将服务之间依赖降低到最小,消费端只管消费消息并不关心消息产生者是谁,同样消息产生者只管往消息队列放数据不关心消费方有哪些。这样两者互不依赖,扩展性高,只需要他们之间产生和消费的消息结构一样就行
2、采用RPC进行服务之间的通讯,服务提供者定义好RPC 接口给服务消费方进行调用,只要保证接口不变,服务提供者可以以多种方式实现接口,服务消费方并不关心接口是如何实现的。
分布式服务的意义
传统应用的方式是将应用拆分成多个模块,然而模块与模块之间进行调用完成业务逻辑,但是当业务很大时,模块也越来越多时就会导致以下问题:
1、代码量大了,编译和部署很困难
2、代码不易管理,代码冲突多
3、模块之间的耦合度高,很难扩展新的功能
4、一个应用中数据库连接池为10个 那么如果部署的应用很多时就会耗尽数据库中的资源
5、开发效率不高,因为很多人都维护同一个应用,有时不能并行开发
如何解决?
服务拆分:将整个应用拆分成不同的服务,以集群方式部署在物理机上,向外提供服务,
服务拆分方式:
-
纵向拆分:一个大应用中拆分出多个独立的小应用,分别部署在不同物理机上
-
横向拆分:从各种应用中抽出公共业务逻辑然后放到一个服务中,例如不同应用中都需要有用户信息和用户登录,这个时候可以抽出一个用户服务供应用层进行调用
Dubbo支持协议和序列化方式
序列化:将某中数据结构或对象转化成二进制字节数组,不同的序列化转化成不同格式的字节数据,反序列化过程相反
默认支持的是 Dubbo协议+Hessian序列化方式 特点:长连接、传输数据小、高并发
RMI+java序列化:短连接、适合传输文件
Hessian+Heassian序列化: 短连接、适合传输文件
Http+json 序列化
WebService+soap序列化