使用一个iris框架的简单demo
main.go
package main
import (
"github.com/kataras/iris/v12"
"iris-demo/router/api"
)
func main() {
app := iris.New()
//路由
app.Get("/version", func(context iris.Context) {
app.Logger().Info("请求成功")
data := make(map[string]interface{})
data["version"] = "1.1.1"
data["status"] = http.StatusOK
context.JSON(data)
})
app.Run(iris.Addr(":1213"))
}
nginx配置
upstream web_servers{
server 127.0.0.1:1213;
server 127.0.0.1:1511;
}
server {
listen 8000;
server_name iris.app.com;
access_log /opt/homebrew/etc/nginx/logs/iris.app.com.log;
error_log /opt/homebrew/etc/nginx/logs/iris.app.com.error.log;
location / {
#proxy_pass http://127.0.0.1:1213;
proxy_pass http://web_servers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
再将go项目复制一份然后端口修改为1213
启动两个项目
访问 接口
http://iris.app.com:8000/version
负载均衡的模式
- 轮询
每个请求按时间顺序逐一分配到不同的后端服务器,也就是说第一次请求分配到第一台服务器上,第二次请求分配到第二台服务器上,如果只有两台服务器,第三次请求继续分配到第一台上,这样循环轮询下去,也就是服务器接收请求的比例是 1:1, 如果后端服务器down掉,能自动剔除。轮询是默认配置,不需要太多的配置。
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
- 热备
假设有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:主服务器突然A挂了,服务器处理请求的顺序:切换到备用服务器B。
upstream web_servers {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
- 权重模式
根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:A-B-B。
upstream web_servers {
server localhost:8081 weight=1;
server localhost:8082 weight=2;
}
- ip_hash
这样每个ip地址固定访问一个后端服务器,可以解决session的问题
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
- fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个配置是为了更快的给用户响应。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
-url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,hash_method是使用的hash算法
upstream backend {
hash_method crc32;
hash $request_uri;
server localhost:8080;
server localhost:8081;
}