Siky’s Blog

上线Blog聊天室

本来是一个平平无奇的一天

但是由于准备把之前写完的聊天室上线就有了今天的这篇Blog

架构介绍:

用Gin起了个单体+Kratos的数据库操作端

一开始我是没想着做数据库的,后来发现需要检测一下在线人数,刚好那段时间在写kratos和Redis就直接在那上面写了,于是就有了算是两个端的服务

于是我打算这么做,kratos自带的dockerfile,我就直接把它打包成docker+把Lan-chat直接移植到服务器上,启动,这就很简单的事情嘛,配个证书,配个反代的事情。正当我这么想着的时候,事情才刚刚开始

首先是Kratos的Docker部分

打包:

参考Kratos的文档:https://go-kratos.dev/docs/devops/docker

基本是那个没什么需要改的地方只需要把

CMD ["./server", "-conf", "/data/conf"]

里面的server改成你自己项目的文件名就好了,ok,开始构建

由于需要在服务器上拉取镜像,所以我们首先需要登录我们的docker hub

docker login

输入用户名和密码之后就好了

在构建之前,请注意你需要使用镜像的平台和你构建的平台是否是同一种架构!!!

比如你是MAC M2,那么你的ARM架构构建的镜像在AMD架构的服务器上事无法运行的,所以我们需要进行多架构构建

这是两个例子,这里创建了两个 Buildx 构建器

一个使用默认配置 另一个名为 mybuilder,并指定了支持的平台为 linux/amd64linux/arm64

docker buildx create --use
docker buildx create --use --name mybuilder --platform linux/amd64,linux/arm64

创建完成之后,我们进行切换构建器,切换之后,我们构建的镜像默认就有 linux/amd64linux/arm64 的了

docker buildx use mybuilder

构建镜像

docker buildx build --platform linux/amd64,linux/arm64 -t sikyyy/chat-data:latest .

推送容器到Docker Hub

docker buildx build --platform linux/amd64,linux/arm64 -t sikyyy/chat-data:latest --push .

本地加载

docker buildx build --platform linux/amd64,linux/arm64 -t sikyyy/chat-data:latest --load .

推送完之后,服务器那边把镜像pul下来基本上也没什么问题,然后就继续看Lan-chat这边

(阿里云真该死啊,有时候连的上github有时候连不上)

clone不成我就转思路把项目扔到gitee然后给服务器拉起来了

接下来就是老思路了,

把项目拉上来

把新的二级域名dns配好

cerbot弄个证书

nginx配个反代

go run main.go!

gogogogo

欸?怎么报错了,看看报错

ws.js:1 Mixed Content: The page at '[https://chat.siky.online/chat](https://chat.siky.online/chat)' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://chat.siky.online/ws'. This request has been blocked; this endpoint must be available over WSS.
匿名 @ ws.js:1
Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
at [https://chat.siky.online/static/js/ws.js:1:16](https://chat.siky.online/static/js/ws.js:1:16)
Uncaught ReferenceError: socket is not defined
at sendMessage (message.js:69:9)
at handleKeyDown (message.js:147:13)
at HTMLTextAreaElement.onkeydown (chat:48:86)

哦哦哦,换了https应该用wss

const socket = new WebSocket('wss://chat.siky.online/ws');
go run main.go!

欸?怎么又报错了(这里忘记留报错信息了大概是说什么ssl证书什么的,报错是因为Kratos那边的nginx没配置,因为一般自己只会有一个后端服务,这次有两个,确实是忘了。而且我的kratos没有统一的前置路由,是直接大概这样来的

localhost:8000/subscribe

这样会和我的Lan-chat的后端服务冲突,我只好回Kratos给他们统一加了一层/api,改成了localhost:8000/api/subscribe,然后又是倒腾一遍镜像,然后把nginx配好了)

go run main.go

其实中间还有一些Fetch的报错,大家记得生产环境转线上的时候,把HTTP/HTTPS的相关请求全部要改掉哦!!!

打开网页,打开控制台,嗯,一切欣欣向荣,非常良好,正当我准备收手的时候,在线人数怎么是0

fuck

打个断点看看

断点

也正常返回了啊

我去反复看了data层的Login登录和各层的调用逻辑,也没问题,也看了SADD这个封装方法也没问题

// Login 登录
func (r *userRepo) Login(ctx context.Context, u *biz.User) (*redis.IntCmd, error) {
	reult := r.data.rdb.SAdd(ctx, u.Setname, u.Username)
	if reult.Err() != nil {
		return nil, reult.Err()
	}
	return reult, nil
}

奇了怪了

本地试一下,也是正常的。看看config.yaml,感觉也没什么问题,服务器的redis服务也启动了,让我半天想不到问题出在哪

后来检查了一下服务器的redis连接

redis-cli
INFO clients
127.0.0.1:6379> INFO clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
127.0.0.1:6379>CLIENT LIST
id=4 addr=127.0.0.1:51662 fd=8 name= age=2934 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client

这里就有问题了,我连接呢,我那么大个连接去哪里了

然后我就去查我的redis连接配置,原来是我在本地,redis也没设置用户名密码什么的,就也能直接用,由于我不知道阿里云里面起的redis默认的这些是什么,我就直接用了之前注册RedisInsight拿来的免费redis服务器,好像有30MB,反正存个在线人数是一定够够的了,又不存聊天记录

这次我学聪明了,先在本地测试连接,通了之后,再转到线上

重复一次刚才的步骤!

ok

cd Lan-chat
nohup go run main.go > output.log 2>&1 & 

当当

demo