Docker 部署redmine

1
2
3
4
5
6
7
8
9
docker run --name redmine -d \
--restart always \
--link mysql5.7:mysql \
-e REDMINE_DB_MYSQL=mysql \
-e REDMINE_DB_PASSWORD=password \
-v /home/redmine/files:/usr/src/redmine/files \
-v /etc/localtime:/etc/localtime:ro \
-p 3000:3000 \
redmine

Docker 部署gitlab

1
2
3
4
5
6
7
8
9
10
11
docker run --name gitlab -d \
--hostname git.xxx.com \
-v /etc/localtime:/etc/localtime:ro \
-v /home/gitlab/config:/etc/gitlab \
-v /home/gitlab/logs:/var/log/gitlab \
-v /home/gitlab/data:/var/opt/gitlab \
--restart always \
-p 443:443 \
-p 8080:80 \
-p 22:22 \
gitlab/gitlab-ce

二叉查找树的一些操作方法

本文源码地址: https://github.com/zboyco/go-test/blob/master/findtree/main.go


二叉查找树

树有多种不同的结构,但都是由节点构成,一颗树至少有一个根节点,节点下有子节点,没有子节点的节点称为叶子;
二叉树指每一个树节点都最多有两个子节点的树,两个子节点分别称为左节点和右节点;
二叉查找树则是指每一个节点的左节点的值都小于当前节点的值,右节点的值都大于或等于当前节点的值。

Go 使用go-micro编写微服务

go-micro

go-micro是一个可以构建微服务的rpc基础框架。

准备工作

1.protobuf

go-micro代码生成依赖Protobuf,所以需要安装protobuf。参考Go语言使用protobuf

1
https://github.com/protocolbuffers/protobuf/releases

2.protoc-gen-go

go-micro采用protobuf作为数据传输编码,所以需要安装protoc-gen-go生成工具。

1
go get -u github.com/golang/protobuf/protoc-gen-go

3.protoc-gen-micro

protoc-gen-micro用来生成go-micro代码。

1
go get -u github.com/micro/protoc-gen-micro

4.consul

go-micro默认使用consul作为服务发现框架。下载地址:

1
https://www.consul.io/downloads.html
  • 下载后需要将consul所在目录加入PATH环境变量
    执行consul agent -dev即可运行consul。

Go 实现线程安全栈

问题

使用切片实现栈,要求线程安全。

思路

栈主要特征就是数据先进后出,操作主要有push/pop/top/isempty,使用切片保存数据,为了线程安全,增加读写锁。

实现

直接上代码

记录下golang可能的一些项目问题

虚拟助手app

  1. 介绍下项目。
    该项目是一个移动端养成类的app,相似的有日本的《makes》,功能比较简单,就是通过用户和虚拟人物日常的对话和交互累计经验和资源,使用资源购买道具装扮虚拟人物,然后解锁更多的交互内容、方式和场景,同步实现一些备忘录和闹钟功能的app。

  2. 介绍下项目架构。

  3. 为什么采用web api实现?
    因为该项目主要是用户和虚拟人物的交互,没有用户对用户的交互需求,对即时性相应要求并不高,所以采用web api的方式实现,配合JWT协议,利用gin中间件可以方便的实现权限验证,开发效率高,并且gin也比较稳定。

  4. 为什么使用redis作为缓存?

    1. 直接操作数据库相对较慢,redis存储在内存中,提高访问速度
    2. 高并发,redis的承受能力高于数据库,使用redis可以减小数据库的压力
    3. redis支持分布式缓存和持久化
    4. redis是单线程的,操作具有原子性
    5. 支持的数据类型多
  5. redis和mysql的数据一致性问题怎么解决?

    1. 读:读redis,如果redis没有再读取mysql并写入redis
    2. 写:更新mysql–>异步删redis
    3. redis设置短过期时间
    4. 串行化对同一数据的处理
  6. 为什么采用protobuf协议?

    1. protobuf序列化后数据大小是json格式的十分之一,是xml格式的二十分之一,适合网络传输,减少数据量,减少网络IO
    2. 解析效率快
    3. 较复杂,数据本身不具有可读性
  7. 什么情况下使用nsq队列?怎么使用?

  8. 高可用有没有接触?如何保证高可用?

  9. JWT有什么优势?有什么缺点?

    1. 服务端不用保存会话信息
    2. 实现单点登录
    3. 增加了请求头开销
    4. 续签和注销不方便

Go invalid character '' in string literal

问题

在socket读取数据后,进行json.Unmarshal时出现invalid character '\x00' in string literal错误.

解决办法

在Unmarshal的时候,切片数据传入读取到的长度

1
2
3
4
5
6
readLenght, err := conn.Read(buffer)
if err != nil {
log.Panic(err)
}
result := cmdModel{}
err := json.Unmarshal(buffer[:readLenght], &result)