免费找人网站 优帮云/品牌营销策划案例ppt
经过了前两个章节的学习,分布式缓存的存储与新增我们已经实现了,并且对其做了高可用处理。本章节我们剥离和缓存强相关的逻辑,开始搭建一个HTTP服务器,毕竟缓存数据库搭建完之后别人没法访问也是没有用处的。这一章节我们重点学习go原生的HTTP标准库。
前文链接
手撕分布式缓存之一 | 定义缓存结构体与实现底层功能函数
手撕分布式缓存之二 | 互斥锁的优化
系列目录
- (1)HTTP Server 的搭建
- (1.1)前言
- (1.2)HTTP 核心数据结构的构造及初始化函数的实现
- (1.3)单节点HTTP Server核心Get方法的实现
- (1.4)代码实现及解释
(1)HTTP Server 的搭建
(1.1)前言
通过本篇文章可以学习到 go 语言原生的 HTTP Server 的使用,虽然不像成熟的Web框架那样,方法、机制都很完全,但是通过学习底层的功能实现,对于我们整体项目结构搭建是非常重要的。如果将go语言、go衍生技术(gin,MiddleWare等)等一系列相关的技术看做一整个项目结构,那么哪些技术我们要实现哪些功能呢?这些功能做出来实际上使用的人有多少呢?能给我们带来多少价值?这些问题具象来看的话是与我们开发人员息息相关的,因此我们有必要去学习这种看似吃力不讨好实际却会给我们带来很深远的收益的知识。
(1.2)HTTP 核心数据结构的构造及初始化函数的实现
go语言的HTTP服务为我们提供了 ListenAndServe(addr string, handler Handler) error 这个方法,handler是HTTP服务的主体处理函数,任何实现了 ServeHTTP 方法的对象都可以作为handler的值传递给ListenAndServe 方法。该方法除了handler参数还需要接收一个addr,用来标识服务启动的地址和端口,这个也是服务启动之后其他请求者访问的域名。因此我们可以定义一个数据结构HTTPPool,里面有属性 self string 和 basePath string,self是就是上面说的addr,basePath是用于区分服务器上其他服务的请求Url,避免重复,比如我们可以默认 /_geecache/ 作为我们请求URI(统一资源标识符)第一级的值。
(1.3)单节点HTTP Server核心Get方法的实现
在1.2小节我们解释了HTTP的核心数据结构,这一小节我们讨论下HTTP服务的核心服务ServeHTTP。在前言中我们概括性的讨论了go的HTTP原生包(下称HTTP原生包)与成熟框架是有区别的,从相关的代码中(gin和geeCache的相关实现中)了解到,HTTP原生包对于方法的直接操作只有ServeHTTP方法,也就是说如果只使用HTTP原生包构建HTTP Server,所有的请求都是由 ServeHTTP 方法首先处理的,而例如Gin框架,可以将方法绑定在URI上,在路由注册之后,可以通过URI访问与其绑定的功能方法;从HTTP原生包来看,我能想到的实现Gin这一功能的方法是,在ServeHTTP方法中通过判断请求的URI的值与if语句过滤来实现不同的URI访问不同的功能函数。
HTTP Get方法的实现并不复杂,主要流程还是调用下层我们封装的Get方法(如何封装的可以阅读 分布式系列 的前两章内容)。
(1.4)代码实现及解释
自定义默认的URI第一级的值 和 定义HTTP的核心数据结构
- 自定义URI的第一级的值为 _geecache ,使用下划线开头的值用作区分重复的可能性更低,因此我们使用下划线开头。
// this is the defaultPath, user it to distinguish geeCache Project and other Project.
const defaultBasePath = "/_geecache/"type HTTPPool struct {// this peer's base URL, e.g. self is "https://example.net:8000"self stringbasePath string
}// NewHTTPPool initializes an HTTP pool of peers.
func NewHTTPPool(self string) *HTTPPool {return &HTTPPool{self: self,basePath: defaultBasePath,}
}
核心功能Get函数的实现
- 在通过URI获取GroupName之前,首先判断URI的第一级值是否与defaultPath一致
- 通过strings.SplitN根据 字符 \ 进行截取,并获得groupName 和 key
- 调用下层已经实现的函数功能,以从中获取key对应的value
- 使用 w.Write(view.ByteSlice()),返回给 请求者一个 copy的对象,避免返回给请求者原对象后遭到恶意修改吗,view.ByteSlice() 的具体实现在上一章节有具体说明和实现 。
// ServeHTTP handle all http requests
func (p *HTTPPool) ServeHTTP(w http.ResponseWriter, r *http.Request) {// 1. judge the first layer of uri is defaultBasePath.if !strings.HasPrefix(r.URL.Path, p.basePath) {panic("HTTPPool serving unexpected path: " + r.URL.Path)}// begin from the defaultPath, then start to split the rest of uri and get groupName from this operationparts := strings.SplitN(r.URL.Path[len(p.basePath):], "/", 2)// 2. judge the structure have two layers, first is groupName, second is key// the structure is /<basepath>/<groupname>/<key>if len(parts) != 2 {http.Error(w, "bad request", http.StatusBadRequest)return}// 3. get GroupName and keygroupName := parts[0]key := parts[1]// 4. call Underlying interface to get Groupgroup := GetGroup(groupName)if group == nil {http.Error(w, "no such group: "+groupName, http.StatusNotFound)return}// 5. call Underlying interface to get key-valueview, err := group.Get(key)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}w.Header().Set("Content-Type", "application/octet-stream")// return key-valuew.Write(view.ByteSlice())
}
HTTP Server 服务的启动(main函数的编写),参数的声明
- db 用于验证GetterFunc方法是否生效。
- 2<<10是二进制左移10位,对应的十进制为4096。
- http.ListenAndServe 是服务的启动代码。
// not necessary, just is a test demo in here
var db = map[string]string{"Tom": "630","Jack": "589","Sam": "567",
}func main() {// 2<<10 means Binary Left Shift 10 bits, its value is 2048// GetterFunc can ignore the data's addition, cause it initialize the group scores, and state the maxBytesgeecache.NewGroup("scores", 2<<10, geecache.GetterFunc(func(key string) ([]byte, error) {log.Println("[SlowDB] search key", key)if v, ok := db[key]; ok {return []byte(v), nil}return nil, fmt.Errorf("%s not exist", key)}))addr := "localhost:9999"peers := geecache.NewHTTPPool(addr)log.Println("geecache is running at", addr)// log the ListenAndServe's errorlog.Fatal(http.ListenAndServe(addr, peers))
}
相关文章:

手撕分布式缓存---HTTP Server搭建
经过了前两个章节的学习,分布式缓存的存储与新增我们已经实现了,并且对其做了高可用处理。本章节我们剥离和缓存强相关的逻辑,开始搭建一个HTTP服务器,毕竟缓存数据库搭建完之后别人没法访问也是没有用处的。这一章节我们重点学习…...

2. PyTorch——Tensor和Numpy
2.1Tensor和Numpy Tensor和Numpy数组之间具有很高的相似性,彼此之间的互操作也非常简单高效。需要注意的是,Numpy和Tensor共享内存。由于Numpy历史悠久,支持丰富的操作,所以当遇到Tensor不支持的操作时,可先转成Numpy…...

C#随笔 | List.Sort()使用小计
1、使用List.Sort()对基本数值类型数据进行排序 案例:对存放int数据的List进行排序 其实C#中的List的Sort函数中的比较函数CompareTo有三种结果 1, -1 ,0分别代表大,小,相等。默认List的排序是升序排序。 举个例子:在比较函数Co…...

【WebRTC】用WebRTC做即时视频聊天应用
【配套项目源码】 打开即用,设置一个免费的Agora账户就可以实现视频电话。非常好的WebRTC学习和应用项目。 用VSCode打开即可。 https://download.csdn.net/download/weixin_41697242/88630069 【什么是WebRTC?】 WebRTC是一套基于JS的API,能够建立端对端的直接通信,实…...

GPT-4.5 要来了!谷歌大模型 Gemini 确实给够压力
GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…...

美易官方:加密资产将破坏金融稳定,无法取消就要加强监管
在近日的一次公开演讲中,国际货币基金组织(IMF)总裁格奥尔基耶娃表示,如果世界各国大量采用加密资产,将会对金融稳定造成破坏,并且无法取消这种破坏,因此需要加强对加密资产的监管。我们的目标是…...

一文读懂Java中的设计模式——适配器模式,对于兼容不同系统特别适用!
适配器模式概念 适配器(变压器)模式:这种模式的核心是当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类…...

2023年国内外评分前十的项目管理软件推荐
1、进度猫 作为国产项目进度管理软件新秀,是一款以甘特图为向导的轻量级可视化在线项目管理工具 通过甘特图/思维导图为核心进行项目管理计划,使项目经理能够计划、可视化目标和里程碑、设置任务和到期日期。 甘特图进行有序的项目规划,及…...

3.electron之vue3.0的桌面应用程序
如果可以实现记得点赞分享,谢谢老铁~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、…...

数字图像处理(实践篇)二十二 使用opencv进行人脸、眼睛、嘴的检测
目录 1 xml文件 2 涉及的函数 3 实践 使用opencv进行人脸、眼睛、嘴的检测。 1 xml文件 方法① 下载 地址:https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_default.xml文件 对着Raw右键,选择“链接另存为”,选择代码所…...

旺店通·企业奇门对接打通金蝶云星空查询仓库接口与仓库新增接口
旺店通企业奇门对接打通金蝶云星空查询仓库接口与仓库新增接口 接通系统:旺店通企业奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企…...

PostgreSQL获取以前的时间
要在 PostgreSQL 中获取前10秒的数据,可以使用以下查询语句: SELECT * FROM your_table WHERE timestamp_column > now() - interval 10 seconds;要获取前 10 分钟的数据,可以使用以下查询语句: SELECT * FROM your_tabl…...

逆向获取某音乐软件的加密(js逆向)
本文仅用于技术交流,不得以危害或者是侵犯他人利益为目的使用文中介绍的代码模块,若有侵权请联系作者更改。 老套路,打开开发者工具,直接开始找到需要的数据位置,然后观察参数,请求头,cookie是…...

C语言—每日选择题—Day42
第一题 1. 下面程序输出的结果是() #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A:2 B:随机值 C:都不是 D:15 答案及解析 D p…...

jsp文件引用的css修改后刷新不生效问题
问题 在对 JavaWeb 项目修改的过程中,发现修改了 jsp 文件引入的 css 文件的代码后页面的样式没有更新的问题。 原因 导致这个问题的原因可能是因为浏览器缓存的问题。 解决方法 下面介绍两种解决方法,供大家参考: 1、给 link 标签的 c…...

SpringBoot运维中的高级配置
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…...

Centos7下OpenLDAP安装
openldap server 安装配置 openldap server 安装 # yum 安装相关包 $ sudo yum -y install openldap openldap-servers openldap-devel compat-openldap openldap-clients# 复制一个默认配置到指定目录下,并授权,这一步一定要做,然后再启动服务,不然生产密码时会报错 # Op…...

2036开关门,1109开关门
一:2036开关门 1.1题目 1.2思路 1.每次都是房间号是服务员的倍数的时候做处理,所以外层(i)枚举服务员1~n,内层(j)枚举房间号1~n,当j % i0时,做处理 2.这个处理指的是&…...

最简单的pixel刷机和安装面具、lsposed
一 下载手机对应的系统 1,手机usb连接然后重启进入Fastboot模式:adb reboot bootloader2,找到你下载的系统,Windows 系统 直接运行 flash-all.bat上图 :左边就是安卓11和12的系统,右边是对应的手机型号 下…...

深度学习第5天:GAN生成对抗网络
☁️主页 Nowl 🔥专栏 《深度学习》 📑君子坐而论道,少年起而行之 文章目录 一、GAN1.基本思想2.用途3.模型架构 二、具体任务与代码1.任务介绍2.导入库函数3.生成器与判别器4.预处理5.模型训练6.图片生成7.不同训练轮次的结果对比 一…...

从零开始搭建企业管理系统(七):RBAC 之用户管理
RBAC 之用户管理 创建表(Entity)用户表角色表权限表用户角色表关系注解ManyToMany 角色权限表 接口开发UserControllerUserServiceUserServiceImplUserRepository 问题解决update 更新问题懒加载问题JSON 循环依赖问题 根据上一小结对表的设计࿰…...

phpstudy搭建WordPress教程
一、phpstudy新建配置WordPress 打开phpstudy,启动Apache(或者Nginx)和MySQL服务 来到数据库部分,点击[创建数据库],填写新建数据库的名称,用户名以及密码,完成后点击确认 来到网站部分&#x…...

typedef的使用
在C语言中,有一个关键字叫做typedef,有些人对此感到很疑惑。不熟悉此知识的同学都会对编程失去细心,直接劝退(因为之前我就是这样)。、 因为好不容易认识了C语言中所有的关键字(就是类型吧,像啥…...

服务器系统启动卡logo问题解决分析
系统版本:Kylin-4.0.2-server-sp4-20200808.J1-57s-xxc_01-20210112-x86_64 问题:系统启动一直卡在麒麟logo那里,进不去系统。在gurb里去掉系统启动参数quiet和splash,发现启动卡在如下界面。 排查:开始怀疑是掉电导致…...

Linux NAPI ------------- epoll边缘触发模式
Linux处理网络数据包的一般流程 分组到达内核的时间是不可预测的。所有现代的设备驱动程序都使用中断来通知内核有分组到达。 网络驱动程序对特定于设备的中断设置了一个处理例程,因此每当该中断被引发时(即分组到达),内核都调用…...

使用poi-tl填充word模板,并转化为pdf输出
后端 依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version> </dependency>Word版本 Word版本填充代码 // 培训详情HashMap<String, Object> textMap new Ha…...

计算机视觉-机器学习-人工智能 顶会会议召开地址
计算机视觉-机器学习-人工智能 顶会会议召开地址 最近应该要整理中文资料的参考文献,很多会议文献都需要补全会议地点(新国标要求)。四处百度感觉也挺麻烦的,而且没有比较齐全的网站可以搜索。因此自己整理了一下计算机视觉-机器…...

GAN的原理分析与实例
为了便于理解,可以先玩一玩这个网站:GAN Lab: Play with Generative Adversarial Networks in Your Browser! GAN的本质:枯叶蝶和鸟。生成器的目标:让枯叶蝶进化,变得像枯叶,不被鸟准确识别。判别器的目标&…...

什么是POM设计模式?
为什么要用POM设计模式 前期,我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本(以快递100网站登录举栗): import timefrom selenium import webdriver from selenium.webdriver.common.by import Bydriver …...

没有数据线,在手机上查看电脑备忘录怎么操作
在工作中,电脑和手机是我最常用的工具。我经常需要在电脑上记录一些重要的工作事项,然后又需要在手机上查看这些记录,以便随时了解工作进展。但是,每次都需要通过数据线来传输数据,实在是太麻烦了。 有一次࿰…...