分布式系列~08.负载均衡与dubbo-monitor
本文是上一篇文章的后续,详情点击该链接~
什么是服务集群?
服务集群其实就是一个服务,部署多次,形成的整体称为服务集群。
服务集群的优点
避免出现单点故障:如果集群中有某个服务宕机,其他服务可继续运行。并且可以提高效率:在集群模式下有多个服务处理业务,相比非集群模式下可分担单个服务的压力,提高服务效率。
集群模式
zookeeper集群真实集群
真实集群是指在集群中,每一个节点在一个独立的物理机中运行,当某个物理机出现设备故障并不会影响其他节点的运行。建议在生产环境中使用。其中优点是单个硬件出现故障并不会影响集群中其他节点的运行。而缺点的话就是加大硬件成本的开销。
伪集群
在伪集群中所有的服务都部署到同一台设备上,通过不同端口区分不同个体。当设备出现问题会导致整个集群不可用。一般都是学习阶段用来理解的时候使用。所以说它的优点很明显就是节省硬件成本开销。缺点刚刚也说了,就是硬件一旦出现故障会影响整个集群的使用。
负载均衡
负载均衡(LoadBalance),是指将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。
负载均衡解决方案分类及特征
其实就是在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务端。
常见的集中式负载均衡方式
DNS轮询
大多域名注册商都支持 DNS 轮询,DNS 服务器将解析请求按照配置顺序,逐一分配到不同的IP上,这样就完成了简单的负载均衡。
反向代理负载均衡
使用代理服务器,可以将请求转发给内部的服务器。Nginx 是比较常见的服务反向代理技术。在 Nginx中是支持对代理的服务的负载均衡处理的。
基于硬件的负载均衡
硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备我们通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。
进程内负载均衡
将负载均衡逻辑集成到服务组件中,服务组件从服务注册中心获知有哪些地址可用,然后根据指定的负载均衡策略选择出一个合适的服务来调用。
Dubbo内置的负载均衡策略
Random
随机。随机访问集群中节点。访问概率和权重有关。
RoundRobin
轮询。访问频率和权重有关。
权重(weight):占有比例。集群中每个项目部署的服务器的性能可能是不同,性能好的服务器权重应该高一些。
LeastActive
活跃数相同的随机,不同的活跃数高的放前面。
ConsistentHash
一致性Hash。相同参数请求总是发到一个提供者。
Provider集群
新建四个启动类。每次启动启动类修改配置文件dubbo.protocal.port
代码实现
在上篇的代码基础上修改启动Provider集群
我们可以通过多个启动类或者一个启动类启动多次来实现集群。在这里,我就用一个启动类启动多次吧~
每次重复启动的时候都修改端口号,避免冲突
为了看出区别,建议每次启动前修改UserServiceImpl实现类的内容
同时启动了三个
在consumer通过注解配置负载均衡
//负载均衡策,这里是用了随机
@Reference(loadbalance ="random")
private UserService userService;
这个时候我们多次刷新,就会是随机的提供者
随机策略配置权重
随机获取一个[0, totalWeight)之间的数, offset=offset-weight,如果 offset 小于 0,则选中,很明显 weight大的更容易让 offset的值小于 0。
举个例子 有 4权重分别为(1,2, 3, 4) ,totalWeight=10, 假如 offset=6, 6-1=5,5大于 0,继续 5-2=3 大于0,3-3=0, 0-4 小于0 ,所以选择权重为4 的 invoker, 这里可以发现只要offset>=6 则选择权重为 4的invoker, 正好是40%。
通过Provider的@Service注解配置权重
//权重数
@Service(weight = 1)
public class UserServiceImpl implements UserService {
配置轮询策略
轮询其实就是指将请求轮流分配给每台服务器。就比如说吧,我们有三台服务器 A、B、C。我们将第一个请求分配给服务器 A,第二个请求分配给服务器 B,第三个请求分配给服务器 C,第四个请求再次分配给服务器 A。这个过程就叫做轮询。
@Controller
public class UserController {
@Reference(loadbalance ="roundrobin")
private UserService userService;
轮询策略加权
如果我们将等量的请求分配给性能较差的服务器,这显然是不合理的。因此,这个时候我们需要对轮询过程进行加权,以调控每台服务器的负载。经过加权后,每台服务器能够得到的请求数比例,接近或等于他们的权重比。
通过配置文件配置配置负载均衡
在 SpringBoot 的配置文件中可以配置全局的负载均衡。Consumer 中所有调用 Provider集群的业务层都会使用该负载均衡策略。至于配置文件和注解的区别的话呢,主要就是注解它比较局部性,只对当前业务有效。而配置文件呢,是全局的,对所有业务都有效。
dubbo:
consumer:
loadbalance: random
在Dubbo的@Service注解中配置负载均衡以及权重
@Service(loadbalance = "roundrobin",weight = 3)
配置文件的方法与上面一致
dubbo-monitor
DubboMonitor简介
主要用来统计服务的调用次数和调用时间,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心,监控中心则使用数据绘制图表来显示
我们找到这个文件(没有可以找我要)
启动
配置文件
如果我们想在当前的系统当中使用dubbo-monitor的话,那么我们就打开dubbo.properties配置文件来修改配置