# go-web-study **Repository Path**: qzcsu/go-web-study ## Basic Information - **Project Name**: go-web-study - **Description**: go web 学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 2 - **Created**: 2021-06-16 - **Last Updated**: 2024-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # go-web-study ## gorm 框架学习 ### 代码 - controller/user_controller - 对应的orm模型为 model/sys_user_info.go ### 其它资料 - 官方文档:https://gorm.io/zh_CN/docs/index.html ## gin 框架学习 ### 代码 - main.go 中注释 gin学习 到 gin学习结束, 跟着这个路由测试学习 ### 参数绑定 - c.MustBindWith() 会根据不同的格式调用以下几种 Bind, BindJSON, BindXML, BindQuery, BindYAML,如果绑定出错,请求终止,并会触发 c.AbortWithError(400, err).SetType(ErrorTypeBind)。响应状态码被设置为 400 并且 Content-Type 被设置为 text/plain; charset=utf-8。 如果您在此之后尝试设置响应状态码。 - c.ShouldBind() 会根据不同的格式调用以下几种 ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery, ShouldBindYAML,错误会返回交给开发者自己处理。 - 使用 Bind 方法时,Gin 会尝试根据 Content-Type 推断如何绑定。 如果你明确知道要绑定什么,可以使用 MustBindWith 或 ShouldBindWith。 - 可以指定必须绑定的字段。 如果一个字段的 tag 加上了 binding:"required",但绑定时是空值, Gin 会报错 ## kafka ### 代码 - main.go 启动两种消费者 - controller/kafka_test.go 官网原生例子 - controller/kafka_controller.go 生产者api封装 ### 生产者 - producer 分为两种,同步发送,与异步发送。 - producer 支持单个消息发送,也支持批量消息发送,批量发送时支持往不同的topic发送。异步发送暂时还未封装到api ### 消费者 - consumer 可以指定单个topic 消费,但是需要同时指定partition和offset。这种一般是做任务补偿消费用。 - consumer 还可以针对消费者组消费,消费者组可以指定多个topic。即同时消费多个topic中的消息。 ### 常用命令(kafka 解压后的bin目录) - 启动:./kafka-server-start.sh ../config/server.properties & - 后台启动:./kafka-server-start.sh -daemon ../config/server.properties & - 创建topic:./kafka-topics.sh --create --zookeeper 10.248.174.155:2181 --replication-factor 1 --partitions 1 --topic test-topic - 查看topic:./kafka-topics.sh --list --zookeeper 10.248.174.155:2181 - 发送消息:这里的ip和端口必须和配置文件中的一样,不能用localhost ./kafka-console-producer.sh --broker-list 10.248.174.155:9092 --topic go-kafka-test - 消费消息:ip和端口和配置文件中保持一样 ./kafka-console-consumer.sh --bootstrap-server 10.248.174.155:9092 --from-beginning --topic go-kafka-test - 删除topic:./kafka-topics.sh --zookeeper 10.248.174.155:2181 --delete --topic go-kafka-test - 查看broker节点topic状态信息:./kafka-topics.sh --describe --zookeeper 10.248.174.155:2181 --topic go-kafka-test ### 其它参考资料 - 中文文档 https://kafka.apachecn.org/ - http://kafkadoc.beanmr.com/010_getting_started/01_introduction_cn.html - go 语言接入https://github.com/Shopify/sarama - api参考接入文档 https://pkg.go.dev/github.com/Shopify/sarama#pkg-examples ## redis ### 代码 - controller/redis_test.go ### sortSet 命令 - 添加元素: zadd key score1 member1 score2 member2 ... - ex: zadd versions 30 xiaoming 50 xiaohong 50 sunwukong - 根据分数范围查询元素,返回的元素是按照score从小到大排列(上下区间均为闭区间): zrangebyscore key min max - zrangebyscore versions 25 30 [25, 30] - zrangebyscore versions (30 50 (30,50] - zrangebyscore versions (30 (50 (30,50) - zrangebyscore versions -inf +inf 查询所有member - zrangebyscore versions -inf +inf withscores 查询所有member并且和score一起返回 - 根据排序的index取值,返回的元素都是按照score从大到小排列(上下都是闭区间):zrevrange key min max - zrevrange versions 0 2 返回三个元素,最大的,第二大的,第三大的 - zrevrange versions -2 -1 返回两个元素,倒数第二小的,最小的 - 查询某个member的score zscore versions member - zscore versions v5 ### api参考资料 - https://docs.yugabyte.com/latest/yedis/api/append/ ## grpc ### 代码 - grpc/* ### 步骤 1. 使用proto文件生成go的相关代码 1. 下载protoc https://github.com/protocolbuffers/protobuf/releases protoc-版本-操作系统.zip 注:mac的为osx 2. 解压文件,将bin目录下的protoc 二进制文件配置在环境变量PATH下 友情提示:环境变量修改使用 source命令即时生效。 ```shell # 使用此命令看是否生效 protoc --version libprotoc 3.19.1 ``` 3. 编写proto文件实例 grpc/proto/pandago/pandago.proto [更详细的参考](https://developers.google.com/protocol-buffers/) 4. protoc 中原生包含了部分语言(java、php、python、ruby等等)的编译插件,但是没有 Go 语言的,所以需要额外安装一个插件。 5. 安装grpc go get -u google.golang.org/grpc 6. 安装go-gRPC plugins go get google.golang.org/grpc/cmd/protoc-gen-go-grpc 7. 终端输入 protoc –version 能打印出版本信息;并且 $GOPATH/bin 目录下有 protoc-gen-go、protoc-gen-go-grpc 这两个可执行文件 8. 在项目主目录下执行(具体参数含义见 proto文件) protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./grpc/proto/pandago/pandago.proto 9. 此时在同个目录下应该生成了两个文件,xxx.pb.go,xxx_grpc.pb.go 10. 编写server代码 见 /grpc/example/grpcserver/main.go 11. 编写client端测试 见 /grpc/example/grpcclient/main.go 12. 运行server main函数启动服务端监听 13. 运行client main函数启动grpc调用 ## etcd v3.5.0 > 文档说明etcd的安装及主要服务注册与发现使用的命令,并且使用最新的v3 api,进行服务发现与注册的实现 ### 代码 - client/etcd/* ### 文档 - client/etcd/etcdctl_operation.md ## consul 1.11.1 > 文档说明consul的安装及主要服务注册与发现使用的命令,consul的思想是client端提供心跳检测的回调地址 ### 代码 - client/consul/* ### 文档 - client/consul/consol_operation.md ## zookeeper 3.7.0 > 文档说明zookeeper的安装及主要服务注册与发现使用的命令,zookeeper是目录式的结构结点 ### 代码 - client/zookeeper/* ### 文档 - client/zookeeper/consol_operation.md ### zk watch 分别提供了3中监听 - 官方网文档 https://zookeeper.apache.org/doc/r3.7.0/zookeeperProgrammers.html#ch_zkWatches ## prometheus 2.35.0 ### 博客文章 - https://blog.csdn.net/qzcsu/article/details/124770699 - https://blog.csdn.net/qzcsu/article/details/125114089 ### 代码 - 分支prometheus,官方库演示四种metric - 分支prometheus-gin,prometheus整合gin ## clickhouse 22.2.3.5 ### 介绍(OLAP场景数据库特征,摘抄与clickhouse官网) - 绝大多数是读请求 - 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。 - 已添加到数据库的数据不能修改。 - 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。 - 宽表,即每个表包含着大量的列 - 查询相对较少(通常每台服务器每秒查询数百次或更少) - 对于简单查询,允许延迟大约50毫秒 - 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节) - 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行) - 事务不是必须的 - 对数据一致性要求低 - 每个查询有一个大表。除了他以外,其他的都很小。 - 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中 ### 代码 - controller/clickhouse_test.go ### docker 安装 可视化 http://127.0.0.1:8123/play ``` docker run -d --name xx_clickhouse --ulimit nofile=262144:262144 \ -p 8123:8123 -p 9000:9000 -p 9009:9009 --privileged=true \ -v /mydata/docker/clickhouse/log:/var/log/clickhouse-server \ -v /mydata/docker/clickhouse/data:/var/lib/clickhouse clickhouse/clickhouse-server:22.2.3.5 ``` ## skywalking 8.5.0 ### 介绍 分布式链路最终系统,一个trace_id分析出来调用链路以及链路耗时 分为四大模块 - skywalking-agent 这一部分负责从应用程序中收集链路信息,然后把链路信息发送给skywalking OAP处理器 - skywalking OAP 负责接收从skywalking-agent发送过来的Tracing数据信息,然后把数据信息给Analysis Core进行分析,把分析到的数据存储到外部的存储器当中,最后面把数据信息给Query Core提供查询数据的功能 - Skywalking UI UI界面,给用户查看链路调用,告警等信息 - 数据存储 底层数据支持mysql,elasticsearch,h2 默认是h2 ### 安装 #### 安装elasticsearch 1. echo "http.host: 0.0.0.0" >> /mydata/es/config/elasticsearch.yml ```cgo docker run -d --name xx_es7 -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx128m" \ -v /mydata/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mydata/es/data:/usr/share/elasticsearch/data \ -v /mydata/es/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.6.2 ``` #### 安装skywalking-oap-server ```cgo docker run --name xx_skywalking-oap-server \ --restart always -d -e TZ=Asia/Shanghai -p 12800:12800 -p 11800:11800 \ --link xdclass_es7 -e SW_STORAGE=elasticsearch7 \ -e SW_STORAGE_ES_CLUSTER_NODES=xdclass_es7:9200 \ apache/skywalking-oap-server:8.5.0-es7 ``` #### 安装skywalking-ui ```cgo docker run -d --name xx_skywalking-ui \ --restart=always \ -e TZ=Asia/Shanghai \ -p 8080:8080 \ --link xd_oap \ -e SW_OAP_ADDRESS=xd_oap:12800 \ apache/skywalking-ui:8.5.0 ``` ## mongodb ### 免费实例获取 1. https://www.mongodb.com/cloud/atlas/register 进行注册 2. Database Access 设置账号密码 3. Network Access 配置可访问ip白名单,如果想任意ip访问 ip填这个 0.0.0.0/0 4. 获取链接地址及代码段 Database -> Connect -> Connect Your application #### 代码 - 分支 master - 目录 ./controller/mongo/ - ./controller/mongo/mongo_test.go 单元测试增删改查 - ./controller/mongo/crud_examples_test.go 官方sdk的样例