孙豪杰的博客

分布式程序设计早知道-关于分布式程序设计常见问题分析

虽然系统越来越复杂,以及新分布式架构设计的思想普及,越来越多的系统采用了分布式的架构,特别是HTTP为交互方式的接口调用,移动端和PC端的并行对分布式架构带来了很大的推动。各式各样的服务接口,在处理业务流程之外有一些共性的问题,正视设计和解决这些问题,会大大提高程序的可用性,扩展性和可维护性。

可扩展的运营后台架构设计

说起来运营后台,大家首先想到的就是增删改查,给公司内部人使用,出错了不要紧,等等想法。真的是这样吗?运营管理后台,是公司员工处理非常规操作,边界问题的工具,如果运营后台做的不够好,这些问题会向后反馈到程序员,程序员往往会采用修改代码,使用脚本,甚至直接操作数据库的手段处理问题。这个过程中会大大增加沟通成本,出错的概率,同时也会影响用户体验。

ELK(elasticsearch+logstash+kibana)实现Java分布式系统日志分析架构

日志是分析线上问题的重要手段,通常我们会把日志输出到控制台或者本地文件中,排查问题时通过根据关键字搜索本地日志,但越来越多的公司,项目开发中采用分布式的架构,日志会记录到多个服务器或者文件中,分析问题时可能需要查看多个日志文件才能定位问题,如果相关项目不是一个团队维护时沟通成本更是直线上升。把各个系统的日志聚合并通过关键字链接一个事务处理请求,是分析分布式系统问题的有效的方式。

POS万达电商的灵丹妙药

所以通过POS级可以获取用户的交易数据,通过交易返利可以促进用户使用自己的会员身份,提高会员的活跃度。通过POS可以连接线上的资源,比如积分,代金券等,真正的线上线下互通。所以当万达电商推出自己的POS机的时候,将会很快实现了王健林的大会员,大数据的万达电商目标。再这个基础之上,玩电商能玩的,玩用户想玩的,万达电商将实现线上线下一体化的新万达广场。

POS万达电商灵丹妙药。

Spring,Mybastis,,Mysql多数据源事务不回滚的问题解决

因为架构升级,导致同样的功能在两套完全的里的系统中分别提供,又因为不能完全切换,所以系统1.0和系统2.0的数据要做到同步,所以为实现数据一致性,所以开发了一套数据同步系统,涉及到了多个数据源,调试过程中有数据异常导致的部分数据没有插入成功,但是存在数据没有回滚的情况。
1、本类调用@Transactional注解的方法事务不其中用
2、部分数据库引擎不支持事务,比如Mysql的Myisam引擎。
3、Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚
4、多数据源事务不能完全回滚

[JavaWeb及时通讯项目实战]第四章-用户聊天功能实现

我们在上一章开发了在线用户列表功能,本章我们开发聊天功能。聊天功能主要包括聊天记录显示,聊天内容发送和聊天信息接收。在在线用户列表中非当前用户后面存在“聊天”,下面我们实现这个按钮的功能,点击时建立当前用户与该用户的聊天链接。在/js/master.js中添加实现,在master.vm中引入master.js方法。chat函数实现获取用户的聊天界面,包括聊天记录以及发送聊天信息界面,替换到id=chatDiv的div中,具体实现如下:

[JavaWeb即时通讯项目实战]第三章-用户列表展示

上一章我们实现了用户登录的功能,登录后可以查看所有在线用户,这样才可以选择与谁聊天,因此本章实现在线用户列表的功能。用户可能存在很多,需要对用户列表做分页展示,列表分页是一个共用性比较强的功能,因此我们把分页作为一个通用的模块开发。

[JavaWeb即时通讯项目实战]第二章-主界面与登录

为了演练我们前面学到的知识,因此我们做一个简单的及时通讯web项目,包括用户登录,用户在线列表,个人对个人聊天功能,设计界面如下(程序员出品必属渣品):
界面分为四部分:
1、登录框,无密码登录
2、在线用户列表,所有登录服务器的用户会显示在每个人的用户列表中
3、用户聊天记录,显示当前用户与另外一个用户的猎头记录,并在聊天过程中刷新聊天记录
4、用户聊天记录发送功能

[JavaWeb即时通讯项目实战]第一章-SpringMVC,Spring和Mybatis框架项目搭建

当我们直接使用servlet开发web功能时,每个新的连接需要在web.xml中配置,获取参数时需要使用request.getParameter(“name”)去获取数据,为了解决这些类似的任务,很多解决这些问题的工程被开发出来,我们称之为框架,我们这里使用Spirng MVC做为前端的框架。
在数据库访问层,入参和出参的映射也是一些类似而繁琐的功能,借助mybatis可以跟方便的完成这些功能。
在StudentListServlet中为了返回学生列表,我们在方法中创建业务对象StudentInfoBo,那么每次请求都会创建新的对象,这些直接创建的对象,是依赖的一种,StudentListServlet直接依赖StudentInfoBo,为了解除这种直接依赖实现类的方式,我们引入Spring管理对象的生命周期和依赖关系。

[JavaWeb教程]第四章-java数据库开发

内存中的数据在程序重启或者服务器重启时会丢失,所以数据需要保存在硬盘中,关系型数据库是比较常用的数据存储方式,采用二维表(行列)模型存储的方式更加容易理解,关系型数据库有很多oracle, mysql 和 sql server是比较常用的,java web项目中经常使用mysql作为数据库存储。
1、sql是面向表的语言,java是面向对象的语言,所以java通过jdbc访问数据库时,最好有一个映射类,把sql的操作封闭在Dao(database access object数据库访问层)层,而不向其他的java代码中扩散,因此这里创建了Po(persistent object 持久化对象)对象StudentPo,属性与表列一一对应。
2、java与mysql的交互是通过网络连接实现的,所以我们在执行操作之前需要与mysql建立连接,这里把建立连接的过程封装为一个静态方法中ConnectionUtil.getConnection();
Class.forName(driver); //classLoader,加载对应驱动
conn = (Connection) DriverManager.getConnection(url, username, password); //创建与mysql的连接,url为地址,username用户名,password密码。其中url的格式为jdbc:mysql://ip:端口/数据库名称?useUnicode=true&characterEncoding=UTF8,
”useUnicode=true&characterEncoding=UTF-8“设置字符传输编码方式为utf-8为了解决中文乱码问题。
3、数据的交互模式:
创建链接 ; Connection conn = ConnectionUtil.getConnection();
创建执行语句;pstmt = conn.prepareStatement(sql);
设置参数;pstmt.setInt(1, id);每个”?”表示一个参数,从1开始顺序设置。
执行语句;rowNum = pstmt.executeUpdate();更新(增删改)执行,返回影响的行数
pstmt.executeQuery();查询执行,返回结果集ResultSet
遍历结果集,把数据存储到PO中;rs.next()获取下一行,rs.getString(“name”)获取该行对应单元格的值。
关闭执行语句;pstmt.close();
关闭连接;conn.close();