Be the best version of you

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

搜索系统实现

发表于 2017-12-20 | 更新于 2018-09-11 | 分类于 实例 | 评论数: | 阅读次数:

业务场景

随着公司业务的发展,数据量的不断增长,以前各业务线对于搜索数据维护的能力显得有些捉襟见肘。同时由于早期没有进行架构方面的规划,业务线各自维护es作为搜索引擎,随之而来的问题如单点、版本不统一、没有很好的规划分片数据等,对于高可用以及实时响应带来了挑战,同时也增加了运维成本。

目前有些数据搜索依旧在数据库进行的,随着数据量增加以及查询维度的提升,单个数据库的读写能力有限,未来存在分片的可能性,对数据一片片查询,对数据库返回结果在内存聚合的方式,缺点显而易见,同时增加了开发的复杂性,对数据库的性能也带来了不必要的负担。

基于上述的原因,遂决定建立通用的搜索服务来为业务线提供统一的入口。同时提供了高可用、以及良好的响应时间。

阅读全文 »

贫血领域模型

发表于 2017-12-20 | 更新于 2018-09-20 | 分类于 DDD | 评论数: | 阅读次数:

这是已经存在了很长一段时间的反模式之一,但目前似乎正在发生特别的迸发。我们都注意到他们似乎越来越受欢迎。作为一个合适的领域模型的推动者,这不是一件好事。

一个贫血的领域模型的基本症状是,乍一看它看起来像真实的东西。有一些对象,许多以域空间中的名词命名,并且这些对象与真实域模型具有的丰富关系和结构相关联。当你观察这些行为的时候,你会发现这些东西几乎没有任何行为,它们只是一堆的getter和setter。事实上,这些模型经常带有设计规则,表明您不应该将域逻辑放入域对象中。取而代之的是一组服务对象,它们捕获所有的域逻辑,执行所有的计算,并使用结果更新模型对象。这些服务位于领域模型的顶部,并使用域模型作为数据。

阅读全文 »

CQRS

发表于 2017-12-07 | 更新于 2018-09-20 | 分类于 DDD | 评论数: | 阅读次数:

CQRS代表Command Query Responsibility Segregation(命令查询职责分离)。它的核心思想是,您可以使用不同的模型来更新信息,而不是使用您用来读取信息的模型。在某些情况下,这种分离是有价值的,但是要注意,对于大多数系统CQRS会增加风险的复杂性。

人们用于与信息系统交互的主流方法是将其视为CRUD数据存储。我的意思是,我们有一些记录结构的构思模型,我们可以创建新的记录,读取记录,更新已有的记录,并在我们完成这些记录时删除记录。在最简单的情况下,我们的交互都是关于存储和检索这些记录的。

阅读全文 »

dubbo暴露公网IP

发表于 2017-11-25 | 更新于 2018-09-11 | 分类于 dubbo | 评论数: | 阅读次数:

最近需要搭建一套测试环境,主要是协助开发进行跨系统联调。目前系统间调用使用的dubbo框架,测试服务器是在云上,而不是局域网内。这样测试环境就带来两个严重的问题

  • 环境隔离
  • dubbo默认注册一般使用本地地址,当你连接测试环境zk,获取的是云服务器的内网地址,本地是无法调通的

关于环境隔离问题,比如开发A注册自己的服务到测试环境的zk,这样带来的问题你的服务已经暴露给测试环境服务,测试环境的rpc调用会轮训到你注册的服务,而你的服务注册到zk的是本地局域网地址,测试环境肯定找不到这个地址,所以调用失败。关于dubbo暴露ip问题详见

阅读全文 »

mybatis使用enum

发表于 2017-11-20 | 更新于 2018-09-11 | 分类于 mybatis | 评论数: | 阅读次数:

项目中经常会遇到一些PO类中的某个字段的取值范围范围是一组固定的值,为了方便期间使用了number来存储这些值。这样会带来的一个问题,当我创建一个PO对象时,这个字段怎么赋值,应该有那些值?通常我们会提供一个enum来维护这个字段的取值范围,随之而来的问题当项目中enum越来越多,或者文档没有更新的情况下,开发人员很难知道,这个字段是不是有enum与之对应,或者是哪个enum与之对应。很多时候我们知道有几种值,我们随手就赋值了一个字面常量值。这就可能出现了莫名其妙的类型。最直接的解决方案,我们在PO字段上直接声明enum类型,就完全避开了错误使用值的情况。

MyBatis官网提供了两种方案,EnumTypeHandler和EnumOrdinalTypeHandler。EnumTypeHandler在数据库中使用VARCHAR存储enum的名字。EnumOrdinalTypeHandler在数据库使用NUMBER或DOUBLE存储enum的索引。

我们更想的是在表中存储NUMBER类型,所以EnumOrdinalTypeHandler更适合我们的需求。EnumOrdinalTypeHandler存储是enum的索引,但是如果我们在enum中想使用自己的code,而不是enum本身的索引,要怎么去做呢?根据MyBatis官网文档我们可以自定义类型处理器来试下,下面是自定义处理器的使用方法。

阅读全文 »

Spring Boot使用yml格式cron表达式

发表于 2017-11-18 | 更新于 2018-09-11 | 分类于 spring boot | 评论数: | 阅读次数:

通常在spring工程中我们会将定时任务的cron表达式配置在properties中,当项目迁移到spring boot下时,spring boot提供了更为便利的yml配置文件。关于yml的使用以及优势我们不做过多的讨论。本篇文章讨论下在yml中配置cron程序的使用问题。

因为我们使用yml文件所以之前类似于@Schedule(${app.cron})肯定是行不通的,yml配置根本不支持这种形式。这就比较难办了,我们怎么才能再次有效的使用el表达式赋值给我们的cron字段呢?

首先为了能获得到该值,我们需要定义一个类,并使用成员变量来接收这些值。

例如我们的yml文件内容如下:

1
2
app:
cron: 0 0 12 * * ?
阅读全文 »

spring cloud maven配置

发表于 2017-11-17 | 更新于 2018-09-11 | 分类于 spring cloud | 评论数: | 阅读次数:

spring cloud maven的配置有两种方式,第一种是官网提供的配置,项目的pom文件继承spring-boot、并且在dependencyManager添加spring cloud依赖,这种方式的使用了maven的继承,如果我们的项目有自己的parent pom,就出现问题了。因此我们可以使用另一种方式,先看下两种配置方式:

阅读全文 »

nexus 3.x上传本地jar

发表于 2017-11-11 | 更新于 2018-09-10 | 分类于 nexus | 评论数: | 阅读次数:

今天碰到需要上传非maven管理的jar到nexus,记录下。语法如下:

1
2
3
4
5
6
7
8
mvn deploy:deploy-file 
-DgroupId=<group-id>\
-DartifactId=<artifact-id>\
-Dversion=<version>\
-Dpackaging=<type-of-packaging>\
-Dfile=<path-to-file>\
-DrepositoryId=<id-to-map-on-server-section-of-settings.xml>\
-Durl=<url-of-the-repository-to-deploy>

举一个简单的栗子:

1
2
3
4
5
6
7
mvn deploy:deploy-file 
-DgroupId=lt.jave
-DartifactId=jave
-Dversion=1.0.2
-Dfile=jave-1.0.2.jar
-DrepositoryId=nexus
-Durl=http://localhost:8081/repository/maven-releases/

DrepositoryId=nexus指的是setting配置的验证的id

redis异常汇总

发表于 2017-10-30 | 更新于 2018-09-11 | 分类于 redis | 评论数: | 阅读次数:

zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

在进入redis目录进行过make时,会出现该异常。解决方案:make MALLOC=libc

CentOS 7下配置Redis开机启动

首先在官网下载源码包,解压后进入该目录执行make install。redis相关命令会存在于/usr/local/bin/下。

启动脚本在redis home下的utils目录下:redis_init_script。

阅读全文 »

AMQP 0-9-1模型解释

发表于 2017-10-22 | 更新于 2018-09-11 | 分类于 rabbitmq | 评论数: | 阅读次数:

本指南提供了AMQP 0-9-1协议的概述,该协议是RabbitMQ支持的协议之一。

AMQP 0-9-1

AMQP 0-9-1(高级消息队列协议)是一种消息传递协议,它使符合标准的客户端应用程序能够与符合标准的消息传递中间件代理进行通信。

代理和他们的规则

消息传递代理接收来自发布者的消息(发布它们的应用程序,也称为生产者),并将它们发送给消费者(处理它们的应用程序)。

由于它是一种网络协议,发布者、消费者和代理都可以在不同的机器上。

阅读全文 »
123
王召辉

王召辉

We must accept finite disappointment, but we must never lose infinite hope.

25 日志
16 分类
30 标签
GitHub E-Mail
© 2015 – 2018 王召辉
由 Hexo 强力驱动 v3.7.1
|
主题 – NexT.Pisces v6.4.1