随着时代的迅速发展,很多互联网项目要求高并发,高可用,高拓展.
集群 & 分布式
集群:很多人一起干,干一样的事。一个业务模块,部署在多个服务器上。是一个横向概念。
分布式:很多人一起干,干不一样的事。这些不一样的事,合起来是一件大事。
Dubbo & SpringCloud
Dubbo主要是为了解决SOA架构下,服务治理的中间件。
SpringCloud主要的应用场景就是在微服务的架构之下。
web、service拆分出来分别部署到不同的服务器上,dubbo为了解决远程调用时候的各种问题的,底层是基于长连接的方式实现RPC。
Dubbo是一个基于Spring开发的小项目,可以和Spring无缝整合.
思考:如果项目启动后,注册中心宕机了,当前服务会受影响吗?
不会,应为当前服务已经通过了注册中心找到相应的服务,当前的功能不会受到影响,但是不能调用还未注册的服务.
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,可用于生产环境,同时它也是dubbo官方推荐使用的注册中心.
需要注意的是在学习了dubbo后所有的对象都需要实现Serializable接口,只有这样才能存储到硬盘持久化保存,或者通过网络在多个项目间传输. 例如:
public class User implements Serializable {
private int id;
private String username;
private String password;
}
思考:SpringMVC响应对象到浏览器的时候,User对象为什么不需要序列化?
在分布式中对象需要在不同的项目之间进行传输,而SpringMVC在底层是通过Jackson把user对象转换成json格式的字符串,然后把字符串用流的形式写进了响应体,最后相应到了浏览器.
负载均衡
当服务提供者provider以集群的方式提供服务时;某个请求到达后,到底要哪个provider提供服务,就要根据负载均衡策略分配。
配置方式: 在消费者远程注入的注解上,通过loadbalance属性配置(策略名称在AbstractLoadBance的实现类中有定义)
public class UserController {
@Refrence(loadbalance="random|roundRobin")
private UserService userService;
}
负载均衡策略共有4个:
-
- random:
默认值,按照权重随机分配。权重默认值为100。但有随机性。
- random:
-
- RoundRobin:按权限轮训,1/2/3/2。按照顺序调用,受权重影响。
-
- LeastActive:最少活跃调用数,相同活跃数随机。当前负载最低的提供者优先调用。某个请求被当前provider调用开始前,计数器+1,调用结束后计数器-1。会优先调用当前计数器的值中最小的provider为本次请求提供服务。
-
- ConsistentHash:一直性hash,相同参数的请求总是发到同一提供者 user/1 user/1000