[开发者笔记]Odin

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Odin Inspector是一个强大的Unity3D插件,用于增强Unity编辑器中的开发工作流程。它提供了许多易于使用并高度可定制的特性,可以帮助开发人员更高效地创建、修改和管理Unity中的各种组件和属性。 使用Odin Inspector,开发人员可以轻松定义自己的自定义编辑器窗口和面板,以便更直观地管理和编辑游戏对象的属性和参数。这个插件提供了许多内置的属性修饰符和布局工具,使得在编辑器中创建复杂的、高度定制的UI变得非常容易。 另一个重要的功能是Odin Inspector提供了一个强大的序列化系统,可以使开发人员更好地控制对象的数据和状态。通过它,开发人员可以轻松地序列化和反序列化游戏对象,方便地保存和加载游戏进度。 此外,Odin Inspector还支持自定义属性绘制器(Property Drawers),这使开发人员可以为自己的属性创建独特的外观和交互。这个功能非常有用,因为它让我们可以按照自己的需求和设计标准来呈现和修改数据。 总而言之,Odin Inspector是一个功能强大而又易于使用的插件,它有助于提高Unity游戏开发的效率和质量。通过使用它,开发人员可以更方便地管理和编辑游戏对象的属性,更好地控制对象的数据和状态,以及创建自定义的属性外观和交互。无论是个人开发者还是团队开发者Odin Inspector都是一个非常有价值和实用的工具。 ### 回答2: Odin Inspector是一款功能强大的Unity编辑器扩展工具,它为开发者提供了一套易用的自定义属性系统,可以快速、灵活地在Unity的编辑器界面中创建自定义面板,实现更高效的编辑器工作流程。 Odin Inspector具有许多强大的特性。首先,它提供了丰富多样的自定义属性,开发者可以使用这些属性来控制和限制Inspector面板中的字段和选项的显示方式。例如,可以使用Range属性来定义数值字段的取值范围,使用EnumMask属性来创建一个可多选的枚举字段等等。这样一来,开发者可以针对不同类型的数据设计出更加友好和直观的界面,提高开发效率。 其次,Odin Inspector还支持自定义编辑器面板的设置和布局。开发者可以通过添加组件来自定义编辑器窗口,重组字段的排列顺序,嵌套面板等等。这样,可以根据项目的需求,创建出更适合团队协作和开发流程的编辑器布局,提高工作效率。 另外,Odin Inspector还支持对象的序列化和反序列化操作,可以将Unity场景、Prefab和脚本中的实例数据进行持久化保存,实现数据的跨场景、跨平台、跨工程的传递和共享,方便团队合作和版本管理。 总之,Odin Inspector是一款非常强大和实用的Unity编辑器扩展工具,它可以帮助开发者更好地管理和操作Unity编辑器中的数据和功能,提高开发效率和质量。无论是单人独立开发还是团队协作,Odin Inspector都是一款非常值得尝试和使用的工具。 ### 回答3: Odin Inspector 是一个功能强大的 Unity 游戏开发工具,可用于为游戏开发者提供可视化编辑器,以加速游戏开发过程。Odin Inspector 提供了一系列强大的特性和工具,帮助开发者在 Unity 编辑器中更方便地创建、组织和调试游戏。 Odin Inspector 的主要特点包括: 1. 自定义编辑器:Odin Inspector 允许开发者为自定义的 C# 类型创建自定义的编辑器,以提供更简洁、直观和高效的界面。这使得开发者可以更轻松地创建各种自定义属性,并自定义属性在 Unity 编辑器中的表现形式,以满足自己的需求。 2. 序列化工具:Odin Inspector 提供了更强大的序列化工具,使得在编写和读取数据时更加灵活和高效。开发者可以自定义序列化过程,实现更精确的控制和优化。 3. 扩展性和可定制性:Odin Inspector 提供了丰富的扩展和自定义选项,使得开发者可以根据自己的项目需求进行定制。开发者可以添加自定义的属性绘制器、编辑器工具、插件等,以增加功能和改进工作流程。 4. 支持网格系统和绘制工具:Odin Inspector 提供了网格系统和各种绘制工具,帮助开发者更快速地创建和编辑游戏场景。开发者可以方便地调整对象的位置、旋转和缩放,并提供了各种网格布局和对齐工具。 总之,Odin Inspector 是一个强大而灵活的 Unity 开发工具,提供了方便的可视化编辑器,让开发者更高效地创建和调试游戏。它的自定义编辑器、序列化工具、扩展性和绘制工具等特性,大大增加了开发者的工作效率和创造力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值