go语言响应http请求的简单介绍( 二 )


随便 random 一个整数作为索引 , 然后取对应的地址即可,实现比较简单 。
具体代码
使用curIndex进行累加计数,一旦超过 rss 数组的长度,则重置 。
具体代码
轮询带权重,如果使用计数递减的方式,如果权重是5,1,1那么后端 rs 依次为a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端会瞬间压力过大;参考 nginx 内部的加权轮询,或者应该称之为平滑加权轮询 , 思路是:
后端真实节点包含三个权重:
操作步骤:
具体代码
一致性 hash 算法 , 主要是用于分布式 cache 热点/命中问题;这里用于基于某 key 的 hash 值,路由到固定后端 , 但是只能是基本满足流量绑定,一旦后端目标节点故障,会自动平移到环上最近的那么个节点 。
实现:
具体代码
每一种不同的负载均衡算法,只需要实现添加以及获取的接口即可 。
然后使用工厂方法 , 根据传入的参数,决定使用哪种负载均衡策略 。
具体代码
【go语言响应http请求的简单介绍】作为网关,中间件必不可少 , 这类包括请求响应的模式,一般称作洋葱模式,每一层都是中间件 , 一层层进去,然后一层层出来 。
中间件的实现一般有两种 , 一种是使用数组,然后配合 index 计数;一种是链式调用 。
具体代码
http.ServeMuxHTTP协议全称超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和WWW服务器之间通信的规则,通过Internet传送WWW文档的数据传送协议 。
Web服务是HTTP协议的一个服务 , HTTP协议承载在TCP协议之上 。Web服务工作流程
基于HTTP构建的服务标准模型包括客户端和服务端,HTTP请求从客户端发出,服务端接收到请求后进行处理,然后将响应返回给客户端 。
HTTP服务端核心工作是如何接收来自客户端的请求,并向客户端返回响应 。当HTTP服务器接收到客户端请求时,首先会进入路由模块,路由又称为服务复用器(Multiplexer),路由的工作在于请求找到对应的处理器(Handler),处理器对接收到的请求进行对应处理后,构建响应并返回给客户端 。
Go语言通过引入 net/http 包来实现HTTP网络访问,并提供HTTP客户端和服务端的实现 。
创建HTTP服务需经过2个阶段
例如:创建HTTP服务
理解HTTP服务关键点在于路由器和处理器
服务复用器
处理器
http.ServeMux 内部使用一个 map 映射来保存所有处理器,http.muxEntry 是一个多路复用器入口实体 。
可以发现在 http.muxEntry 字段中存在着 http.Handler 接口类型的 h
虽然 http.ServeMux 也实现了 http.ServerHTTP() 算得上是一个 http.Handler ,但 http.ServeMux 的 http.ServeHTTP() 并非用来处理请求和响应,而是用来查找注册路由对应的处理器 。
当 http.ServeMux 路由器设置路由规则后 , 会通过它实现的 ServeHTTP() 完成请求的分发 。当路由器接收到请求后若请求的URI为 * 则会关闭连接 , 否则会调用自身的 Handler() 来获取对应路由的处理器 , 最终通过调用 h.ServeHTTP(w,r) 实现对应路由的实现逻辑 。
路由器会根据用户请求的URL路径去匹配自身存储的在 map 中的 handler ,最终调用匹配到的 handler 的 ServeHTTP() 以实现执行对应路由的处理函数 。
创建 http.ServeMux 实例的方式有两种
http.DefaultServeMux 是默认的 http.ServeMux  , 会随着 net/http 包初始化而被自动初始化 。
当 http.ListenAndServe() 在没有提供其他处理器的情况下 , 即它的入参 handler 为 nil 时内部会使用 http.DefaultServeMux。

推荐阅读