花辭

風月不瘦,雖以千年後。


  • 首頁

  • 關於

  • 標籤

  • 分類

  • 歸檔

  • 站點地圖

  • 公益404

Spring基本应用示例

發表於 2016-07-15 | 分類於 应用实践 | | 閱讀次數:

消息转换器

在Spring中org.springframework.http.converter.HttpMessageConverter规范中定义了Http请求和响应的消息转换规范, 我们知道SpringMvc可以接收不同的消息形式,也可以将不同的消息形式响应回去(最常见的是json);这些消息所蕴含的”有效信息”是一致的,那么各种不同的消息转换器,都会生成同样的转换结果. 至于各种消息间解析细节的不同,就被屏蔽在不同的HttpMessageConverter实现类中.

SpringMVC中使用FastJson作为转换器

通过SpringMvc中message-converts配置FastJson作为转换器

閱讀全文 »

MockMvc做接口测试

發表於 2016-07-15 | 分類於 应用实践 | | 閱讀次數:

MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便, 最方便的是对于客户测试,不需要启动服务器即可测试我们的Rest Api。

SpringMVC编写Rest示例

Controller示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Controller
@RequestMapping(value = "/test")
public class TestWebController {

@ResponseBody
@RequestMapping(value = "/list", method = {RequestMethod.GET})
public List getMock(@RequestParam(name = "id", required = false, defaultValue = "l0") String id) {
return Arrays.asList("l1", "l2", "l3", id);
}

@ResponseBody
@RequestMapping(value = "/pust", method = {RequestMethod.POST})
public Object postMock(@RequestBody Object data) {
return ImmutableMap.<String, String>builder().put("data", JSON.toJSONString(data)).build();
}

@RequestMapping(value = "/view", method = {RequestMethod.GET})
public ModelAndView viewMock(){
return new ModelAndView("index");
}
}
閱讀全文 »

SpringSession介绍

發表於 2016-07-15 | 分類於 应用实践 | | 閱讀次數:

生产环境我们的应用示例不可能是单节点部署, 通常都是多结点部署, 结点上层会进行域映射, 实例之间负载响应请求. 比如常见的Nginx + Tomcat负载均衡场景中。常用的均衡算法有IP_Hash、轮训、根据权重、随机等。不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题。

解决方案

IP_HASH

nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个. 这样如果该类QPS高会导致该台服务器的负载升高,负载不均.

nginx基于ip_hash的session管理方案

通过容器插件

在容器层面扩展可共享存储的插件; 比如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等。好处是对项目来说是透明的,无需改动代码。该方案由于过于依赖容器,一旦容器升级或者更换意味着又得从新来过。并且代码不在项目中,对开发者来说维护也是个问题。

閱讀全文 »

SpringAsync异步编程

發表於 2016-07-01 | 分類於 应用实践 | | 閱讀次數:

Spring为任务调度与异步方法执行提供了注解支持。通过在方法上设置@Async注解,可使得方法被异步调用。也就是说调用者会在调用时立即返回,而被调用方法的实际执行是交给Spring的TaskExecutor来完成。

Async示例

定义接口

1
2
3
4
5
6
public interface IDemoService {

public String syncServiceInvoke() throws Exception;

public String asynServiceInvoke() throws Exception;
}
閱讀全文 »

Lombok簡化模板代碼

發表於 2016-06-19 | 分類於 应用实践 | | 閱讀次數:

Lombok可以做到对已有Java代码在字节码层级的改变,它的目的在于让程序员少写一些“样板代码”;所谓样板代码是那些没有营养,却又不得不写的代码;像实体中定义的getter、setter、equals、hashcode、toString等方法).

  • 官方地址:https://projectlombok.org/
  • 工程依赖:https://projectlombok.org/mavenrepo/index.html

Intelli IDEA安装Lombok插件

1.【Intelli IDEA】- 【Preferences】-【plugins】

  1. 搜索lombok,点击install.
閱讀全文 »

分布式文件系统FastDFS

發表於 2016-06-01 | 分類於 运维部署 | | 閱讀次數:

分布式文件系统:Distributed file system, DFS,又叫做网络文件系统:Network File System。一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。

FastDFS是用c语言编写的一款开源的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合中小文件(建议范围:4KB < file_size <500MB),对以文件为载体的在线服务,如相册网站、视频网站等。

FastDFS 架构

FastDFS架构包括Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。

閱讀全文 »

Java8 常用工具示例

發表於 2016-05-27 | 分類於 应用实践 | | 閱讀次數:

本篇采用示例的形式展示Java8的常见特性应用.

线程写法

Java8之前

1
2
3
4
5
6
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("自定义线程");
}
}).start();

Java8写法

1
2
3
new Thread(()-> {
System.out.println("自定义线程");
}).start();
閱讀全文 »

Guava 常用操作示例

發表於 2016-05-27 | 分類於 应用实践 | | 閱讀次數:

本篇采用示例的形式展示Guava的常见工具应用.

Guava集合排序

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<Integer> list = Arrays.asList(1, 2, 6, 7, 11, 9, 10, 4);
System.out.println("原始集合:" + list);
// 有空元素放置到最后
System.out.println("自然正序:" + Ordering.natural().nullsLast().sortedCopy(list));
// 按照自然排序然后翻转, 有空元素排到最后
System.out.println("自然逆序:" + Ordering.natural().reverse().nullsLast().sortedCopy(list));
// 获取集合最大元素
System.out.println("最小元素:" + Ordering.natural().max(list));
// 获取集合元素中最大的3个元素
System.out.println("最大元素:" + Ordering.natural().greatestOf(list, 3));
// 获取集合最小元素
System.out.println("最小元素:" + Ordering.natural().min(list));
// 获取集合元素中最小的3个元素
System.out.println("最小元素:" + Ordering.natural().leastOf(list, 3));

执行输出

1
2
3
4
5
6
7
原始集合:[1, 2, 6, 7, 11, 9, 10, 4]
自然正序:[1, 2, 4, 6, 7, 9, 10, 11]
自然逆序:[11, 10, 9, 7, 6, 4, 2, 1]
最小元素:11
最大元素:[11, 10, 9]
最小元素:1
最小元素:[1, 2, 4]
閱讀全文 »

理解Java-Object类

發表於 2016-03-27 | 分類於 语言语法 | | 閱讀次數:

Java中的Object有哪些公用方法

1.clone方法

保护方法, 创建并返回此对象的一个副本, 用于实现对象的浅复制, 只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常;
JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这时就需要在类中复写clone方法.

2.getClass方法

final方法,返回一个对象的运行时类。

3.toString方法

返回该对象的字符串表示, 该方法用得比较多,一般子类都有覆盖。

閱讀全文 »

理解Java-面向对象

發表於 2016-03-27 | 分類於 语言语法 | | 閱讀次數:

面向对象三大特征和七大原则

三大特征

封装

封装就是对属性和方法的载体类,只能通过其提供的接口(方法)来访问,而把实现细节隐藏起来.也就是说,具体实现对程序员来说是透明的,封装的好处在于对类内部的改变,不会影响到其他代码

  • 封装的做法: 私有属性(private修饰符修饰属性)、提供public的读(getXX)写(setXX)方法、在构造中调用方法.所有的非常量属性基本都需要封装.
  • 封装的好处:隐藏类的实现细节、对所有用户提供统一的接口、增强执行效果、易于维护和扩展
閱讀全文 »
1…345…7
蘇若年

蘇若年

64 文章
13 分類
71 標籤
RSS
© 2019 HuntsWork
由 Hexo 強力驅動
|
主題 — NexT.Pisces v5.1.4