Gin框架(二):启动流程分析
1.启动服务1.1 服务源码123456789101112131415package main// 引入gin框架import "github.com/gin-gonic/gin"func main() { // 创建一个默认的路由引擎 engine := gin.Default() // 注册Get路由 engine.GET("/", func(ctx *gin.Context) { ctx.JSON(200,gin.H{ "msg":"请求成功", }) }) // 默认监听的是 0.0.0.0:8080 _ = engine.Run()}
1.2 启动输出12345678910➜ go run main.go [GIN-debug] [WARNING] Creating an Engine instance with the Logger and R ...
Gin框架(一):快速入门
1.什么是Gin Gin 是一个用Go (Golang)编写的 开源web 框架。 目前在GitHub Start 47.4K, 它是一个类似于 martini 但拥有更好性能的 API 框架,路由解析由于使用的是httprouter,速度提高了近 40 倍。
Github: https://github.com/gin-gonic/gin
中文文档: https://gin-gonic.com/zh-cn/docs/
2.安装2.1 创建空目录1➜ mkdir gin-use
2.2 使用go module初始化12➜ go mod init go-usego: creating new go.mod: module go-use
2.3 安装1234567 # 在文件根目录下执行➜ gin-use git:(main) ✗ go get -u github.com/gin-gonic/gingo: downloading github.com/gin-gonic/gin v1.7.1go: github.com/gin-gonic/gin upgrade => v1 ...
基金分析系统(六):通过docker-compose项目部署
1.项目目录12345678910├── Dockerfile # dockerFile文件├── config-dev.yaml # dev环境配置文件├── config-local.yaml # 本地测试文件 ├── docker-compose.yaml # docker-compose文件├── .env # 环境变量文件....├── go.mod├── go.sum├── logs├── main.go
2. 新增dockerfile1234567891011121314151617181920212223242526272829303132FROM golang:1.18.3-stretch AS builder# 环境变量ENV GO111MODULE=on \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 \ GOPROXY="https://goproxy.cn,direct"# 切换到工作目录WORKDIR /build# 将代码复制到容器中COPY . .# 下载依赖RU ...
基金分析系统(五):爬取基金持仓信息
1. 爬取流程
2. 准备工作2.1 分页网页
@注意:这次爬取的网页数据是通过ajax加载,所以不能直接使用OnHtml抓取。
2.2 编写结构体1234567891011121314// 对应表中的每一trtype StockPercentageRow struct { StockCode string `selector:"td:nth-of-type(2)"` StockName string `selector:"td:nth-of-type(3)"` Percentage string `selector:"td:nth-of-type(7)"` Quantity string `selector:"td:nth-of-type(8)"` Amount string `selector:"td:nth-of-type(9)"`}// 对应整个tabletype StockPercentageRowsCrawl struct { ...
基金分析系统(四):爬取基金详情信息
1. 爬取逻辑流程
2. 准备工作2.1 分析网页
2.2 编写结构体根据上面的网页分析,可以根据div[class='txt_cont']选中table,然后根据第n行第x列,来编写对应的结构体,如下:
123456789101112131415161718// 定义结构体对应type BasisCrawl struct { // tr:nth-child(n) > td:nth-of-type(x): 代表第n行第x列 Code string `selector:"tr:nth-child(2) > td:nth-of-type(1)"` FullName string `selector:"tr:nth-child(1) > td:nth-of-type(1)"` ShortName string `selector:"tr:nth-child(1) > td:nth-of-type(2)"` Type ...
基金分析系统(三):爬取基金收益榜单
1.流程介绍
2.页面分析
3. 爬虫脚本3.1 编写结构体代码文件位置:service/crawl/fund/top_crawl.go
1234567891011121314151617181920// 对应每一行的基金信息type fundItem struct { FundCode string `selector:"td:nth-of-type(1)"` FundName string `selector:"td:nth-of-type(2)"` NetWorth string `selector:"td:nth-of-type(3) > span.fb"` TopDate string `selector:"td:nth-of-type(3) > span.date"` DayChange string `selector:"td:nth-of-type(4)"` WeekCh ...
基金分析系统(二):通过数据模型建表
1. 介绍数据模型指的是和表结构一一对应的结构体,通过编写结构体可通过迁移直接创建表结构,后续作为对表的增删改查的参数。
2. 用户模型2.1 用户表文件:model/entity/user.go
12345678910// 用户表type User struct { global.BaseModel NickName string `json:"nickName" gorm:"type:varchar(20);not null;default:'';comment:昵称"` Phone string `json:"phone" gorm:"type:char(11);unique:un_phone;comment:手机号"` Password string `json:"-" gorm:"type:varchar(40);comment:密码"` Status int `json:"status ...
基金分析系统(一):项目介绍
1. 项目介绍使用Go开发《基金数据分析系统》,项目系统框架是基于gin-api-template的基础上做二次开发,该系统计划完成功能,主要有: 基金数据(概括、持仓、历史业绩、财务报表)爬取、基金相似度对比、用户管理等功能。
仓库地址:fund-analysis-system
2. 系统架构图
3. 目录介绍
目录|文件
说明
api
控制器
config
配置相关的结构体
global
全局变量、常量
initialize
初始化相关操作,如:连接Mysql、redis等
internal
内部实现(不对外暴露)的代码模块
logs
存放日志目录
middleware
中间件
model
实体类(和表结构对应)、请求入参、返回出参
router
所有路由在这个目录下
service
业务实现的相关代码
test
单元测试目录
utils
工具函数目录
config.yaml
项目配置文件
main.go
主程序入口
router.go
路由注册管理
server.go
主程序服务代码
4. 启动流程
RPC编程(二):快速入门使用
介绍Go语言标准包(net/rpc)已经提供了对RPC的支持,而且支持三个级别的RPC:TCP、HTTP和JSONRPC。但Go语言的RPC包是独一无二的RPC,它和传统的RPC系统不同,它只支持Go语言开发的服务器与客户端之间的交互,因为在内部,它们采用了Gob来编码。
废话不多说,下面会分别实现: TCP版、HTTP版、JSONRPC版的RPC。开始撸代码~~
TCP版
Go语言的RPC规则:方法只能有两个可序列化的参数,其中第二个参数是指针类型,并且返回一个error类型,同时必须是公开的方法。
服务端实现12345678910111213141516171819202122232425262728293031323334package mainimport ( "log" "net" "net/rpc" "time")type HelloService struct{}func (h *HelloService) Say(request string, ...
RPC编程(一):初步了解RPC
什么是RPCRPC(Remote Procedure Call,远程过程调用)是一种进程间的通信方式,它是一种技术思想(概念),而不是规范,它允许程序调用另一个地址空间(通常是共享网络的另一台机器)的过程函数,而开发者无需额外地为这个调用过程编写网络通信相关代码细节。
通俗的解释:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。
远程调用和本地调用
HTTP和RPC区别从概念区分
一句话概括: RPC是概念,HTTP是协议,RPC通信协议,可以基于HTTP协议,也可以基于TCP、UDP。
RPC调用协议通常包含传输协议 和 序列化协议,常用的传输协议是TCP、常用的序列化协议是Protobuf,当然也支持其他协议,具体可见上图。
从传输协议上区分
HTTP只能基于HTTP协议,而且HTTP 属于应用层协议。
RPC可以基于HTTP、TCP、UDP协议,而其中TCP、UDP属于传输层协议。
HTTP和RPC本质的区别,还是在传输协议上,虽然HTTP和RPC底层都是通过TCP协议,但是RPC走的是自定义TCP协议,两者主要的区别 ...
框架开发(五):框架开发-集成ElasticSearch
1.介绍Elasticsearch是一个分布式、可扩展、近实时的高性能搜索与数据分析引擎。在Go中经常使用的包有以下两个:
包
文档
Star 数量
olivere/elastic
https://olivere.github.io/elastic/
5.7k
elastic/go-elasticsearch
https://github.com/elastic/go-elasticsearch
3.2k
2.安装这里使用olivere/elastic
12# 安装v7的版本go get github.com/olivere/elastic/v7
3.配置3.1 编写配置文件123456789[elastic]# 是否开启enabled=true#es服务地址url=http://127.0.0.1:9200# 是否转换请求地址,默认为true,当等于true时 请求http://ip:port/_nodes/http,将其返回的url作为请求路径sniffer_enabled=false# 心跳检查,间隔时间health_check_inte ...
框架开发(四):框架开发-集成日志Logrus
1.介绍logrus是目前 Github 上 star 数量最多的日志库,截止今天star数量为17.3k 。logrus功能强大,性能高效,而且具有高度灵活性,提供了自定义插件的功能。
logrus源码:https://github.com/sirupsen/logrus
1.特性总览
完全兼容 golang 标准库日志模块,logrus 拥有六种日志级别:debug、info、warn、error、fatal 和 panic,这是 golang 标准库日志模块的API的超集.如果您的项目使用标准库日志模块,完全可以以最低的代价迁移到 logrus 上。
可扩展的 Hook 机制:允许使用者通过 hook 的方式将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过 hook 定义日志内容和格式等.
可选的日志输出格式:logrus 内置了两种日志格式,JSONFormatter和TextFormatter,如果这两个格式不满足需求,可以自己动手实现接口 Formatter,来定义自己的日志格式.
Field机制:logrus ...
框架开发(三):框架开发-集成Redis
1.客户端介绍redis官网推荐使用redigo(https://github.com/gomodule/redigo),截止到今天Github Start是8.2k 但go-redis(https://github.com/go-redis/redis)使用的人更多, 并且go-redis封装得更好。截止到今天Github Start 是10.8k。
2.安装1go get github.com/go-redis/redis/v8
3.编写配置3.1 编写配置文件文件:app/config/*.ini
123456789...[redis]host=127.0.0.1port=6379# 密码password=# 默认DBdefault_db=0...
3.2 编写Redis配置结构文件:app/config/config.go
12345678910/** * @description: Redis配置信息 * @user: Shershon */type RedisConfig struct { Host string `ini:"host&qu ...
框架开发(二):框架开发-集成Gorm
1.安装12go get -u gorm.io/gormgo get -u gorm.io/driver/mysql
2.配置相关2.1 编写配置文件12345678910111213141516171819202122232425[mysql]host=127.0.01port=3306database=testuserName=rootpassword=rootcharset=utf8mb4# 表前缀table_pre=app_# 设置闲置的连接数,默认值为2;max_idle_conn=10# 设置最大打开的连接数,默认值为0,表示不限制。max_open_conn=100# 设置了连接可复用的最大时间。max_life_time=1h# 支持把数据库datetime和date类型转换为golang的time.Time类型parse_time=true# 使用系统本地时区loc=Local# 连接超时时间timeout=10s# 慢sql时间,单位毫秒slow_sql_time=50ms# 是否打印SQLprint_sql_log=true
2.2 定义Mysql配置结构体文 ...
框架开发(一):框架开发-目录介绍和路由设计
1.背景介绍使用Go开发Web API框架,验证学习成果。在实践中学习。
2.目录介绍12345678910111213141516171819202122232425├── README.md├── app│ ├── app.go //主程序文件│ ├── common // 公共文件│ │ ├── base_controller.go // 控制器基类│ │ ├── base_model.go // 模型基类│ │ ├── error.go // 错误处理│ │ ├── global.go // 全局变量│ │ ├── response_code.go // api返回code定义│ │ └── router.go // 路由解析│ ├── config // 配置目录│ │ ├── dev.ini // 测试环境配置(默认加载)│ │ ├── local.ini // 本地环境配置│ │ └── mysql_config.go│ ├── controllers // 控制器目录│ │ ...