[开发者笔记]Odin

[开发者笔记]Odinhttps://github.com/chkinglee/odin#2020-05-311、elasticsearch搭建与启动2、springboot集成elasticsearchNote:在这里没有参照网上的方法添加elasticsearch的依赖,而是利用httpclientUtil写了一个EsUtil,对elasticsearch的读写实际是发起的http请求\3、代码思路1)需要能够解析配置文件中的自定义配置参数2)HttpClientUtil、EsUtil,可找…

大家好,又见面了,我是你们的朋友全栈君。

 

一个大计划中的小模块: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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162789.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker搭建kafka集群[通俗易懂]

    docker搭建kafka集群[通俗易懂]docker搭建kafka集群我在M1mbp上使用的以下镜像新建文件zk-kafka-docker-compose.ymlversion:”2″services:zookeeper:user:rootimage:docker.io/zookeeperports:-“12181:2181″environment:-ALLOW_ANONYMOUS_LOGIN=yesvolumes:-zoo

    2022年4月25日
    48
  • jdk14下载与安装教程(win10)超详细

    jdk14下载与安装教程(win10)超详细一、前言现在jdk已经升级到JDK14版本了,这里也记录一下jdk14的下载及安装过程,对于刚学习java的小伙伴可以参考,熟手可忽略,呵呵~二、下载安装步骤一、首先是去jdk官网下载,官网下载还需要注册,如果大家不怕麻烦的话可以去官网下载,下载速度也是龟速,我也是花了好长时间才下载下来,大家可以点击我的网盘目录jdk目录下载,目录也有其它低版本的,如果有需要大家根据需要自行选择。…

    2022年5月26日
    190
  • ScheduledExecutorService 接口[通俗易懂]

    ScheduledExecutorService 接口[通俗易懂]newScheduledThreadPool()或者newSingleThreadScheduled-Executor()方法:延迟执行、周期性执行的执行器如果想在某一段时间之后执行线程操作,或者周期性地重复执行线程操作,则可以使用工厂类Executors的newScheduledThreadPool()方法或者newSingleThreadSche…

    2022年5月5日
    68
  • pycharm安装CV2,tensorflow[通俗易懂]

    pycharm安装CV2,tensorflow[通俗易懂]在pycharm中导入importcv2时不能正常使用,需要安装cv2库,但是我们在pycharm中安装库时没有找到CV2,就需要安装opencv库,我采用的是以下的方式:1、首先看下pycharm中的环境,我现在用的环境是anaconda下的PyCharmproject2、在菜单栏中打开anacondaprompt(anaconda3)3、刚开始进入时环境是4、切换环境为pycharm中环境activatePyCharmproject5、已经下好了opencv的whl文件,我下到了3

    2022年8月26日
    9
  • 永恒之蓝是谁激活成功教程的_永恒之蓝病毒激活成功教程了吗

    永恒之蓝是谁激活成功教程的_永恒之蓝病毒激活成功教程了吗简介:NSA武器库的公开被称为是网络世界“核弹危机”,其中有十款影响Windows个人用户的黑客工具,包括永恒之蓝、永恒王者、永恒浪漫、永恒协作、翡翠纤维、古怪地鼠、爱斯基摩卷、文雅学者、日食之翼和尊重审查。这些工具能够远程攻破全球约70%的Windows系统,无需用户任何操作,只要联网就可以入侵电脑,就像冲击波、震荡波等著名蠕虫一样可以瞬间血洗互联网,木马黑产很可能改造NSA的武器…

    2025年6月29日
    3
  • Android Studio实现记事本项目[通俗易懂]

    Android Studio实现记事本项目[通俗易懂]手把手教你搭建一个记事本项目,简单又好用,经典之作。

    2022年6月3日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号