Skip to content

Commit

Permalink
Merge branch 'Mikaelemmmm:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
bllli authored Mar 3, 2022
2 parents 2a6e1f2 + 2b6a547 commit 3a98a2f
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 88 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@

项目目录结构如下:

- admin:后台代码(整合了gin-vue-admin,充当一个后台大网关),使用grpc与app下的rpc业务交互,后台gin-vue-admin与go-zero的代码交互在banner功能上有个例子可以查看,如果不想要后台,直接删除admin整个文件夹即可
- admin:后台代码(整合了gin-vue-admin,充当一个后台大网关),使用grpc与app下的rpc业务交互,后台gin-vue-admin与go-zero的代码交互在banner功能上有个例子可以查看,如果不想要后台,直接删除admin整个文件夹,在执行一次 go mod tidy即可
- admin/web : 后台web端代码,gin-vue-admin的


Expand Down Expand Up @@ -171,7 +171,7 @@ go-zero默认jaeger、zipkin支持,只需要配置就可以了,可以看配

gitlab + jenkins + harbor + k8s

在jenkins中点击部署对应的服务,会去gitlab拉取代码-->再去拉取线上配置(线上配置单独一个git库,为什么不用配置中心,部署文档中有介绍)---->组懂构建镜像-->推送到harbor镜像仓库--->使用kubectl自动发布到k8s中---->前面要挂一个nignx做网关统一入口、鉴权、限流等
在jenkins中点击部署对应的服务,会去gitlab拉取代码-->再去拉取线上配置(线上配置单独一个git库,为什么不用配置中心,部署文档中有介绍)---->自动构建镜像-->推送到harbor镜像仓库--->使用kubectl自动发布到k8s中---->前面要挂一个nignx做网关统一入口、鉴权、限流等



Expand Down
60 changes: 35 additions & 25 deletions doc/11、日志收集.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,35 +50,24 @@ filebeat收集我们的业务日志,然后将日志输出到kafka中作为缓
- zookeeper
```
先配置好kafka、zookeeper
然后我们进入kafka中先创建好filebeat收集日志到kafka的topic
进入kafka容器
```shell
$ docker exec -it kafka /bin/sh
```
⚠️ 如下创建日志的topic:looklook-log 如果在搭建系统开发环境时候已经创建了,这里就可以忽略了
修改kafka监听配置(或者你把配置文件挂载到物理机在修改也可以)
先配置好kafka、zookeeper
```sh
$ vi /opt/kafka/config/server.properties
listeners=PLAINTEXT://kafka:9092 # 原文件中,要加kafka listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka:9092 #源文件中,要加kafka advertised.listeners=PLAINTEXT://:9092
```
然后我们进入kafka中先创建好filebeat收集日志到kafka的topic
创建topic
进入kafka容器
```shell
$ cd /opt/kafka/bin
$ docker exec -it kafka /bin/sh
$ cd /opt/kafka/bin/
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic looklook-log
```





##### 3.2 filebeat

在项目根目录下 docker-compose-env.yml文件中可以看到我们配置了filebeat
Expand Down Expand Up @@ -225,24 +214,45 @@ func (l *BusinessListLogic) BusinessList(req types.BusinessListReq) (*types.Busi

#### 4、收集日志失败常见原因

- 收集失败
- go-stash镜像版本使用错了

解答:docker logs 按照顺序检查kafka、filbeat、go-stash、es的容器日志,确认服务都没问题
看看go-stash的log ,如果出现core dumped , 就说明镜像使用错了。

解答:

如果你是mac m1或者 linux arm,请更改一下docker-compose-env.yml中go-stash镜像 kevinwan/go-stash:1.0-arm64 ,默认是linux amd的

- topic存在
- docker版本问题

在创建log的topic的时候,显示ERROR org.apache.kafka.common.errors.TopicExistsException: Topic 'looklook-log' already exists.(kafka.admin.TopicCommand$)
Analytics - > 点击discover,下面Create index pattern->输入looklook-* -> Next Step 这个next step是灰色的。
解答:

解答:删除kafka中所有数据,删除/kafka/kafka-logxxxxx/下的书有数据,重启kafka,重新手动创建looklook-log
这个我没有实际遇到,但是有同学使用docker版本是1.13遇到了,filebeat配置文件中配置收集docker的路径低版本docker可能位置不一样导致收集不到docker内部日志,最好升级一下docker18.03.1以上目前都没问题,17没有实际测试 , 我这边用的docker版本是 Version: 20.10.8

- 内部kafka问题

解答:

- docker版本问题
1)docker logs 按照顺序检查kafka、filbeat、go-stash、es的容器日志,确认服务都没问题

2)先docker logs -f filebeat查看filebeat是否正确连接到了kafka

3)进入kafka容器内,执行消费kafka-log消息,看看是否filebeat的消息已经发送到了kafka

```shell
$ docker exec -it kafka /bin/sh
$ cd /opt/kafka/bin
$ ./kafka-console-producer.sh --bootstrap-server kafka:9092 --topic kafka-log
```

【注】如果能消费到消息,说明filebeat与kafka没问题,就去排查go-stash、es

​ 如果不能消费

​ 1)就应该是filebeat与kafka之间连接的问题,要去看下kafka的配置信息Listen是否修改了

​ 2)在kafka容器内部命令行使用consumer.sh消费kafka-log,另外一个终端命令行用producer.sh给kafka-log发送消息,如果consumer收不到,说明kafka出问题了,docker logs -f kafka看看什么问题

解答:这个我没有实际遇到,但是有同学使用docker版本是1.13遇到了,filebeat配置文件中配置收集docker的路径低版本docker可能位置不一样导致收集不到docker内部日志,最好升级一下docker18.03.1以上目前都没问题,17没有实际测试 , 我这边用的docker版本是 Version: 20.10.8



Expand Down
185 changes: 129 additions & 56 deletions doc/1、开发环境搭建.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

项目目录结构如下:

- admin:后台代码(整合了gin-vue-admin,充当一个后台大网关),使用grpc与app下的rpc业务交互,后台gin-vue-admin与go-zero的代码交互在banner功能上有个例子可以查看,如果不想要后台,直接删除admin整个文件夹即可
- admin:后台代码(整合了gin-vue-admin,充当一个后台大网关),使用grpc与app下的rpc业务交互,后台gin-vue-admin与go-zero的代码交互在banner功能上有个例子可以查看,如果不想要后台,直接删除admin整个文件夹,在执行一次 go mod tidy即可
- admin/web : 后台web端代码,gin-vue-admin的


Expand Down Expand Up @@ -104,10 +104,18 @@

### 五、项目环境搭建

##### ⚠️搭建过程中如果遇到问题,可以看 "九、常见错误"



本项目采用air热加载功即时修改代码及时生效,并且不需要每次都要重启,改了代码自动就在容器中重新加载了,本地不需要启动服务,本地安装的sdk就是写代码自动提示使用的,实际运行是以来容器中cosmtrek/air的golang环境。所以使用goland、vscode都一样



【注意】由于本项目以来中间件比较多,在非linux上启动docker可能会消耗内存较多,建议将物理机分配给docker的内存调到8G



#### 1、clone代码&更新依赖

```shell
Expand All @@ -123,14 +131,75 @@ $ go mod tidy
$ docker-compose -f docker-compose-env.yml up -d
```

jaeger: http://127.0.0.1:16686/search


#### 3、导入数据

###### 3.1创建kafka topic

系统内使用了3个topic,默认是不允许程序自动创建topic的,进入kafka的容器创建3个topic

进入容器

```shell
$ docker exec -it kafka /bin/sh
$ cd /opt/kafka/bin/
```

创建3个topic

```shell
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic looklook-log
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic payment-update-paystatus-topic
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic send-wx-mini-tpl-message
```

looklook-log : 日志收集使用的

payment-update-paystatus-topic : 支付成功通知

send-wx-mini-tpl-message:发送微信小程序通知



###### 3.2导入mysql数据

本地工具连接mysql的话要先进入容器,给root设置下远程连接权限

```shell
$ docker exec -it mysql mysql -uroot -p
##输入密码:PXDN93VRKUm8TeE7
$ use mysql;
$ update user set host='%' where user='root';
$ FLUSH PRIVILEGES;
```



创建数据库looklook_admin && 导入deploy/sql/looklook_admin.sql数据

创建数据库looklook_order && 导入deploy/sql/looklook_order.sql数据

创建数据库looklook_payment && 导入deploy/sql/looklook_payment.sql数据

创建数据库looklook_travel && 导入deploy/sql/looklook_travel.sql数据

创建数据库looklook_usercenter && 导入looklook_usercenter.sql数据



#### 4、查看服务环境

Elastic search: http://127.0.0.1:9200/ (⚠️:这个启动时间有点长)

jaeger: http://127.0.0.1:16686/search (⚠️:如果失败了,依赖es,因为es启动时间长这个有可能超时,等es启动玩restart一下)

go-stash : 看log (⚠️:如果你是mac m1或者 linux arm,请更改一下docker-compose-env.yml中go-stash镜像 kevinwan/go-stash:1.0-arm64 ,默认是linux amd的)

asynq (延时、定时消息队列): http://127.0.0.1:8980/

kibana : http://127.0.0.1:5601/

Elastic search: http://127.0.0.1:9200/

Prometheus: http://127.0.0.1:9090/

Grafana: http://127.0.0.1:3001/ , 默认账号、密码都是admin
Expand Down Expand Up @@ -161,31 +230,17 @@ Kafka: 自行客户端工具查看



#### 3、拉取项目依赖镜像
#### 5、启动服务

##### 5.1 拉取运行环境镜像

因为本项目是用air热加载的,所以是在air+golang镜像中运行,直接docker-compose也可以,但是考虑依赖可能会比较大,会影响启动项目,所以最好先把这个镜像拉取下来再去启动项目,拉取air+golang项目依赖的镜像命令如下

```shell
$ docker pull cosmtrek/air:latest
```



#### 4、导入mysql数据

创建数据库looklook_admin && 导入deploy/sql/looklook_admin.sql数据

创建数据库looklook_order && 导入deploy/sql/looklook_order.sql数据

创建数据库looklook_payment && 导入deploy/sql/looklook_payment.sql数据

创建数据库looklook_travel && 导入deploy/sql/looklook_travel.sql数据

创建数据库looklook_usercenter && 导入looklook_usercenter.sql数据



#### 5、启动项目
##### 5.2 启动项目

```shell
$ docker-compose up -d
Expand Down Expand Up @@ -276,29 +331,6 @@ $ docker-compose restart nginx

将项目日志收集到es(filebeat收集日志->kafka -> go-stash消费kafka日志->输出到es中,kibana查看es数据)

所以我们要提前在kafka中创建日志的topic

进入kafka容器

```shell
$ docker exec -it kafka /bin/sh
```

修改kafka监听配置

```sh
$ vi /opt/kafka/config/server.properties
listeners=PLAINTEXT://kafka:9092 # 原文件中,要加kafka listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka:9092 #源文件中,要加kafka advertised.listeners=PLAINTEXT://:9092
```

创建log的topic

```shell
$ cd /opt/kafka/bin
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic looklook-log
```

访问kibana http://127.0.0.1:5601/ , 创建日志索引


Expand All @@ -323,28 +355,47 @@ $ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -

⚠️常见收集失败原因

- 收集失败
- go-stash镜像使用错了

看看go-stash的log ,如果出现core dumped , 就说明镜像使用错了。

解答:docker logs 按照顺序检查kafka、filbeat、go-stash、es的容器日志,确认服务都没问题
解答:

如果你是mac m1或者 linux arm,请更改一下docker-compose-env.yml中go-stash镜像 kevinwan/go-stash:1.0-arm64 ,默认是linux amd的

- docker版本问题

- topic存在
解答:

在创建log的topic的时候,显示ERROR org.apache.kafka.common.errors.TopicExistsException: Topic 'looklook-log' already exists.(kafka.admin.TopicCommand$)
Analytics - > 点击discover,下面Create index pattern->输入looklook-* -> Next Step 这个next step是灰色的。
这个我没有实际遇到,但是有同学使用docker版本是1.13遇到了,filebeat配置文件中配置收集docker的路径低版本docker可能位置不一样导致收集不到docker内部日志,最好升级一下docker18.03.1以上目前都没问题,17没有实际测试 , 我这边用的docker版本是 Version: 20.10.8

解答:删除kafka中所有数据,删除/kafka/kafka-logxxxxx/下的书有数据,重启kafka,重新手动创建looklook-log
- 内部kafka问题

解答:

1)docker logs 按照顺序检查kafka、filbeat、go-stash、es的容器日志,确认服务都没问题

- docker版本问题
2)先docker logs -f filebeat查看filebeat是否正确连接到了kafka

3)进入kafka容器内,执行消费kafka-log消息,看看是否filebeat的消息已经发送到了kafka

```shell
$ docker exec -it kafka /bin/sh
$ cd /opt/kafka/bin
$ ./kafka-console-producer.sh --bootstrap-server kafka:9092 --topic kafka-log
```

解答:这个我没有实际遇到,但是有同学使用docker版本是1.13遇到了,filebeat配置文件中配置收集docker的路径低版本docker可能位置不一样导致收集不到docker内部日志,最好升级一下docker18.03.1以上目前都没问题,17没有实际测试 , 我这边用的docker版本是 Version: 20.10.8
【注】如果能消费到消息,说明filebeat与kafka没问题,就去排查go-stash、es

​ 如果不能消费

​ 1)就应该是filebeat与kafka之间连接的问题,要去看下kafka的配置信息Listen是否修改了

#### 七、本项目镜像介绍
​ 2)在kafka容器内部命令行使用consumer.sh消费kafka-log,另外一个终端命令行用producer.sh给kafka-log发送消息,如果consumer收不到,说明kafka出问题了,docker logs -f kafka看看什么问题


### 七、本项目镜像介绍

所有服务启动成功,应该是如下这些,自行对比

Expand All @@ -369,7 +420,7 @@ Analytics - > 点击discover,下面Create index pattern->输入looklook-* -> N



#### 八、项目开发建议
### 八、项目开发建议

- app下放所有业务服务代码

Expand Down Expand Up @@ -421,7 +472,29 @@ $ sed -i "" 's/,omitempty//g' ./rpc/pb/*.pb.go



#### 九、后续
### 九、搭建环境常见错误

```dock
1、创建阶段,起docker-compose-env.yml容器
Grafana 报错You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migrate-to-v51-or-later
mkdir: can't create directory '/var/lib/grafana/plugins': Permission denied
因权限问题导致,可在docker-compose-env.yml中grafana部分加入user: root
2、filebeat容器启动报错Exiting: error loading config file: config file ("filebeat.yml") must be owned by the user identifier (uid=0) or root
因文件所有者不同导致(我在普通用户下clone的项目),filebeat的配置文件所有者必须为root,需修改sudo chown root deploy/filebeat/conf/filebeat.yml
3、elasticsearch容器启动报错ElasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsearch/data/nodes];
Likely root cause: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes
报错原因es没有权限操作挂载目录,无法绑定节点,解决方法,修改权限sudo chmod 777 data/elasticsearch/data (不知道es是哪个用户启动的,所以硬改了777)
4、jaeger依赖于elasticsearch,且没有失败自动重启
```





### 十、后续

由于项目中由于涉及到的技术栈稍微有点多,将逐步分章节一点点添加

Expand Down
Loading

0 comments on commit 3a98a2f

Please sign in to comment.