Skip to content

Commit

Permalink
update: 完善 docker 一键部署脚本
Browse files Browse the repository at this point in the history
1. tcp 模块从 maven 工程升级成 SpringBoot 工程
2. 增添默认页面访问功能
3. 修复 docker 方式部署的问题
4. 修改群聊线程池逻辑,前逻辑是只是简单通过线程池,但其实各任务之间有执行先后的逻辑,因此修改为使用 CompletableFuture 解决 bug
  • Loading branch information
BanTanger committed Sep 22, 2023
1 parent f665135 commit f01c618
Show file tree
Hide file tree
Showing 36 changed files with 276 additions and 3,846 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@
/logs/
/docker/build/
/docker/mysql/logs/
/im-tcp/logs/
/im-domain/logs/
/im-message-store/logs/
31 changes: 22 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,30 +62,41 @@ im-system-whale-shark

可参考自行下载: [服务器下载 Git、Docker、Docker-Compose](docker/docker.md)

#### 粗粒度部署方式:

1. 克隆本项目

```bash
git clone https://github.com/BanTanger/im-whale-shark.git
```
2. 项目打包

2. 根目录下运行 build 脚本

```bash
mvn clean package
sh build.sh
```
- 会将各个模块打包,执行 docker-compose,届时通过终端观察 im-whaleshark 日志(根目录 logs 包记录各模块运行日志)

此过程可能有点长,请耐心等待
#### 细粒度部署方式:

3. 为脚本执行赋予权限并执行
1. 克隆本项目

```bash
git clone https://github.com/BanTanger/im-whale-shark.git
```

2. 为脚本执行赋予权限并执行

```bash
chmod +x *.sh
```
```bash
./copy.sh
sh clean.sh
sh copy.sh
```
- 将各个模块的 jar 包和 Dockerfile 移动到 docker/build 包下

4. 部署项目
3. 部署项目

```bash
sh deploy.sh base
Expand All @@ -96,7 +107,7 @@ sh deploy.sh serives
```
- 将后端的三个模块部署到 docker

5. 开启防火墙
4. 开启防火墙
```bash
./open_port.sh
```
Expand Down Expand Up @@ -152,9 +163,11 @@ docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq

### websocket 测试
`whale-shark/im-tcp/src/main/resources/WebSocket.html`
暂时较为简陋, 本地测试, 需开启后端三个服务
暂时较为简陋, 本地测试需开启后端三个服务并打开 WebSocket 页面

Docker 部署测试请访问 `localhost:19000`

主要浏览方式通过 F12 查看服务端发送的 `json` 格式是否正确
浏览方式通过 F12 查看服务端发送的 `json` 格式是否正确

![](assert/design/websocket窗口功能讲解.png)

Expand Down
Empty file modified clean.sh
100644 → 100755
Empty file.
9 changes: 6 additions & 3 deletions copy.sh
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,20 @@ echo ">>>>>>>>>>>>>>>>>"
jar_files=(
"im-domain/target/im-domain-1.0-SNAPSHOT.jar"
"im-message-store/target/im-message-store-1.0-SNAPSHOT.jar"
"im-tcp/target/im-tcp-1.0-SNAPSHOT-jar-with-dependencies.jar"
"im-tcp/target/im-tcp-1.0-SNAPSHOT.jar"
)

for index in "${!jar_files[@]}"; do
target_file="${target_directories[$index]}/jar/$(basename "${jar_files[$index]}")"
target_file_without_version="${target_directories[$index]}/jar/$(basename "${jar_files[$index]}" "-1.0-SNAPSHOT.jar").jar"
if [[ "${jar_files[$index]}" == *"jar-with-dependencies.jar" ]]; then
target_file_without_version="${target_directories[$index]}/jar/$(basename "${jar_files[$index]}" "-1.0-SNAPSHOT-jar-with-dependencies.jar").jar"
target_file_without_version="${target_directories[$index]}/jar/$(basename "${jar_files[$index]}" "-1.0-SNAPSHOT.jar").jar"
fi
echo "开始复制 ${jar_files[$index]} .."
cp "${jar_files[$index]}" "$target_file"
mv "$target_file" "$target_file_without_version"
echo "复制 ${jar_files[$index]}$target_file_without_version 完成"
done
done

cp "im-tcp/src/main/resources/application-docker.yml" "docker/build/tcp/application.yml"
echo "复制 im-tcp/src/main/resources/application-docker.yml 到 docker/build/tcp/application.yml"
Empty file modified deploy.sh
100644 → 100755
Empty file.
23 changes: 7 additions & 16 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,13 @@ services:
privileged: true
volumes:
- ./docker/mysql/conf:/etc/mysql/conf.d
- ./docker/mysql/logs:/logs
- ./docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/mysql/logs:/var/log/mysql
- ./docker/mysql/data:/var/lib/mysql
- ./docker/mysql/db:/docker-entrypoint-initdb.d/
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]

environment:
MYSQL_ROOT_PASSWORD: 'whalesharkim'
# MYSQL_DATABASE: 'im_core'
# MYSQL_USER: 'root'
# MYSQL_PASSWORD: 'whalesharkim'
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
Expand Down Expand Up @@ -90,7 +81,7 @@ services:

# IM Domain 容器
im-domain:
container_name: im_domain
container_name: im-domain
build:
context: ./docker/build/domain
restart: always
Expand Down Expand Up @@ -135,9 +126,9 @@ services:
context: ./docker/build/tcp
restart: always
ports:
- "19000:19000" # springboot 启动端口
- "19001:19001" # tcp 端口
- "19003:19003" # ws 端口
- "5005:5005"
- "19002:19002" # ws 端口
depends_on:
- im-redis
- im-rabbitmq
Expand All @@ -151,5 +142,5 @@ services:

networks:
im-network:
driver: host
driver: bridge

Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,18 @@
@Slf4j
public class WebSocketMessageDecoderHandler extends MessageToMessageDecoder<BinaryWebSocketFrame> {
@Override
protected void decode(ChannelHandlerContext ctx, BinaryWebSocketFrame msg, List<Object> out) throws Exception {
protected void decode(ChannelHandlerContext ctx, BinaryWebSocketFrame msg, List<Object> out) {

ByteBuf content = msg.content();
if (content.readableBytes() < 28) {
return;
}
Message message = ByteBufToMessageUtils.transition(content);
Message message = null;
try {
message = ByteBufToMessageUtils.transition(content);
} catch (Exception e) {
log.error("", e);
}
if (message == null) {
return;
}
Expand Down
3 changes: 1 addition & 2 deletions im-domain/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@ RUN echo 'Asia/Shanghai' >/etc/timezone

COPY ./jar/im-domain.jar /opt/application/im-domain.jar
COPY application-docker.yml /opt/application/application.yml
COPY logback-spring.xml /opt/application/logback-spring.xml

ENTRYPOINT ["java", "-jar" ,"/opt/application/im-domain.jar", "--spring.config.location=/opt/application/application.yml", "--logging.config=/opt/application/logback-spring.xml"]
ENTRYPOINT ["java", "-jar" ,"/opt/application/im-domain.jar", "--spring.config.location=/opt/application/application.yml"]
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.bantanger.im.domain.group.dao.ImGroupMemberEntity;
import com.bantanger.im.domain.group.model.req.GroupMemberDto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
Expand All @@ -22,31 +23,31 @@ public interface ImGroupMemberMapper extends BaseMapper<ImGroupMemberEntity> {
* @param memberId
* @return
*/
List<String> getJoinedGroupId(Integer appId, String memberId);
List<String> getJoinedGroupId(@Param("appId") Integer appId, @Param("memberId") String memberId);

/**
* 拉取群组所有成员(基本)信息
* @param appId
* @param groupId
* @return
*/
List<GroupMemberDto> getGroupMember(Integer appId, String groupId);
List<GroupMemberDto> getGroupMember(@Param("appId") Integer appId, @Param("groupId") String groupId);

/**
* 拉取群组所有成员 id
* @param appId
* @param groupId
* @return
*/
List<String> getGroupMemberId(Integer appId, String groupId);
List<String> getGroupMemberId(@Param("appId") Integer appId, @Param("groupId") String groupId);

/**
* 拉取群组管理员(基本)信息
* @param groupId
* @param appId
* @return
*/
List<GroupMemberDto> getGroupManager(String groupId, Integer appId);
List<GroupMemberDto> getGroupManager(@Param("appId") Integer appId, @Param("groupId") String groupId);

/**
* 增量拉取用户加入群组的 Id
Expand All @@ -55,5 +56,5 @@ public interface ImGroupMemberMapper extends BaseMapper<ImGroupMemberEntity> {
* @param role
* @return
*/
List<String> syncJoinedGroupId(Integer appId, String memberId, int role);
List<String> syncJoinedGroupId(@Param("appId") Integer appId, @Param("memberId") String memberId, @Param("role") Integer role);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,35 @@
import com.bantanger.im.codec.pack.group.AddGroupMemberPack;
import com.bantanger.im.codec.pack.group.GroupMemberSpeakPack;
import com.bantanger.im.codec.pack.group.UpdateGroupMemberPack;
import com.bantanger.im.common.ResponseVO;
import com.bantanger.im.common.constant.Constants;
import com.bantanger.im.common.enums.command.GroupEventCommand;
import com.bantanger.im.common.enums.group.GroupErrorCode;
import com.bantanger.im.common.enums.group.GroupMemberRoleEnum;
import com.bantanger.im.common.enums.group.GroupStatusEnum;
import com.bantanger.im.common.enums.group.GroupTypeEnum;
import com.bantanger.im.common.exception.ApplicationException;
import com.bantanger.im.common.model.ClientInfo;
import com.bantanger.im.domain.group.GroupMessageProducer;
import com.bantanger.im.domain.group.dao.ImGroupEntity;
import com.bantanger.im.domain.group.dao.ImGroupMemberEntity;
import com.bantanger.im.domain.group.dao.mapper.ImGroupMemberMapper;
import com.bantanger.im.domain.group.model.req.*;
import com.bantanger.im.domain.group.model.req.callback.AddMemberAfterCallback;
import com.bantanger.im.domain.group.model.resp.AddMemberResp;
import com.bantanger.im.domain.group.model.resp.GetRoleInGroupResp;
import com.bantanger.im.domain.group.service.ImGroupMemberService;
import com.bantanger.im.domain.group.service.ImGroupService;
import com.bantanger.im.domain.group.GroupMessageProducer;
import com.bantanger.im.domain.user.dao.ImUserDataEntity;
import com.bantanger.im.domain.user.service.ImUserService;
import com.bantanger.im.service.callback.CallbackService;
import com.bantanger.im.service.config.AppConfig;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bantanger.im.common.ResponseVO;
import com.bantanger.im.common.enums.group.GroupErrorCode;
import com.bantanger.im.common.enums.group.GroupMemberRoleEnum;
import com.bantanger.im.common.enums.group.GroupStatusEnum;
import com.bantanger.im.common.enums.group.GroupTypeEnum;
import com.bantanger.im.common.exception.ApplicationException;
import com.bantanger.im.domain.group.dao.ImGroupEntity;
import com.bantanger.im.domain.group.dao.ImGroupMemberEntity;
import com.bantanger.im.domain.group.dao.mapper.ImGroupMemberMapper;
import com.bantanger.im.domain.group.model.resp.GetRoleInGroupResp;
import com.bantanger.im.domain.user.service.ImUserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -421,7 +420,7 @@ public List<String> getGroupMemberId(String groupId, Integer appId) {

@Override
public List<GroupMemberDto> getGroupManager(String groupId, Integer appId) {
return imGroupMemberMapper.getGroupManager(groupId, appId);
return imGroupMemberMapper.getGroupManager(appId, groupId);
}

@Override
Expand Down
Loading

0 comments on commit f01c618

Please sign in to comment.