Redis的安装、和SpringBoot的集成

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,内置了 复制,LUA脚本,LRU驱动事件,事务和不同级别的磁盘持久化, 并通过哨兵和自分区提供高可用性。

本文为Redis初体验,主要包括以下内容

1,在Centos中安装Redis
2,Redis的简单使用
3,构建Spring Boot Redis工程
4,遇到问题记录

查看更多

分享到

单元测试 之 Mockito

在软件开发中提及”mock”,通常理解为模拟对象。

为什么需要模拟? 在我们一开始学编程时,我们所写的对象通常都是独立的,并不依赖其他的类,也不会操作别的类。但实际上,软件中是充满依赖关系的,比如我们会基于service类写操作类,而service类又是基于数据访问类(DAO)的,依次下去,形成复杂的依赖关系。

单元测试的思路就是我们想在不涉及依赖关系的情况下测试代码。这种测试可以让你无视代码的依赖关系去测试代码的有效性。核心思想就是如果代码按设计正常工作,并且依赖关系也正常,那么他们应该会同时工作正常。

有些时候,我们代码所需要的依赖可能尚未开发完成,甚至还不存在,那如何让我们的开发进行下去呢?使用mock可以让开发进行下去,mock技术的目的和作用就是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。

我们可以自己编写自定义的Mock对象实现mock技术,但是编写自定义的Mock对象需要额外的编码工作,同时也可能引入错误。现在实现mock技术的优秀开源框架有很多,Mockito就是一个优秀的用于单元测试的mock框架。Mockito已经在github上开源,详细请点击:https://github.com/mockito/mockito

除了Mockito以外,还有一些类似的框架,比如:

  1. EasyMock:早期比较流行的MocK测试框架。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常
  2. PowerMock:这个工具是在EasyMock和Mockito上扩展出来的,目的是为了解决EasyMock和Mockito不能解决的问题,比如对static, final,private方法均不能mock。其实测试架构设计良好的代码,一般并不需要这些功能,但如果是在已有项目上增加单元测试,老代码有问题且不能改时,就不得不使用这些功能了
  3. JMockit:JMockit 是一个轻量级的mock框架是用以帮助开发人员编写测试程序的一组工具和API,该项目完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来修改Java的Bytecode

查看更多

分享到

单元测试 之 JUnit

单元测试是在编程和重构中被极力推荐使用的,可以大大的提高开发的效率(这里的效率需要综合计算后续可维护性,已经出现BUG重复修改等下,而不简单单是开发时间)。但是实际上编写测试代码也是需要耗费很多的时间和精力的,有的时候甚至要比编写代码本身花费的时间还要多,所以如何写好单元测试用例是一门很深奥的学问。

好的测试用例应该具有以下四种特性:

  1. 正确性
    程序中的每一项功能都是测试来验证它的正确性,是后续维护代码、重构代码的保证。
  2. 设计性
    编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。
  3. 指导性
    单元测试应该具有指导性,类似于文档,是对函数或类使用的最佳实践。而且,这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。
  4. 回归性
    自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。

后续我将用一系列的博客,来记录如何对于Java代码来做单元测试,本文先从最基础的JUnit做起,先来学习基本的工具的使用。

查看更多

分享到

Spring Cache 入门

缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。

通常来说,缓存适用于:

  1. 你愿意消耗一些内存空间来提升速度。
  2. 你预料到某些键会被查询一次以上。
  3. 缓存中存放的数据总量不会超出内存容量。
  4. 如果你的场景符合上述的每一条,就适合使用缓存。

Spring Cache 可以基于注释(annotation)配置,对业务代码侵入极小,但却具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如 EHCache 集成。

查看更多

分享到

使用Openssl为Nginx生成证书

我们在企业中,在使用到证书时,一般需要先生成“证书请求”(后缀大多为.csr),它包含你的名字和公钥,然后把这份请求交给诸如verisign等有CA服务公司(当然,连同几百美金),你的证书请求经验证后,CA用它的私钥签名,形成正式的证书发还给你。管理员再在web server上导入这个证书就行了。浏览器内置了很多商业的权威CA,所以你的网站是经过认证的。

而如果在企业内部网站有很多,很有可能公司会自己做CA。公司会先配置CA的私钥和公钥,私钥保存,自签CA,公钥则可以公开。而每个服务器需要生成证书请求提交给公司CA进行签发。这种情况下,访问内部网站时需要自行在客户端需要导入CA证书到受信任的颁发机构。

下面我们将介绍如何生成CA,如果使用CA签名证书,

查看更多

分享到

在Window下安装CentOS并安装Nginx、OpenResty

本文记录了在window上利用VMware虚拟机安装CentOS并且在CentOS里面安装Nginx、OpenResty的过程

主要分为以下四步:

1,在Windows上安装VMware Workstation
2,图解在VMware上安装CentOS
3,在CentOS上安装OpenResty
4,解决Windows下无法访问虚拟机的问题(通过配置iptables)
5,最后介绍使用make方式安装nginx

查看更多

分享到

Docker 入门

Docker是什么,能做什么?

Docker是一种虚拟化技术,是在操作系统上虚拟出的一个可移植的轻量容器,这个容器有独立的进程、权限、资源、网络等等。Docker能

  1. 隔离应用依赖
  2. 创建应用镜像并进行复制
  3. 创建容易分发的即启即用的应用
  4. 允许实例简单、快速地扩展
  5. 测试应用并随后销毁它们
  6. PaaS

查看更多

分享到

Spring 之 重试框架[spring-retry]

spring-retry项目实现了重试和熔断功能,目前已用于SpringBatch、Spring Integration等项目。

RetryOperations定义了重试的API;
RetryTemplate提供了线程安全的模板实现,同于Spring 一贯的API风格,RetryTemplate将重试、熔断功能封装到模板中,提供健壮和不易出错的API供大家使用。
RecoveryCallback定义了重试操作;
RetryState用于定义有状态的重试。

查看更多

分享到

Nginx实战 之 灰度发布

灰度发布(又名金丝雀发布,英文一般称为GrayRelease或Dark launch)是为了能够让用户逐步过渡到新功能一种发布方式。 一般是产品上线一个功能,希望在线上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

优点

  • 灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
  • 灰度发布可以让部分用户尽快体验到最新的功能,提高用户的积极性,进而收集用户反馈改善产品。

灰度发布在谷歌和Facebook等很多公司已经使用的相当成熟,具体的分流规则也有很多,下面简单介绍下几种常见的分流规则,并分别使用nginx来配置实现。

查看更多

分享到

Java8 之 CompletableFuture

使用CompletableFuture的有以下好处:

  1. 使用CompletableFuture类提供的特性可以创建异步任务、为客户提供异步API。
  2. 使用CompletableFuture可以以改善程序的性能,加快程序的响应速度。尤其是在执行比较耗时的操作时,例如调用一个或多个远程服务。
  3. CompletableFuture类还提供了异常管理的机制,让你有机会抛出/管理异步任务执行中发生的异常。
  4. 将同步API的调用封装到一个CompletableFuture中,你能够以异步的方式使用其结果。
  5. 如果异步任务之间相互独立,或者它们之间某一些的结果是另一些的输入,你可以将这些异步任务构造或者合并成一个。
  6. 你可以为CompletableFuture注册一个回调函数,在Future执行完毕或者它们计算的结果可用时,针对性地执行一些程序。
  7. 你可以决定在任意时候结束程序的运行,是等待由CompletableFuture对象构成的列表中所有的对象都执行完毕,还是只要其中任何一个首先完成就中止程序的运行。

查看更多

分享到