ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Beego 源码分析

2020-11-23 17:01:00  阅读:192  来源: 互联网

标签:分析 Beego Cfg app Server 源码 time server Listen


Beego.Run()

首先我们了解,使用beego框架来新建项目bee run后,会生成一个main.go函数,并通过beego.Run来运行服务

beego.Run()

之后我们通过ctrl+点击进入他的源代码:beego.go中的Run()

func Run(params ...string) {

	if len(params) > 0 && params[0] != "" {
		BeeApp.Run(params[0])
	}
	BeeApp.Run("")
}

可以看到,是根据参数设置,调用beeapp.Run()函数实现,所以我们再次找到它的源代码:
我们首先看到BeeApp是一个HttpServer:

var (
	// BeeApp is an application instance
	// If you are using single server, you could use this
	// But if you need multiple servers, do not use this
	BeeApp *HttpServer
)
type HttpServer struct {
	Handlers *ControllerRegister
	Server   *http.Server
	Cfg      *Config
}
  • 然后我们分析beeapp的Run函数:首先定义了一个坚挺的端口地址,如果设定为空,则调用用户配置文件中的默认地址进行监听
	initBeforeHTTPRun()

	app.initAddr(addr)

	addr = app.Cfg.Listen.HTTPAddr

	if app.Cfg.Listen.HTTPPort != 0 {
		addr = fmt.Sprintf("%s:%d", app.Cfg.Listen.HTTPAddr, app.Cfg.Listen.HTTPPort)
	}
  • 之后运行监听,首先定义Handler和超时时间、错误等信息,然后运行监听:

  • Handler初始化:

app.Server.Handler = app.Handlers
	for i := len(mws) - 1; i >= 0; i-- {
		if mws[i] == nil {
			continue
		}
		app.Server.Handler = mws[i](app.Server.Handler)
	}
	app.Server.ReadTimeout = time.Duration(app.Cfg.Listen.ServerTimeOut) * time.Second
	app.Server.WriteTimeout = time.Duration(app.Cfg.Listen.ServerTimeOut) * time.Second
	app.Server.ErrorLog = logs.GetLogger("HTTP")

  • 运行监听:(分析见注释)
	// run graceful mode
	if app.Cfg.Listen.Graceful {
		httpsAddr := app.Cfg.Listen.HTTPSAddr	//根据我们之前设定的端口地址来设定监听
		app.Server.Addr = httpsAddr
		if app.Cfg.Listen.EnableHTTPS || app.Cfg.Listen.EnableMutualHTTPS {//判断服务是否开启
			go func() {//运行一个进程来监听http请求
				time.Sleep(1000 * time.Microsecond)
				if app.Cfg.Listen.HTTPSPort != 0 {
					httpsAddr = fmt.Sprintf("%s:%d", app.Cfg.Listen.HTTPSAddr, app.Cfg.Listen.HTTPSPort)
					app.Server.Addr = httpsAddr
				}//开启服务
				server := grace.NewServer(httpsAddr, app.Server.Handler)
				server.Server.ReadTimeout = app.Server.ReadTimeout//重新设置超时时间
				server.Server.WriteTimeout = app.Server.WriteTimeout//重新设置超时时间
				if app.Cfg.Listen.EnableMutualHTTPS {
					if err := server.ListenAndServeMutualTLS(app.Cfg.Listen.HTTPSCertFile,
						app.Cfg.Listen.HTTPSKeyFile,
						app.Cfg.Listen.TrustCaFile); err != nil {
						logs.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
						time.Sleep(100 * time.Microsecond)
					}
				} else {
					if app.Cfg.Listen.AutoTLS {
						m := autocert.Manager{
							Prompt:     autocert.AcceptTOS,
							HostPolicy: autocert.HostWhitelist(app.Cfg.Listen.Domains...),
							Cache:      autocert.DirCache(app.Cfg.Listen.TLSCacheDir),
						}
						app.Server.TLSConfig = &tls.Config{GetCertificate: m.GetCertificate}
						app.Cfg.Listen.HTTPSCertFile, app.Cfg.Listen.HTTPSKeyFile = "", ""
					}
					if err := server.ListenAndServeTLS(app.Cfg.Listen.HTTPSCertFile, app.Cfg.Listen.HTTPSKeyFile); err != nil {//监听http请求
						logs.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
						time.Sleep(100 * time.Microsecond)//每次监听的时间间隔
					}
				}
				endRunning <- true
			}()
		}

Http.ListenAndServer如下:

func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}
  • 可以看处beego也是通过调用ListenandServer来实现监听,这与http的调用接口相同
  • app.Server是系统*http.Server,将Handlers传入app.Server.Handler即是构建了一个http.ListenAndServe中的server,然后在接下来调用server.ListenAndServer

标签:分析,Beego,Cfg,app,Server,源码,time,server,Listen
来源: https://blog.csdn.net/weixin_43960457/article/details/109998338

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有