项目的目录框架

基于这个框架,后续会一个个实现

加载配置文件

在项目中用到了redis、mongodb,这两个数据库应该要在程序启动时连接,在程序的运行中只是调用,而不是每次调到时都重新连接。

配置文件 application/conf/config.ini

[mysql]
username='root'
password='root'
host='127.0.0.1'
port=3306
database='im-demo'[redis]
host='127.0.0.1'
port='6379'
password=''
db=0[mongodb]
username='root'
password='root'
host='127.0.0.1'
port=27017
db='admin'

读取配置文件 application/conf/config.go

package confimport ("fmt""github.com/spf13/viper"
)var (MysqlConf   MysqlIniRedisConf   RedisIniMongoDbConf MongoDbIni
)type MysqlIni struct {Username stringPassword stringHost     stringPort     intDatabase string
}type RedisIni struct {Host     stringPort     stringPassword stringDb       int
}type MongoDbIni struct {Username stringPassword stringHost     stringPort     intDb       string
}// viper 读取ini配置文件
func init() {config := viper.New()config.AddConfigPath("./application/conf/")config.SetConfigName("config")config.SetConfigType("ini")if err := config.ReadInConfig(); err != nil {if _, ok := err.(viper.ConfigFileNotFoundError); ok {fmt.Println("找不到配置文件..")} else {fmt.Println("配置文件出错..")}fmt.Println(err.Error())return}MysqlConf = MysqlIni{Username: config.GetString("mysql.username"),Password: config.GetString("mysql.password"),Host:     config.GetString("mysql.host"),Port:     config.GetInt("mysql.port"),Database: config.GetString("mysql.database"),}RedisConf = RedisIni{Host:     config.GetString("redis.host"),Port:     config.GetString("redis.port"),Password: config.GetString("redis.password"),Db:       config.GetInt("redis.db"),}MongoDbConf = MongoDbIni{Username: config.GetString("mongodb.username"),Password: config.GetString("mongodb.password"),Host:     config.GetString("mongodb.host"),Port:     config.GetInt("mongodb.port"),Db:       config.GetString("mongodb.db"),}
}

项目初始化

package applicationimport ("context""fmt""im-demo/application/conf""github.com/go-redis/redis""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)var (MysqlClient   *gorm.DBRedisClient   *redis.ClientMongoDBClient *mongo.ClientMongoDataBaseName            = "im-demo"MongoMsgCollection           = "message"MongoSessionListCollection   = "session_list"MongoFriendRequestCollection = "friend_request"
)func init() {// MysqlClient = intiMysql()RedisClient = initRedis()MongoDBClient = initMongoDB()
}func intiMysql() *gorm.DB {fmt.Println("mysql is connecting...")uri := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", conf.MysqlConf.Username, conf.MysqlConf.Password, conf.MysqlConf.Host, conf.MysqlConf.Port, conf.MysqlConf.Database)db, err := gorm.Open("mysql", uri)if err != nil {panic(err)} else {fmt.Println("mysql connectiton success")}// 设置全局表名禁用复数db.SingularTable(true)return db
}func initRedis() *redis.Client {fmt.Println("redis is connecting...")client := redis.NewClient(&redis.Options{Addr:     conf.RedisConf.Host + ":" + conf.RedisConf.Port, // "127.0.0.1:6379"Password: conf.RedisConf.Password,                         // ""DB:       conf.RedisConf.Db,                               // 0})err := client.Ping().Err()if err != nil {panic(err)} else {fmt.Println("redis connectiton success")}return client
}func initMongoDB() *mongo.Client {fmt.Println("mongodb is connecting...")uri := fmt.Sprintf("mongodb://%s:%s@%s:%d/%s", conf.MongoDbConf.Username, conf.MongoDbConf.Password, conf.MongoDbConf.Host, conf.MongoDbConf.Port, conf.MongoDbConf.Db)clientOptions := options.Client().ApplyURI(uri)client, err := mongo.Connect(context.TODO(), clientOptions)if err != nil {panic(err)}// 检查连接err = client.Ping(context.TODO(), nil)if err != nil {panic(err)}println("mongodb connectiton success")return client
}

这里只是项目前期,关键的IM还在后续

IM即时通讯从0到1的实践,相关文章:

IM即时通讯-从0到1的实践(一)

IM即时通讯-项目框架搭建(二)<本文>

IM即时通讯-用户注册登录,及gin+JWT鉴权(三)

IM即时通讯-核心结构体设计(四)

IM即时通讯-消息id(五)

IM即时通讯-会话列表和会话信箱(六)

IM即时通讯-1.0版成果展示与后续扩展(七)

IM即时通讯-项目框架搭建(二)相关推荐

  1. Vue3.0 + Ts 项目框架搭建二:路由 Router

    前言 上篇文章我们使用 vue-cli 创建了模板项目,可以看到安装的依赖只有 vue,所以要正常的驱动项目,安装必要的依赖是跑不了. 其中Router是控制整个系统的页面路由,是最重要的依赖之一.因 ...

  2. SpringSecurity(二)、权限项目框架搭建

    Springboot + SpringSecurity权限项目框架搭建 目录 一.项目介绍 二.项目搭建(父子工程) 1.添加 pom 依赖 2.修改 yml 配置 3.编写JwtTokenUtil工 ...

  3. Android-IM从零开始开发一个即时通讯项目

    Android-IM从零开始开发一个即时通讯项目 https://www.jianshu.com/p/dca480006691 关于聊天室项目 聊天室项目,也被称为即时通讯(IM). 其原理是服务器是 ...

  4. (三) Angular2项目框架搭建心得

    前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...

  5. Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline

    Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向 ...

  6. 【高校宿舍管理系统】第一章 建立数据库以及项目框架搭建

    第一章 建立数据库以及项目框架搭建 提示:本博客个为人独立博客,不是权威,仅供参考!所有思路只做交流之用!如有不足之处,望各位在评论区友善指正. 文章目录 第一章 建立数据库以及项目框架搭建 前言 一 ...

  7. spring cloud多模块项目框架搭建-Redis-Cluster集群搭建及系统集成

    第九章 Redis-Cluster集群搭建及系统集成 本系列博客旨在搭建一套能用于实际开发使用的spring cloud多模块微服务项目框架,并不是一个spring cloud的demo而已,提供系统 ...

  8. spring cloud多模块项目框架搭建-集成SLF4J和log4j2日志组件

    第七章  集成SLF4J和log4j2进行日志管理 本系列博客旨在搭建一套能用于实际开发使用的spring cloud多模块项目框架,并不是一个spring cloud的demo而已,提供分布式系统的 ...

  9. SpringBoot后端项目框架搭建

    SpringBoot后端项目框架搭建 本节内容服务于SpringBoot + Vue 搭建 JavaWeb 增删改查项目. 工具安装 电脑已安装\配置如下工具: IDEA.jdk.MySQL及其可视化 ...

  10. IM即时通讯项目讲解(一) 实现类似qq微信表情面板无缝切换

    IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换 标签(空格分隔): 开源项目 ###该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 #####通过该课 ...

最新文章

  1. 智源沙龙 | 人工智能“3个30年”之后,下个30年将走向何方?
  2. 怎么样才能让自己自律起来_一个人如何才能高度自律(深度好文)
  3. XGboost 实战糖尿病预测
  4. 安装SCOM Reporting Server
  5. matlab 获取视频图像的信息
  6. JavaScript服务器端开发技术(对象属性的枚举与查询)
  7. HDU-1241-Oil Deposits
  8. Leetcode 27 Remove Element
  9. 虚幻引擎编程基础(二)
  10. 成人教育考试报名照片的尺寸是多少?大一寸照片怎么做?
  11. JQuery视频总结
  12. Go 并发 | 数据竞争及竞争条件
  13. linux安全之系统安全
  14. 「详解」imgaug 图像增强方法
  15. 2005路网 2008路网 2009路网 2010路网 2011路网 2012路网 2013路网 2014路网 2015路网2016路网 2017路网 2018路网 2019路网下载与分析
  16. Java基础学习生疏知识点总结(4)——面向对象、单一职责原则、this关键字、构造方法
  17. 【语音识别】语音识别技术入门
  18. nacos注册服务的时候报错server is DOWN now, please try again later!
  19. arping指令即其参数对应的功能
  20. 飞秋下载2010正式版 飞秋下载

热门文章

  1. 为什么苹果蓝牙耳机连上还是公放_史上最好用的蓝牙无线耳机?苹果AirPods神奇在哪里!...
  2. Ubuntu 18.04 网口创建网络共享
  3. SpringBoot中Redis报错:NOAUTH Authentication required.; nested exception is redis.clients.jedis.exceptio
  4. 使用Docker一键部署MongoDB
  5. cache的替换策略
  6. 内存虚拟化硬件基础——EPT
  7. 电脑wps可以语音录入吗_wps语音输入功能在哪
  8. Windows下如何清除文件资源管理器搜索框中的搜索记录?
  9. 屏蔽高通8953长按电源键的截屏按钮
  10. Android实战——简单网络视频播放器