IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 手写一个客户端负载均衡器 -> 正文阅读

[系统运维]手写一个客户端负载均衡器

1.前提准备

本文是在使用nacos的基础上进行的简单讲解,如果nacos了解的不多的朋友可以先了解下nacos的基本用法,传送地址:【Nacos的介绍和使用】

2.关于服务端负载均衡

在这里插入图片描述

单体架构模式下,一个应用会用多个实例,通过nginx做反向代理,将请求过来的数据通过负载均衡算法确定好指定实例进行转发,而nginx是部署是在服务器端的,这种方式就叫做服务端的负载均衡

3.关于客户端负载均衡

在这里插入图片描述
内容中心通过discoveryClient获取到用户中心的所有实例,我们通过手写一个负载均衡的规则确定好请求哪个实例,通过RestTemplate进行请求这样就实现了手写的一个客户端负载均衡器。

4.启动服务

准备2个服务content-center和user-center,user-center准备2个实例,后面使用content-center选择user-center的实例进行调用。可参考:【Nacos的介绍和使用】
在这里插入图片描述

5 content-center 编码

5.1 ShareController.java
package com.ding.contentcenter.controller.content;

import com.ding.contentcenter.domain.dto.content.ShareDTO;
import com.ding.contentcenter.service.content.ShareService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/shares")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareController {
    private final ShareService shareService;
    @GetMapping("/{id}")
    public ShareDTO findById(@PathVariable Integer id){
        return this.shareService.findById(id);
    }
}
5.2 ShareService.java
package com.ding.contentcenter.service.content;

import com.alibaba.nacos.client.naming.utils.ThreadLocalRandom;
import com.ding.contentcenter.dao.share.ShareMapper;
import com.ding.contentcenter.domain.dto.content.ShareDTO;
import com.ding.contentcenter.domain.dto.user.UserDTO;
import com.ding.contentcenter.domain.entity.share.Share;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
    private final ShareMapper shareMapper;
    private final RestTemplate restTemplate;
    private final DiscoveryClient discoveryClient;
    public ShareDTO findById(Integer id){
        Share share = this.shareMapper.selectByPrimaryKey(id);
        Integer userId = share.getUserId();
        List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
        // 获取一个用户中心地址
        /*String targetURL = instances.stream()
                .map(instance -> instance.getUri().toString()+"/users/{id}")
                .findFirst()
                .orElseThrow(()->new IllegalArgumentException("当前没有实例"));*/


        // 所有用户中心的请求地址
        List <String> targetURLS = instances.stream()
                .map(instance -> instance.getUri().toString()+"/users/{id}")
                        .collect(Collectors.toList());

        int i = ThreadLocalRandom.current().nextInt(targetURLS.size());


        log.info("请求的目标地址:{}",targetURLS.get(i));

        UserDTO userDTO = this.restTemplate.getForObject(
                targetURLS.get(i),  // 随机取出一个用户中心的请求地址
                UserDTO.class,userId
        );

        // 消息的装配
        ShareDTO shareDTO = new ShareDTO();
        BeanUtils.copyProperties(share,shareDTO);
        shareDTO.setWxNickname(userDTO.getWxNickname());

        return shareDTO;
    }
}
5.3 多次调用地址

http://localhost:8082/shares/1

5.4 响应结果:
{
	"id": 1,
	"userId": 1,
	"title": "xxx",
	"createTime": "2022-04-17T16:28:34.000+00:00",
	"updateTime": "2022-04-17T16:28:34.000+00:00",
	"isOriginal": false,
	"author": "earnest",
	"cover": "xxx",
	"summary": "",
	"price": 0,
	"downloadUrl": "",
	"buyCount": 1,
	"showFlag": false,
	"auditStatus": "0",
	"reason": "",
	"wxNickname": "212aa"
}
5.6 查看随机请求实例:

在这里插入图片描述
总结:客户端content-center每次生成随机的user-center服务端请求地址进行请求实现了简单的客户端负载均衡。

提示:@LoadBalanced记得注释,这个注解是RestTemplate用来整合Ribbon,不注解以上请求会失效

(此文完)

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-13 12:00:08  更:2022-05-13 12:02:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:22:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码