> ### 线上服务器的部署
* 线上服务器不需要安装Go的开发环境, 也不用将源码上传上去
* 只需要找一台和线上服务器相同的操作系统, 安装GO环境, 上传源码, 生成可执行文件, 将生成的可执行文件放到线上服务器(避免线上服务器出现漏洞时, 被人盗窃源码, 找出漏洞, 进一步遭受攻击)
* 将本地可执行文件上传到线上服务器时, 如果用到相对路径, 那线上服务器放可执行文件的文件, 要和本地生成可执行文件的位置相同
> ### 准备工作
* 说明: 用supervisor
来管理不同服务间的单个或多个实例, 用nginx负载均衡到多个实例
* 定义三个服务, 端口为9001~9003, 将生成的可执行文件放到线上服务器(名称http-login1, http-login2, http-login3)
~~~
package main
import (
"net/http"
"fmt"
)
func login(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
}
func main() {
http.HandleFunc("/login", login)
if err := http.ListenAndServe(":9001", nil); err != nil {
fmt.Println(err)
}
}
~~~
> ### 安装supervisor
进程管理工具
* supervisord:运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。
* supervisorctl:是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。
~~~
[root@VM_0_17_centos gopath]# yum install supervisor
[root@VM_0_17_centos gopath]# systemctl start supervisord.service
[root@VM_0_17_centos gopath]# vim /etc/supervisord.conf
//systemctl restart supervisord.service
(修改完配置没生效的话重启下)
//找到 ;[program:theprogramname]栏目, 在下一个栏目前添加
//相关配置说明可以看最下方的相关阅读
[program:golang-http-login1]
command=/var/local/gopath/src/http-login1
autostart=true
autorestart=true
startsecs=10
[program:golang-http-login2]
command=/var/local/gopath/src/http-login2
autostart=true
autorestart=true
startsecs=10
[program:golang-http-login3]
command=/var/local/gopath/src/http-login3
autostart=true
autorestart=true
startsecs=10
[root@VM_0_17_centos gopath]# supervisorctl update
golang-http: stopped
golang-http: removed process group
golang-http-login1: added process group
golang-http-login2: added process group
golang-http-login3: added process group
#根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
//supervisorctl update
#启动进程
//supervisorctl start golang-http-login1
#重启进程
//supervisorctl restart golang-http-login1
#停止进程
//supervisorctl stop golang-http-login1
#启动全部进程
//supervisorctl start all
#设置开机启动
//systemctl enable supervisord.service
~~~
> ### 查看服务状态
~~~
[root@VM_0_17_centos gopath]# supervisorctl status
golang-http-login1 RUNNING pid 15112, uptime 0:01:03
golang-http-login2 RUNNING pid 15113, uptime 0:01:03
golang-http-login3 RUNNING pid 15114, uptime 0:01:03
[root@VM_0_17_centos src]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2897/sshd
tcp6 0 0 :::9001 :::* LISTEN 15112/http-login1
tcp6 0 0 :::9002 :::* LISTEN 15113/http-login2
tcp6 0 0 :::9003 :::* LISTEN 15114/http-login3
~~~
> ### 访问服务
![img](https://box.kancloud.cn/f49ea3043426d6eb2938187c90ad00a6_675x480.jpg)
> ### 图形界面(修改inet\_http\_server模块)
![img](https://box.kancloud.cn/5d409595ea44710696632c8c40135f57_618x88.jpg)
![img](https://box.kancloud.cn/924a1d21f86daa902fad7fff904b1a8f_1307x310.jpg)
> ### 配置日记(点Name的时候可以看到对应终端输出)
~~~
[program:golang-http-login3]
command=/var/local/gopath/src/http-login3
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/usr/local/runtime.log
~~~
> ### nginx负载均衡
~~~
upstream golang-http-login
{
server 123.207.79.96:9001;
server 123.207.79.96:9002;
server 123.207.79.96:9003;
}
server
{
listen 9000;
location / {
proxy_pass http://golang-http-login;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
~~~
> ### 相关阅读
* [supervisor的安装与简单介绍](https://www.cnblogs.com/Dicky-Zhang/p/6171954.html)
- 第一序 入门教程(一)
- 1.1环境配置
- 1.1 环境配置(补充:Linux下安装)
- 1.1 环境配置(补充:线上部署)
- 1.2 开发工具GoLand
- 1.3 准备工作
- 1.4 第一个应用程序 Hello World
- 1.4 补充 go get github 超时
- 第二序 入门教程(二)
- 2.1 语法结构
- 2.2 常量, 变量
- 2.2.1 命名规则
- 2.2.2 变量
- 2.2.2 变量(补充:类型推断的好处)
- 2.2.2 变量(补充:泛型)
- 2.2.3 常量
- 2.2.4 iota
- 2.2.5 Unicode字符编码
- 2.2.6 GBK 转 UTF8
- 2.3 条件语句
- 2.3.1 判断语句 if
- 2.3.2 选择语句 switch
- 2.3.3 循环语句 for
- 2.3.4 遍历 range
- 2.3.5 跳转语句 goto, break, continue
- 2.3.6 for 和 for range区别
- 2.4 数组, 切片, 集合, 通道
- 2.4.1 make, len, cap, new, nil
- 2.4.1 make, len, cap, new, nil (补充:nil)
- 2.4.2 数组 array
- 2.4.3.1 切片 slice - 1
- 2.4.3.2 切片 slice - 2
- 2.4.3.3 slice list ring
- 2.4.4 集合 map
- 2.4.5 goroutine
- 2.4.6 channel
- 2.5 函数, 结构, 方法, 接口
- 2.5.1 函数 function
- 2.5.2 结构 struct
- 2.5.3 方法 method
- 2.5.4 接口 interface
- 2.5.5 Go是面向对象的语言吗?
- 2.5.6 json序列化和反序列化
- 2.5.7 T和指针T
- 2.6 defer, panic, recover
- 2.6.1 defer
- 2.6.2 painc, recover
- 2.7 指针
- 2.7 指针(补充: 可寻址和不可寻址)
- 2.8 反射
- 第三序 相关阅读
- 3.1 相关阅读1
- 3.2 相关阅读2
- 3.3 相关阅读3
- 第四序 性能分析和调试工具
- 4.1 pprof工具介绍
- 4.2 CPU信息采集
- 4.3 Heap信息采集
- 4.4 Http信息采集
- 4.5 单元测试(功能测试)
- 4.6 基准测试(压力测试/性能测试)
- 4.7 示例测试(example)
- 4.8 gdb调试
- 第五序 网络编程
- 5.1 http请求和响应
- 5.2 socket
- 5.2.1 概念
- 5.2.2 服务端
- 5.2.3 客户端
- 5.3 WebSocket
- 5.3.1 第一版
- 5.3.1.1 服务端
- 5.3.1.2 客户端
- 5.3.1.3 相关阅读
- 5.3.2 服务端
- 5.3.3 客户端
- 5.3.4 nginx配置
- 5.3.5 修改版
- 5.3.5.1 草稿 - 1
- 5.3.5.2 草稿 - 2
- 5.3.5.3 草稿 - 3
- 5.3.5.4 服务端
- 5.3.5.5 客户端
- 5.4 打印客户端头部信息
- 第六序 算法
- 6.1 查找
- 6.1.1 二分查找
- 6.2 排序
- 6.2.1 交换排序 - 冒泡排序
- 6.2.2 插入排序 - 直接插入排序
- 6.2.3 插入排序 - 希尔排序
- 6.2.4 交换排序 - 快速排序
- 6.3 算法求解应用
- 第七序 微服务
- 7.1 相关阅读
- 7.2 gRPC
- 7.2.1 准备工作
- 7.2.2 编译.proto文件
- 7.2.3 gRPC服务端
- 7.2.4 gRPC客户端
- 7.3 micro/micro
- 7.3.1 服务发现
- 7.3.2 安装consul
- 7.3.3 准备工作
- 7.3.4 服务端
- 7.3.5 客户端
- 7.3.6 默认的服务发现
- 7.3.7 文档阅读
- 7.4 protobuf序列化
- 第八序 Web
- 8.1 视图模板
- 8.1.1 main.go
- 8.1.2 login.html
- 8.2 原生留言板
- 8.2.1 原生sql
- 8.2.1.1 main.go
- 8.2.1.2 view
- 8.2.1.2.1 index.html
- 8.2.1.2.2 create.html
- 8.2.2 sqlx
- 8.3 Gin框架
- 第九序 数据库
- 9.0 资料收集
- 9.1 Redis数据库 (gomodule/redigo)
- 9.1.1 介绍
- 9.1.2 消息队列
- 9.2 Redis数据库(go-redis/redis)
- 第十序 日记
- 10.1 SimplePanic
- 10.2 第一版日记库
- 10.2.1 winnielog
- 10.2.2 使用
- 第十一序 中间键
- 11.0 资料收集
- 11.1 NSQ
- 11.2 zookeeper
- 11.3 kafka
- 第十二序 加密
- 12.1 Token
- 12.2 SHA1
- 2.3 RSA + AES
- 第十三序 分布式锁
- 第十四序 标准库练习
- container/list
- 链表
- container/ring
- 环形链表
- context
- flag (获取命令行参数)
- io
- strconv
- sync
- 为什么需要锁?
- 互斥锁
- 读写锁
- 条件变量
- 计数器
- 并发安全字典
- 自制并发安全字典
- 官方并发安全字典
- 连接池
- sync/atomic
- 原子操作
- 第十五序 其它内容
- 文件读写
- 工作池
- 第十六序 相关阅读