分类目录归档:系统运维

系统部署相关服务信息,服务器知识积累!

硬盘序列号获取之坑

前言:

发文近些年越来越少,这并非自己所愿。但是确实感觉没什么好写的,尤其是工作中遇到的一些问题,如果很容易Google到答案,那我是肯定不会再自己赘述一遍的。再就是感觉工作愈发枯燥,心里也是惴惴不安,如果工作环境,内容,团队,缺乏激情,就应该慎重考虑一下了!这样并不是自己想要的~恰巧工作中遇到的这个问题,解决费了很大功夫,并且Google,Baidu上资料很少,没有找到现成的解决方案,所以就有了此文。以希望后来人遇到此问题时,能检索到此文,给予帮助。

场景:

首先场景时发生在自己写的量化交易客户端软件上,券商交易,要求记录用户操作计算机的IP,网卡MAC地址,硬盘序列号信息。其中IP与网卡MAC地址是很容易获取到的,硬盘序列号其实获取也不难,只不过在低版本Windows系统行就有了坑,比如Windows7,通过相关命令获取到的并不是真正的序列号,而是经过每4位HEX字符经过little endian的总长为40为的字符串。比如:

命令:wmic diskdrive get serialnumber | wmic path win32_physicalmedia get SerialNumber | wmic path Win32_DiskDrive get SerialNumber
结果:32535554574e4741314134313532204a20202020

而通过专业软件获取到的真实硬盘序列号:S2TUNWAGA11425J

继续阅读

Nginx(Tengine)实现Tomcat热部署与负载均衡

业务背景

主要需求是系统更新期间实现热部署,提供不间断服务。其次是为多个应用服务器(Tomcat)实现负载均衡的效果。另外还需要开启https访问,同事支持http与https同时访问,并根据不同的访问请求转发到Tomcat不同的端口。

软硬件需求

Tengine(淘宝开源Nginx服务器) * 1,Tomcat7.53 * 2,服务器IP:192.168.64.166

实现细节

1.编译Nginx

首先下载Nginx服务器,地址:http://tengine.taobao.org
如下编译:
本次应用中需要用到HTTPS服务,所以在编译时需要特殊加入 –with-http_ssl_module。

继续阅读

Java模拟Http访问

Java模拟Http访问将返回的JSON解析为Bean对象

应用场景:某系统访问另一个系统获取一些数据,其中这些返回数据类型必须是JSON格式,接受系统可以将结果转换为简单的Bean对象,也可以将返回的是集合数据转换成List。这就需要我们模拟一个Http访问,然后处理返回的JSON数据。

方案选型:看了看网上的很多Demo,都是比较老的。其中应用的apache的框架现在也已经找不到了。所以决定亲自去apache官网去看看。发现以前的httpclient包已经独立出来命名为Apache HttpComponents。当前最新包为4.3.3。我采用的是OSChinaMaven源,还不错,已经有资源了。而JSON解析才用了最为流行的Jackson

Demo示例:

Test.java 返回的JSON数据将要被解析成为的对象类 继续阅读

Annotation与SpEL实现系统记录操作日志

先说几句废话吧。最近工作比较混乱,一遍研究着Hadoop,一遍搞着另外一个系统的开发。这段时间,一心想写点技术文章却迟迟没能提笔。今天终于,打开音乐播放器,戴上耳机。享受着宁静的夜晚与指尖跃起的文字。甚至于还想着,什么时候才能有合适的机会回到山东,守在爸妈身边。好了,废话不多说了,开始记录正文。

需求:

系统中的一个模块属于关键区,它所有的操作主要针对修改与删除是要求记录下日志来的。而这个记录的日志并不是像我们把它们打印在log文件里,而是需要标准的记录到数据库中。以便于后来专门日志操作模块的查询。

思考: 继续阅读

了解一下JMS

1. JMS基本概念

(1)JMS(Java Message Service)是访问企业消息系统的标准API,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。(2)Java消息服务(Java Message ServiceJMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 

2. JMS基本功能

JMS是用于和面向消息的中间件相互通信的应用程序接口。它既支持点对点(point-to-point)的域,又支持发布/订阅(publish/subscribe)类型的域,并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。Java消息服务的规范包括两种消息模式,点对点和发布者/订阅者。许多提供商支持这一通用框架因此,程序员可以在他们的分布式软件中实现面向消息的操作,这些操作将具有不同面向消息中间件产品的可移植性。

Java消息服务支持同步和异步的消息处理,在某些场景下,异步消息是必要的;在其他场景下,异步消息比同步消息操作更加便利。

Java消息服务支持面向事件的方法接收消息,事件驱动的程序设计现在被广泛认为是一种富有成效的程序设计范例,程序员们都相当熟悉。 继续阅读

定制eclipse的SVN插件subclipse

需求背景:项目进行到AT阶段,Source的移管已经不是轻易的Submit能解决的了。专门人员负责开发版Source和AT服务器端Source的更新操作,而作为一个Bug Fixer那只能将你的Source建立Tags,让负责人员把你的Source慎重的移送到AT环境中去。而这一个过程中建立Tag也是有一定规则的,不能乱建。例如:http://www.uugu.org/uugu/trunk/tags/RES_SIR_(BugID)_(YYYYMMDD)/src/***/UserAction.java
而针对这样一个Tag,每次我们都需要去修改它的BugID,日期,还有单个文件时需要在URL最后面手动添加文件名。这样的操作势必在我这个懒人眼里是那么的浪费时间!!!因此,我想到修改eclipse的SVN插件subclipse。

需求:每次建立Tag时,只要选择文件右键Team->Branch/Tag…,在打开的窗口中需要自动生成上面格式的URL,而其中的BugID,日期以及文件名也都需要动态改变。当然,建立第一个Tag时其中的BugID还是需要自己去填写的,仅仅是以后同一个BugID的Tag不需要修改了。只需要一路下一步即可。
继续阅读

Nginx的反向代理负载均衡

       最近工作未正式进入开发,相对来说比较清闲,突然想起了Nginx,然而它大多时候都是和PHP一块出现的,相对于我们这些做Java常用的Tomcat用到的比较少。前段时间看了部分负载均衡的技术文摘,想到了用Nginx做反向代理,将Tomcat集群归并起来有Niginx做代理进行访问的控制和转发的负载处理。

  网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自Web前端的压力,也能让人十分头痛。怎样将同一个域名的访问分散到两台或更多的机器上呢?这其实就是另一种负载均衡了,Nginx自身就可以做到,只需要做个简单的配置就行。 继续阅读

软件设计原则(二)

Common Closure PrincipleCCP)– 共同封闭原则

一个包中所有的类应该对同一种型的化关。一个化影响一个包,便影响了包中所有的。一个更短的法是:一起修改的应该组合在一起(同一个包里)。如果必修改用程序里的代,我希望所有的修改都生在一个包里(修改关),而不是遍布在很多包里。CCP就是把因某个同的原因而需要修改的所有类组一个包里。如果2从物理上或者从概念上系得非常密,它通常一起生改,那么它们应该属于同一个包。

CCP延伸了开OCP)的“关”概念,当因某个原因需要修改,把需要修改的范限制在一个最小范内的包里。

参考:http://c2.com/cgi/wiki?CommonClosurePrinciple 继续阅读

软件设计原则(一)

    51cto上看到一篇不错的总结性文章,关于软件设计原则的,这些原则,每一个程序员都应该了解。但是请不要教条主义,在使用的时候还是要多多考虑实际情况。其实,下面这些原则,不单单只是软件开发,可以推广到其它生产活动中,甚至我们的生活中。 

Dont Repeat Yourself (DRY)

DRY是一个最简单的法则,也是最容易被理解的。但它也可能是最难被应用的(因为要做到这样,我们需要在泛型设计上做相当的努力,这并不是一件容易的事)。它意味着,当我们在两个或多个地方的时候发现一些相似的代码的时候,我们需要把他们的共性抽象出来形一个唯一的新方法,并且改变现有的地方的代码让他们以一些合适的参数调用这个新的方法。

参考:http://en.wikipedia.org/wiki/Don%27t_repeat_yourself 继续阅读

递归查询森林结构所有子节点

近期工作上遇到了这样一个需求,一张表用来存储树形结构的父节点和叶子节点,大体是这样定义的。

Table定义如下:

id groupid nodeid other
1 A001 A0001 ~~
2 B001 B0001 ~~
3 A0001 A00001 ~~
4 C001 C0001 ~~
5 C001 C0002 ~~

需求很简单:这张表表示的是一个数结构,其中groupid代表的是父节点,而nodeid代表的是相应的子节点,我们想要的是整个树结构的全部叶子节点。当然涉及到多棵树,就组成了森林结构,也就是查找指定森林结构的所有叶子节点。

思路也很Easy:遍历每一颗树,利用写好的递归查询函数去查询每棵树的最终叶子结点,然后把它们保存到静态list中。

详细代码如下: 继续阅读