深入理解 RESTful 风格
前言大家对 RESTful 肯定不陌生,就算不知道它到底是什么,但肯定听过这个玩意。相信大家也很想知道 RESTful 能解决什么样的问题,有什么应用场景?看完本篇文章你就能明白:
在互联网并没有盛行的时代, 移动端也还没有发展起来,页面请求和并发量也不高,那时候人们对接口的要求并不高,一些常规的动态页面(JSP)就能满足大部分人们的需求。
但是随着移动设备和互联网的发展,人们对 Web 应用的需求也逐渐增加,传统的动态页面(JSP)也因效率低下而渐渐被 HTML + JavaScript(Ajax)的前后端分离所替代,而安卓、IOS、小程序等不同的客户端层出不穷,客户端的种类出现多元化,而客户端需要接口跟服务端进行通信,但接口的 规范性 就成了一个问题:
所以一套 结构清晰、符合标准、易于理解、扩展方便 并且让大部分人都能理解并接收的接口风格就显得尤为重要,而 RESTful 风格的接口(RESTful API)刚好符合以上标准,就逐渐被应用从而流行起来。
现在,RESTful 是目前最流行的接口设计规范,在很多公司有着广泛的使用。在开发实践中我们很多人可能还是使用传统 API ...
JUC 并发编程
什么是 JUC
JUC 是 java.util.concurrent 的简写。在 jdk 官方手册中可以看到 juc 相关的 jar 包有三个。
用中文概括一下,JUC 的意思就是 java 并发编程工具包
线程和进程
如果不能使用一句话说出来的技术,不扎实!
进程:一个程序,QQ.exe Music.exe 程序的集合
一个进程往往可以包含多个线程,至少包含一个!
Java 默认有几个线程? 2 个 main、GC
线程:线程是程序执行中一个单一的顺序控制流程
对于 Java 而言:Thread、Runnable、Callable
Java 真的可以开启线程吗? 开不了
1234567891011121314151617181920212223242526272829303132333435JAVApublic synchronized void start() { /** * This method is not invoked for the main method thread or "system" ...
Redis 集群部署案例设计
面试题:1~2 亿条数据需要缓存,请问如何设计这个存储案例?单机单台 100%不可能,肯定是分布式存储,用 redis 如何落地?
哈希取余分区
2 亿条记录就是 2 亿个 k,v,我们单机不行必须要分布式多机,假设有 3 台机器构成一个集群,用户每次读写操作都是根据公式:
hash(key) % N 个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。
优点
简单粗暴,直接有效,只需要预估好数据规划好节点,例如 3 台、8 台、10 台,就能保证一段时间的数据支撑。使用 Hash 算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。
缺点
原来规划好的节点,进行扩容或者缩容就比较麻烦了,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3 会变成 Hash(key) /?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可 ...
错误码及全局异常处理
写在前面在软件开发过程中,不可避免的是需要处理各种异常,在 Java 中,处理异常的方式一般就是采用try{...}catch{...}finally{...}代码块。在业务系统中,可能会有大量的异常处理代码块,这样不仅有大量的冗余代码,而且还影响代码的可读性。比较下面两张图:
可以看到,明显第二种的代码简洁,可读性高!此处的代码是在 Controller 层中的,在 Service 层中会有更多的异常处理代码块。
那么我们应该如何优雅的进行异常处理呢?
什么是统一异常处理在 Spring 里,我们可以使用@ControllerAdvice 来处理一些全局性的东西,最常见的是结合@ExceptionHandler 注解用于全局异常的处理。
@ControllerAdvice 是在类上声明的注解,其用法主要有三点:
@ExceptionHandler注解标注的方法:用于捕获 Controller 中抛出的不同类型的异常,从而达到异常全局处理的目的
@InitBinder注解标注的方法:用于请求中注册自定义参数的解析,从而达 ...
JDK8 新特性Stream
前言Java8 有一个非常显著的特点,就是提供了函数式编程,本文也将介绍 Java8 的几个新特性来实现函数式编程。学会这些 API 能够编写出简单、干净、易读的代码(尤其是对集合的操作)。Java8 新特性包括:
Lambda 表达式
Stream API
接口新特性
函数式接口(@FunctionalInterface)
默认方法(default)
Optional API
方法引用
JDK8 新特性
正在努力更新中…
函数式接口
只包含了一个抽象方法的接口,称为函数式接口(可以有多个非抽象方法)。可以使用@FunctionalInterface注解自定义声明
123456789101112131415JAVA//JDK 1.8 之前已有的函数式接口:- java.lang.Runnable- java.util.concurrent.Callable- java.security.PrivilegedAction- java.util.Comparator- java.io.FileFilter- java.nio.file.PathMatcher- java.lang ...
持续集成工具之 Jenkins
持续集成及 Jenkins 介绍软件开发生命周期软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了计划、开发、测试 和部署过程的集合。如下图所示 :
需求分析
这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部 或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。 还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。
设计
第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目 计划。计划可以使用图表,布局设计或者文者的方式呈现。
实现
第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进 行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。
测试
测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。
进化
最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修 改,bug 修复, ...
Git Flow 工作流
Git Flow 简介Git Flow 是构建在 Git 之上的一个组织软件开发活动的模型,是在 Git 之上构建的一项软件开发最佳实践。Git Flow 是一套使用 Git 进行源代码管理时的一套行为规范和简化部分 Git 操作的工具。
分支约定Git Flow 有主分支和辅助分支两类分支。其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织为了解决特定的问题而进行的各种开发活动。
主分支(长期分支)
master 可执行版本记录分支,上面的每个节点都是发布到线上的一个版本,具体的版本号由 tag 确定
develop 代码开发分支,所有开发
辅助分支(短期分支)
feature 详细功能分支,每个功能分支应该尽可能的小(最好一天以内),开发完成之后尽快移入仓库中
release 测试版本发布分支,同时接收该版本的 bugfix,直到稳定之后再发布到 master,并合并到 develop 中。
hotfix 紧急修复线上 bug 分支,直接从 master 的版本分出,同时最小版本号加 1。修复完成后发布一个最新版本,同时合并到 develop 中。
主分支
...
常用编程环境与开发工具安装手册
安装目录示分区大小而定,不可盲目复制命令进行安装!
安装 Docker 容器服务CentOS 安装123456789101112131415161718192021222324252627282930313233343536373839BASH# 1. 卸载旧的版本sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine# 2. 安装yum-utils包(提供 yum-config-manager 程序)sudo yum install -y yum-utils# 3. 设置镜像的仓库yum-conf ...
Lombok 消除冗余代码
前言Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务过程中冗余的代码,尤其是简单的 Java 模型对象(POJO)。而当我们如果在开发环境中使用 Lombok 开发插件后,可以省出重复构建,诸如 hashCode 和 equals 这样的方法以及各种业务对象模型的 accessor 和 ToString 等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生产这些方法,并没有如反射那样降低程序的性能。
可以用来帮助开发人员消除冗余的代码,对于一些简单的 Java 对象(POJO),它通过注释实现这一目的。
实现原理Lombok 的实现原理,基于 JSR269(Pluggable Annotation Processing API) 规范,自定义编译器注解处理器,用于在 Javac 编译阶段时,扫描使用到 Lombok 定义的注解的类,进行自定义的代码生成。
安装步骤在 IDEA 中,已经提供了 IntelliJ Lombok plugin 插件,方便我们使用 Lombok。安装方式很简单,只需要在 IDEA Plugins ...
Git分支管理规范
分支分类
根据生命周期区分
主分支:master,develop;
临时分支:feature/_,release/_,hotfix/*;
根据用途区分
发布/预发布分支:master,release/*;
开发分支:develop;
功能分支:
feature/*;
热修复分支:hotfix/*;
分支用途master 分支master 分支主要方稳定、随时可上线的版本。这个分支只能从别的分支上合并过来,一般来讲,从 develop 上合并,或者从 bugfix 分支上合并过来。不能直接在 master 分支上进行 commit 文件。因为是稳定的版本,所以每次版本发布都要在这个分支上添加标签(tag)。
develop 分支develop 分支是所有开发分支的母体,所有的开发分支都要从 develop 上切出来,开发完成之后最后都要合并到 develop 上。
hotfix 分支命名规则:hotfix/* –> hotfix/v+bug修复的版本号
hotfix 分支用来修复生产中的紧 ...