cache教程 3.HTTP服务器

这篇具有很好参考价值的文章主要介绍了cache教程 3.HTTP服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一节我们实现了单机版的缓存服务,但是我们的目标是分布式缓存。那么,我们就需要把缓存服务部署到多态机器节点上,对外提供访问接口。客户端就可以通过这些接口去实现缓存的增删改查。

分布式缓存需要实现节点间通信,而通信方法常见的有HTTP和RPC。建立基于 HTTP 的通信机制是比较常见和简单的做法。

所以,我们基于 Go 语言标准库 http 搭建 HTTP Server。

net/http标准库

简单实现一个http服务端例子。

type server int

func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World!"))
}

func main() {
	var s server
	http.ListenAndServe("localhost:9999", &s)
}

//下面的是http源码
type Handler interface {
    ServeHTTP(w ResponseWriter, r *Request)
}

在该代码中,创建任意类型 server,并实现 ServeHTTP 方法。

http.ListenAndServe 接收 2 个参数,第一个参数是服务启动的地址,第二个参数是 Handler,实现了 ServeHTTP 方法的对象都可以作为 HTTP 的 Handler。

Cache HTTP 服务端

我们需要创建一个结构体去实现Handler接口,而该结构体应该是有些属性变量来支撑我们做一些事情的。

  • HTTPPool 有 2 个参数,一个是 addr,用来记录自己的地址,包括主机名/IP 和端口。
  • 另一个是 basePath,作为节点间通讯地址的前缀,默认是 /geecache/。比如http://example.com/geecache/开头的请求,就用于节点间的访问。因为一个主机上还可能承载其他的服务,加一段 Path 是一个好习惯。比如,大部分网站的 API 接口,一般以 /api 作为前缀。

HTTPPool实现了ServeHTTP方法,即是Handler接口。 

const defaultBasePath = "/geecache/"

type HTTPPool struct {
	addr     string    //本地IP端口, 比如:"localhost:10000"
	basePath string
}

func (pool *HTTPPool) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	//处理请求和响应,后面会实现的
}

//创建HTTPPool方法
func NewHTTPPool(addr string, basePath string) *HTTPPool {
	return &HTTPPool{
		addr:     addr,
		basePath: basePath,
	}
}

接下来实现最为核心的ServeHTTP方法。

func (pool *HTTPPool) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if !strings.HasPrefix(r.URL.Path, pool.basePath) {
		panic("HTTPPool serving unexpected path: " + r.URL.Path)
	}

	parts := strings.SplitN(r.URL.Path[len(pool.basePath):], "/", 2)

	if len(parts) != 2 {
		http.Error(w, "bad request", http.StatusBadRequest)
		return
	}

	groupName := parts[0]

	group := GetGroup(groupName)
	if group == nil {
		http.Error(w, "no such group: "+groupName, http.StatusNotFound)
		return
	}

	view, err := group.Get(parts[1])
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/octet-stream")
	w.Write(view.ByteSlice())
}

该方法是先判断前缀是否相等,若不相等,返回错误,之后再判断分组名字,再判断key。

url.Path的格式是/<basepath>/<groupname>/<key>。举个例子,r.URL.Path是/geecache/scores/tom,那r.URL.Path[len(pool.basePath):]即是scores/tom,接着就是使用strings.SplitN函数进行分割来获取分组名字和key。

测试

// 缓存中没有的话,就从该db中查找
var db = map[string]string{
	"tom":  "100",
	"jack": "200",
	"sam":  "444",
}

func main() {
	//传函数入参
	cache.NewGroup("scores", 2<<10, cache.GetterFunc(funcCbGet))
	//传结构体入参,也可以
	// cbGet := &search{}
	// cache.NewGroup("scores", 2<<10, cbGet)

	addr := "localhost:10000"
	peers := cache.NewHTTPPool(addr, cache.DefaultBasePath)
	log.Fatal(http.ListenAndServe(addr, peers))
}

// 函数的
func funcCbGet(key string) ([]byte, error) {
	fmt.Println("callback search key: ", key)
	if v, ok := db[key]; ok {

		return []byte(v), nil
	}
	return nil, fmt.Errorf("%s not exit", key)
}

// 结构体,实现了Getter接口的Get方法,
type search struct {
}

func (s *search) Get(key string) ([]byte, error) {
	fmt.Println("struct callback search key: ", key)
	if v, ok := db[key]; ok {
		return []byte(v), nil
	}
	return nil, fmt.Errorf("%s not exit", key)
}

执行 go run main.go,查看效果

cache教程 3.HTTP服务器,# Go实现分布式缓存,http,服务器,golang,分布式

完整代码:https://github.com/liwook/Go-projects/tree/main/go-cache/3-httpServer文章来源地址https://www.toymoban.com/news/detail-828143.html

到了这里,关于cache教程 3.HTTP服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Go语言编写简单的HTTP服务器

    在Go语言中,我们可以使用标准库中的\\\"net/http\\\"包来编写HTTP服务器。下面是一个简单的示例,展示了如何使用Go编写一个基本的HTTP服务器。 go 复制代码 package  main import  ( \\\"fmt\\\"   \\\"net/http\\\"   ) func   main ()  { // 创建一个处理器函数,处理所有对根路径的请求 handler := func (w http.

    2024年01月24日
    浏览(51)
  • Go语言的服务器编程与HTTP_2

    Go语言是一种现代编程语言,由Google的Robert Griesemer、Rob Pike和Ken Thompson于2009年开发。Go语言的设计目标是简单、高效、可靠和易于扩展。它具有垃圾回收、类型安全、并发简单等特点。Go语言的标准库提供了丰富的功能,包括网络、并发、数据结构等。 HTTP/2是一种更新版本的

    2024年02月20日
    浏览(42)
  • 使用Go语言的HTTP客户端和服务器

    使用Go语言进行HTTP客户端和服务器开发是一种高效且强大的方式。Go语言的标准库提供了对HTTP协议的全面支持,使得创建HTTP客户端和服务器变得简单。 首先,让我们来看一下如何创建一个简单的HTTP服务器。在Go中,可以使用 net/http 包来创建HTTP服务器。以下是一个简单的示例

    2024年01月16日
    浏览(50)
  • Windows服务器设置Nginx实现分布式服务

    下载Nginx-1.16.1版本。解压到如下目录: 设置环境变量: 检查版本: 启动nginx.exe ,出现黑框一闪而过,进程中出现如下情况代表启动成功: 下载wiremock-standalone-2.25.1.jar,可以使用Maven配置pom.xml下载。注意下载standalone版本。新建ServerA、ServerB两个目录,分别拷贝jar,新建启动

    2024年02月07日
    浏览(56)
  • Hadoop3.3.5云耀云服务器安装教程-单机/伪分布式配置

    华为云耀云服务器试用领取 领取的试用云耀云服务器在哪 阿里云服务器免费试用领取 Hadoop3.3.5云耀云服务器安装教程-单机/伪分布式配置 阿里云服务器ECS安装图形界面 本篇文章是基于上一篇所配置好的云服务器进行实验软件安装,该系列文章是根据林子雨所讲述的课程就在

    2024年01月21日
    浏览(54)
  • Web服务器实现|基于阻塞队列线程池的Http服务器|线程控制|Http协议

    代码地址:WebServer_GitHub_Addr 摘要 本实验通过C++语言,实现了一个基于阻塞队列线程池的多线程Web服务器。该服务器支持通过http协议发送报文,跨主机抓取服务器上特定资源。与此同时,该Web服务器后台通过C++语言,通过原生系统线程调用 pthread.h ,实现了一个 基于阻塞队列

    2024年02月07日
    浏览(65)
  • Go重写Redis中间件 - GO实现TCP服务器

    首先新建一个项目go-redis,将config和lib包放到项目中,config.go用来解析配置,比如端口、功能、DB数;lib包有两个文件夹,分别是logger和sync,其中logger.go是一个日志框架,sync包中的bool.go包装了atomic操作,因为atomic原生没有bool类型,所以将uint32类型改造成bool型的atomic,wait.g

    2024年02月15日
    浏览(83)
  • 【项目实现】自主HTTP服务器

    本项目实现的是一个HTTP服务器,项目中将会通过基本的网络套接字读取客户端发来的HTTP请求并进行分析,最终构建HTTP响应并返回给客户端。 HTTP在网络应用层中的地位是不可撼动的,无论是移动端还是PC端浏览器,HTTP无疑是打开互联网应用窗口的重要协议。 该项目将会把

    2024年02月19日
    浏览(40)
  • 开源轻量级分布式文件系统FastDFS本地部署并实现远程访问服务器

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月04日
    浏览(73)
  • HTTP代理服务器的设计与实现

    一、前言 这个实验挺麻烦的,本来就只有一周时间,等我开始着手准备的时候,也就剩两三天了,也没什么心情自己重头开打代码,于是就找了大佬的代码借鉴了一下,在验收之前处理完了所有的bug。不过,我觉得这个实验还是最好自己慢慢想,想到问题再去搜索,能收获到

    2023年04月13日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包