大家好,又见面了,我是你们的朋友全栈君。
一个大计划中的小模块:Odin
Github地址:https://github.com/chkinglee/Odin
2020-05-29
项目构思
命名出处
Odin,众神之父。
目的
从0搭建springboot项目,并集成mysql、redis、elasticsearch,作为学习demo
背景
众多服务都可能有依赖elasticsearch的需求,譬如站内信、文章、文章评论、百科文档、工单等等,将“众多服务”视为“业务方”,则每个业务自行开发针对elasticsearch的功能,不免导致代码开发和维护成本高。可考虑开发一个服务,专心实现对elasticsearch的使用。
需求
能够根据业务方和业务功能,判断使用业务方规定的索引和类型,处理业务方对elasticsearch的读写请求
设计思路
1、数据库中记录业务方tenant、业务功能module、对应的索引名称indexName、对应的类型名称typeName。
2、当业务方请求读写文档时,需要携带tenant、module、自定义docId、文档内容的jsonStr。
3、odin根据tenant、module查询数据库,找到对应的indexName和typeName,请求elasticsearch读写
4、考虑性能提升,将数据库中的信息缓存到redis中,odin处理读写请求时先查redis
辨证论
Q:依赖elasticsearch的业务模块还是要自己设计model,组织doc内容,并且要解析odin返回的内容,单独写一个odin会显得很鸡肋。
A:是的,目前对odin的构想仅停留在如何写一个最简单的demo集成mysql、redis、elasticsearch,并且能够在后期有真正的应用。各业务模块不可避免的还需要写有关elasticsearch的输入并处理elasticsearch的输出。odin更像一个工具类,只是对于同一大型系统的开发者来说,不需要过多考虑如何请求elasticsearch了,不需要把同一个工具类和其他相关代码反反复复复制粘贴。后面可能的话也会考虑封装成一个公共库。odin目前的想法是专注于对elasticsearch的应用。
2020-05-30
数据库设计
数据库应用
1、存储业务名tenant、业务模块module、索引index、类型type。当上游业务方要读写文档时,根据业务名和业务模块获取目标索引的类型。
表结构和数据示例
CREATE TABLE `tenant` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tenant` varchar(64) DEFAULT NULL COMMENT '业务名',
`module` varchar(64) DEFAULT NULL COMMENT '业务模块',
`indexName` varchar(64) DEFAULT NULL COMMENT '索引',
`typeName` varchar(64) DEFAULT NULL COMMENT '类型',
`description` varchar(64) DEFAULT NULL COMMENT '业务功能描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
mysql> select * from tenant ;
+----+----------+-------------+---------------------+-------------+-----------------------+
| id | tenant | module | indexName | typeName | description |
+----+----------+-------------+---------------------+-------------+-----------------------+
| 1 | mt | article | mt_article | article | NULL |
| 2 | hogwarts | mail | hogwarts_mail | mail | 霍格沃茨站内信 |
| 3 | hogwarts | application | hgwarts_application | application | 霍格沃茨报名表 |
+----+----------+-------------+---------------------+-------------+-----------------------+
3 rows in set (0.00 sec)
核心逻辑设计
Q:如何应用elasticsearch的?
A:通俗方式是度娘“springboot集成elasticsearch” 。但目前翻看了一篇相关资料,考虑再三,并没有集成对elasticsearch的官方依赖,而是找了一个开源的httpclient工具类,仅仅是把elasticsearch当做一个服务,对doc的读写其实只是对elasticsearch的http请求。主要是相关资料中的demo,大多都是针对具体业务的,而odin的设计目的并不是针对具体业务,而是通用业务。后期再看吧。
设计思路
针对写请求
1、上游的请求格式:POST /{tenant}/{module}/{id},RequestBody为具体要写入es的jsonString
2、根据tenant和module查询数据库(使用jpa),获得indexName和typeName
3、拼接elasticsearch的url,发起http请求
测试
GET http://127.0.0.1:8803/api/v1/tenant/hogwarts/mail
{
"code": 0,
"message": "success",
"detail": [
{
"id": 2,
"tenant": "hogwarts",
"module": "mail",
"indexName": "hogwarts_mail",
"typeName": "mail"
}
]
}
参考资料
springboot集成mysql
springboot集成jpa
https://segmentfault.com/a/1190000014269284?utm_source=index-hottest
https://www.jianshu.com/p/2aa3d2dd83bd
2020-05-31
集成redis
redis应用
1、存储tenant具体内容,所有对doc的读写请求,每次都查询数据库严重影响性能
2、使用string,key的格式为ODIN:TENANT:${tenant}:${module},value为数据库中的tenant记录格式化为jsonString
测试
从日志来看,查询数据库耗时14-20ms左右,查询redis耗时1-3ms左右,平均8倍的性能提升。(mysql和redis均与odin同机部署)
参考资料
springboot集成redis并使用redisTemplate:
https://www.cnblogs.com/jingjiren/p/12704401.html
https://www.jianshu.com/p/c168e2b825cb
集成elasticsearch
索引、类型、映射
暂未考虑,依靠elasticsearch的自动创建,后续补充
测试
Request
POST /api/v1/docs/hogwarts/mail/202005310511499702 HTTP/1.1
Host: 127.0.0.1:8803
Content-Type: application/json
{
"id":"202005310511499702",
"createTime": "2020-05-31T05:11:49Z",
"sender":"chkinglee",
"receiver":"lilinzhen9702",
"content":"今天也是充满希望的一天"
}
Response
{
"code": 0,
"message": "success",
"detail": true
}
参考资料
https://www.iteye.com/blog/lxy19791111-341409
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162789.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...