API网关之负载均衡功能原理

个人基本理解:在系统开发中,目前主流是分布式部署。即一个应用或者数据库,部署在多个端口或者多台机器上面。在调用过程中如何找到对应的服务就需要配合负载均衡选择。
常见负载均衡功能
1.硬件负载 如F5
F5是一种负责均衡的硬件设备,经过配置之后可以进行链路和冗余,防火墙,服务器,系统管理等配置功能。
2.软件负载 如nginx,LVC
3.代码写死
核心处理流程可以理解为
数据结构(存储服务器列表)+算法(负载均衡算法)
下面介绍一下常见的负载均衡策略

  • 轮询
  • 最小连接数
  • 随机
  • 一致性哈希

基本思想就是使用一个数据结构存储服务器列表信息,比如集合或者队列。
使用一些算法针对集合数据进行处理。

随机算法

这个列举一个dubbo的例子
dubbo的随机可以是均等随机(权重相同)或者非均等随机即权重设计的不同.
随机负载均衡(RandomLoadBalance):先统计所有服务器上该接口方法的权重总和,如果所有的权重相同则全部机器中进行随机。如果权重不同,则对这个权重总和随机nextInt一下,看生成的随机数落到哪个段内,就调哪个服务器上的该服务。
protected Invoker doSelect(List<Invoker> invokers, URL url, Invocation invocation) {
int length = invokers.size(); // 总个数
int totalWeight = 0; // 总权重
boolean sameWeight = true; // 权重是否都一样
for (int i = 0; i < length; i++) {
int weight = getWeight(invokers.get(i), invocation);
totalWeight += weight; // 累计总权重
if (sameWeight && i > 0
&& weight != getWeight(invokers.get(i - 1), invocation)) {
sameWeight = false; // 计算所有权重是否一样
}
}
if (totalWeight > 0 && ! sameWeight) {
// 如果权重不相同且权重大于0则按总权重数随机
int offset = random.nextInt(totalWeight);
// 并确定随机值落在哪个片断上
for (int i = 0; i < length; i++) {
offset -= getWeight(invokers.get(i), invocation);
if (offset < 0) {
return invokers.get(i);
}
}
}
// 如果权重相同或权重为0则均等随机
return invokers.get(random.nextInt(length));
}
来一个demo

public class RandomBalanceDemo {

public static String doSelect(List<ServiceUrl> serviceUrls) {
    int length = serviceUrls.size(); // 总个数
    int totalWeight = 0; // 总权重
    boolean sameWeight = true; // 权重是否都一样
    Random random = new Random();
    for (int i = 0; i < length; i++) {
        int weight = serviceUrls.get(i).getScore();
        totalWeight += weight; // 累计总权重
        if (sameWeight && i > 0
                && weight != serviceUrls.get(i-1).getScore()) {
            sameWeight = false; // 计算所有权重是否一样
        }
    }
    if (totalWeight > 0 && ! sameWeight) {
        // 如果权重不相同且权重大于0则按总权重数随机
        int offset = random.nextInt(totalWeight);
        // 并确定随机值落在哪个片断上
        for (int i = 0; i < length; i++) {
            offset -= serviceUrls.get(i).getScore();
            if (offset < 0) {
                return serviceUrls.get(i).getUrl();
            }
        }
    }
    // 如果权重相同或权重为0则均等随机
    return serviceUrls.get(random.nextInt(length)).getUrl();
}

public static void main(String[] args) {
   //权重相同的随机
    List<ServiceUrl> serviceUrls = new ArrayList<>();
    serviceUrls.add(new ServiceUrl("http://1",2));
    serviceUrls.add(new ServiceUrl("http://2",2));
    serviceUrls.add(new ServiceUrl("http://3",2));
    serviceUrls.add(new ServiceUrl("http://4",2));
    serviceUrls.add(new ServiceUrl("http://5",2));
    for(int i=1;i<11;i++){
        System.out.println("调用第"+i+"次"+"url:"+doSelect(serviceUrls));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关(Gateway)是在分布式系统中充当入口的服务器,它负责接收来自客户端的请求,并将其转发到相应的服务。API 关(API Gateway)是一种特殊的关,它专门用于管理和路由 API 请求。 API 关的工作原理如下: 1. 接收请求:客户端发送请求到 API 关,通常是通过 HTTP 或 HTTPS。 2. 路由请求:API 关根据请求的 URL 或其他标识符决定将请求路由到哪个后端服务。 3. 鉴权和认证:API 关可以执行身份验证和授权操作,以确保请求的发送者有权访问所请求的资源。 4. 负载均衡:如果后端服务有多个实例,API 关可以使用负载均衡算法将请求分发到可用的实例上,以实现高可用性和性能优化。 5. 缓存:API 关可以缓存响应数据,以减轻后端服务的负载,并提供更快的响应时间。 6. 限流和熔断:API 关可以对请求进行限流和熔断处理,以防止后端服务被过多的请求压垮。 7. 请求转换:API 关可以对请求进行转换,例如将请求从 HTTP 转换为其他协议或格式,以适应后端服务的需求。 8. 响应处理:API 关接收后端服务的响应,并将其转发给客户端。在此过程中,它可以对响应进行转换、过滤或其他处理操作。 通过使用 API 关,可以实现统一管理和控制 API 请求,提供安全性、可靠性和性能优化等功能。它还可以帮助构建微服务架构,将复杂的系统拆分为更小的服务单元,并提供统一的入口点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值