Simiam

求知若渴,虚怀若谷


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 公益404

  • 搜索

基于Spring的动态多数据源组件使用文档

发表于 2017-09-10 | 分类于 Java |

项目源码

https://github.com/monkeychen/xspring

xspring是个组件集,后续会不断增加新的通用组件,本文所介绍的动态多数据源组件位于xspring项目的xspring-data模块中,其maven坐标如下(尚未上传至maven中央库):

1
2
3
4
5
<dependency>
<groupId>org.xspring</groupId>
<artifactId>xspring-data</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

设计目标

  • 无须定义繁琐的配置信息,使用方只需要提供基本的JDBC连接参数即可
  • 与spring框架无缝集成
  • 默认使用Druid数据库连接池,但支持自定义扩展(可以使用其他数据库连接池)

技术原理

本框架是在spring框架提供的各种特性的基础上进行开发的,具体如下:

  • 抽象的数据源路由类:AbstractRoutingDataSource
  • 基于AOP及注解实现数据源动态切换

xspring-core组件

core组件是所有其他组件的基础,其提供了通用的事件总线、日志管理等功能。其中XspringApplication是整个框架的启动类,通过调用这个启动类的startup静态方法,并提供您打上@org.springframework.context.annotation.Configuration注解的启动类来启动您的应用。

框架启动时按如下顺序加载配置文件

  • file:./config/env.properties
  • classpath:/config/env.properties
  • file:./config/xspring.properties
  • file:./xspring.properties
  • classpath:./config/xspring.properties
  • classpath:./xspring.properties

上述配置文件中env.properties文件中的属性信息支持热加载(即每隔指定时间框架都会读取该文件并更新至SystemProperties),相关源码请参考类EnvironmentInitializer.

基于Xspring框架的应用启动示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
@ImportResource("classpath:/config/customized-beans.xml") // 可以通过ImportResource方式加载定义在XML中的bean信息。
public class DemoApplication {
private ApplicationContext applicationContext;

private DemoService demoService;

public static void main(String[] args) throws Exception {
applicationContext = XspringApplication.startup(DemoApplication.class, args);
demoService = applicationContext.getBean("demoService", DemoService.class);
}
}

XspringApplication类的startup方法会创建XspringApplication实例并调用其run方法:

1
2
3
public static ConfigurableApplicationContext startup(Class<?> annotatedClass, String[] args) {
return new XspringApplication().run(annotatedClass, args);
}

在run方法中,框架会通过SPI方式加载其他组件提供的标注有@Configuration注解的org.xspring.core.extension.ModuleConfiguration接口实现类,从而启动其他组件。

SPI声明统一存放在各个组件的classpath:/META-INF/spring.factories文件中,整个加载过程源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public ConfigurableApplicationContext run(Class<?> annotatedClass, String[] args) {
logger.debug("The input arguments is:{}, {}", annotatedClass, args);
AnnotationConfigApplicationContext context = null;
// Load other configurations in spring.factories file
ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
List<String> factoryNames = SpringFactoriesLoader.loadFactoryNames(ModuleConfiguration.class, classLoader);
List<Class> moduleConfigClasses = Lists.newArrayList();
moduleConfigClasses.add(XspringConfiguration.class);
if (CollectionUtils.isNotEmpty(factoryNames)) {
for (String factoryName : factoryNames) {
try {
Class factoryClass = ClassUtils.forName(factoryName, classLoader);
moduleConfigClasses.add(factoryClass);
} catch (ClassNotFoundException e) {
logger.warn("Can not find the matched class[{}] in classpath!", factoryName);
}
}
}
if (annotatedClass != null) {
moduleConfigClasses.add(annotatedClass);
}
Class[] configurations = moduleConfigClasses.toArray(new Class[moduleConfigClasses.size()]);
context = new AnnotationConfigApplicationContext(configurations);
context.start();
return context;
}

xspring-core组件还提供了一个基于Google Guava库的事件总线模型,有兴趣的朋友可直接参考org.xspring.core.eventbus包下的相关源码。

阅读全文 »

《推荐系统实践》笔记--好的推荐系统

发表于 2017-05-15 | 分类于 读书 |

什么是推荐系统

建立用户与物品之间的联系:在用户没有明确目的的情况下帮助他们发现感兴趣的物品;为物品找到可能对它们感兴趣的用户。

个性化推荐系统的应用

个性化推荐的成功应用需要两个条件:

  • 存在信息过载
  • 用户大部分时候没有特别明确的需求
  1. 电子商务:Amazon、阿里
  2. 电影和视频网站:Netflix、Youtube
  3. 个性化音乐网络电台:Pandora、Last.fm、豆瓣电台
    • 个性化音乐推荐的特点
      • 物品空间大(相对书与电影而言)
      • 消费每首歌的代价很小
      • 物品种类丰富
      • 听一首歌耗时很少
      • 物品重用率很高(每首歌用户会听很多遍)
      • 用户充满激情
      • 上下文相关
      • 次序很重要
      • 很多播放列表资源
      • 不需要用户全神贯注
      • 高度社会化
  4. 社交网络:Facebook、twitter、weixin、weibo
  5. 个性化阅读:GoogleReader、Flipboard、Zite、Digg
  6. 基于位置的服务(LBS)
  7. 个性化邮件
  8. 个性化广告
    • 个性化广告投放技术分三种
      • 上下文广告:如google的Adsense
      • 搜索广告
      • 个性化展示广告:如雅虎

延伸阅读:

  • Pandora研究人员关于音乐个性化推荐的演讲PPT
  • 搜索雅虎公司发表的与个性化广告有关的论文
阅读全文 »

ZooKeeper Administrator's Guide中文版

发表于 2017-05-07 | 分类于 Translation |

本文档主要介绍ZooKeeper部署及日常管理

安装部署

本章节包含与ZooKeeper部署有关的内容,具体来说包含下面三部分内容:

  • 系统软硬件需求
  • 集群部署(安装)
  • 单机开发环境部署(安装)

前两部分主要介绍如何在数据中心等生产环境上安装部署ZooKeeper,第三部分则介绍如何在非生产环境上(如为了评估、测试、开发等目的)安装部署ZooKeeper。

系统软硬件需求

支持的OS平台

ZooKeeper框架由多个组件组成,有的组件支持全部平台,而还有一些组件只支持部分平台,详细支持情况如下:

  • Client:它是一个Java客户端连接库,上层应用系统通过它连接至ZooKeeper集群。
  • Server:它是运行在ZooKeeper集群节点上的一个Java后台服务程序。
  • Native Client:它是一个用C语言实现的客户端连接库,其与Java客户端库一样,上层应用(非Java实现)通过它连接至ZooKeeper集群。
  • Contrib:它是指多个可选的扩展组件。
操作系统 Client Server Native Client Contrib
GNU/Linux D + P D + P D + P D + P
Solaris D + P D + P / /
FreeBSD D + P D + P / /
Windows D + P D + P / /
Mac OS X D D / /
阅读全文 »

JVM方法区(PermGen)内存快速飙升问题

发表于 2017-05-07 | 分类于 Java |

问题描述

自从平台升级到3.0后,应用的JVM变得非常不稳定,主要体现为以下三个问题:

  1. 内存泄漏:2G的JVM,2天就崩。
  2. 方法区内存持续飙升,最终导致频繁的触发FullGC
  3. class load频繁导致CPU有30%的资源浪费

解决方案

问题1解决思路:

问题1相对好解决,先用jmap将堆快照dump出来,用mat分析了下,根据GC-ROOT找到引用路径即可,泄漏原因为:平台自研JPA组件的SQLQuery在实现lazy load时,由于CGLib使用不当(在向当前线程注册回调方法拦截器时,在使用完之后未及时注销)导致的查询结果缓存被线程池中的线程引用,在线程池容量开得比较大时最终将导致OOM异常。

阅读全文 »

HA专题--Pacemaker集群日常管理命令

发表于 2017-04-29 | 分类于 HA |

概述

Pacemaker的管理工具主要有两种:crmsh、pcs(Pacemaker/Corosync configuration system),本文将同时介绍这两种命令行工具。

从CentOS6.4以后开始采用PCS替代crmsh来管理pacemaker集群(PCS专用于pacemaker+corosync的设置工具,其有CLI和web-based GUI界面)
文档来源于Pacemaker的Github官网

阅读全文 »
<i class="fa fa-angle-left"></i>12345<i class="fa fa-angle-right"></i>

24 日志
18 分类
33 标签
RSS
GitHub Weibo
我的收藏
  • Simiam
  • 并发编程网
  • Readhub
© 2015 - 2021 simiam  

闽ICP备18023112号

 

闽公网安备 35012102500070号