IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> go web项目开发第一天 -> 正文阅读

[大数据]go web项目开发第一天

golang web项目脚手架搭建

1、CLD分层:
a、controller层:控制层,服务的入口,负责处理路由,参数校验,请求转发。
b、logic层:业务逻辑层。通过了controller层到达这里的所有请求参数一定是合法的。业务逻辑和业务流程都在这一层。
c、dao层:主要负责与数据、存储。将下层存储以函数形式、接口形式暴露给logic层。

2、其他层
a、logger层:存放日志
b、model层:程序功能实现文件、以及数据库sql创建表语句等。
c、setting层:配置文件
d、routes层:路由层

初始化脚手架
1、main函数每次启动项目都要初始化配置、日志文件logger、mysql文件、redis、以及路由的启动

func main() {
	if err := setting.Init();err != nil{
		//错误语句
		return
	}
	
	if err := logger.Init(setting.Conf.LogConfig); err!=nil{
		//错误语句
		return
	}
	defer zap.L().Sync() //此处为main函数结束后释放日志文件的语句
	if err := mysql.Init(setting.Conf.MySQLConfig); err != nil{
		//错误语句
		return
		}
	defer mysql.Close() //main函数结束后释放 mysql连接,否则可能会放生内存泄漏
	if err := redis.Init(setting.Conf.RedisConfig); err != nil{
	//错误语句
	return
	}
	defer redis.Close() //原理同上
	if err := snowflake.Init(setting.Conf.StartingTime,setting.Conf.MachineID);err!=nil{
	}
	
	r := routes.SetUp() //启动路由
	srv := &http.Server{
		Addr: fmt.Sprintf(":%d", viper.GetInt("app.port")),
		Handler: r,
	}//初始化服务器定义
	//以下为平滑启动
	go func() {
		// 开启一个goroutine启动服务
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err)
		}
	}()

	// 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时
	quit := make(chan os.Signal, 1) // 创建一个接收信号的通道
	// kill 默认会发送 syscall.SIGTERM 信号
	// kill -2 发送 syscall.SIGINT 信号,我们常用的Ctrl+C就是触发系统SIGINT信号
	// kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它
	// signal.Notify把收到的 syscall.SIGINT或syscall.SIGTERM 信号转发给quit
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 此处不会阻塞
	<-quit                                               // 阻塞在此,当接收到上述两种信号时才会往下执行
	zap.L().Info("shutdown")
	// 创建一个5秒超时的context
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	// 5秒内优雅关闭服务(将未处理完的请求处理完再关闭服务),超过5秒就超时退出
	if err := srv.Shutdown(ctx); err != nil {
		zap.L().Fatal("Server Shutdown: ", zap.Error(err))
	}

	zap.L().Info("Server exiting")
}

setting.go文件

package setting

import (
	"fmt"
	"github.com/spf13/viper"	//配置文件第三方库
	"github.com/fsnotify/fsnotify" //同步修改配置第三方库
)
var Conf = new(App)
type App struct{
	//存放配置文件信息的结构体
}

func Init()(err error){
	viper.AddConfigPath('./')//读取配置配件存在的路径
	viper.SetConfigName('config')
	viper.SetConfigType('yaml') //配置文件的文件类型:yaml、json等
	err = viper.ReadInConfig()//解析配置文件的函数、如果解析失败会返回错误。
	viper.WatchConfig()//监控并重新读取配置文件
	viper.OnConfigChange(func(in fsnotify.Event)){
		//可以添加一个回调函数
	}
	return
}

logger.go日志文件

package logger

import (
	"github.com/natefinch/lumberjack" //日志切割归档库
	"go.uber.org/zap"	
	"go.uber.org/zap/zapcore"
	"github.com/gin-gonic/gin"
)


func Init(cfg *settings.LogCofig) (err error){
	writeSyncer := getLogWriter(
		//cfg.配置
		)	//决定日志文件写去哪里,该怎么写
	encoder := getEncoder()//决定文件该怎么写入,编码器
	var l  = new(zapcore.Level)//决定什么级别的日志该被写入
	err = l.UnmarshalText([]byte(cfg.Level)) //解组文本编码值
	core := zapcore.NewCore(encoder,writeSyncer,l) 
	lg := zap.New(core, zap.AddCaller())
	zap.ReplaceGlobals(lg)//替换全局的logger实例,在其他包里调用zap.L()即可
	return
	}
func getLogWirter(filename string, maxSize, maxBackup, maxAge int) zapcore.WriteSyncer {
	lumberJackLogger := &lumberjack.Logger{
		Filename: filename,
		MaxSize: maxSize,
		MaxBackups: maxBackups,
		MaxAge: maxAge,
		}
	return zapcore.AddSync(luberJackLogger)
	}//要在zap中加入Lumberjack支持,我们需要修改WriteSyncer代码。我们将按照下面的代码修改getLogWriter()函数:

mysql.go

package mysql

import (
	_ "github.com/go-mysql-driver/mysql"
	"github.com/jmoiron/sqlx"
	"go.uber.org/zap"
)

var db *sqlx.DB
func Init(cfg *settings.MySQLConfig) (err error){
	dsn:= fmt.Sprintf("%s:%s@tcp(%s:%d)/%s",
	cfg.User,
	cfg.Password,
	cfg.Host,
	cfg.Port,
	cfg.DbName,)
	db, err = sqlx.Connect("mysql", dsn)
if err ...
}	

redis.go

package redis

import (
	"github.com/go-redis/redis"
	)
func Init(cfg *setting.RedisConfig) (err error){
	rdb = redis.NewClient(&redis.Options{
		Addr: fmt.Sprintf("%s:%d",cfg.Host,cfg.Port),
		Password: fmt.Sprintf("%s",cfg.Password),
		DB: cfg.DB,
		PoolSize: cfg.poolsize,
		})
	_,err = rdb.Ping().Result()
	return
	}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-08 11:51:37  更:2021-10-08 11:51:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:39:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码