自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Sam_Deep_Thinking

努力深入思考和总结

  • 博客(305)
  • 资源 (1)
  • 问答 (12)
  • 收藏
  • 关注

原创 SpringBoot Controller Post接口单元测试

概述在日常的开发中,我们一般会定义一个service层,用于实现业务逻辑,并且针对service层会有与之对应的齐全的覆盖率高的单元测试。而对于controller层,一般不怎么做单元测试,因为主要的核心业务逻辑都在service层里,controller层只是做转发,调用service层接口而已。但是还是建议使用单元测试简单的将controller的方法跑一下,看看转发和数据转换的代码是否能...

2018-10-31 09:49:32 19739

转载 转载酷壳-技术人员的发展之路

转载酷壳上的一篇文章:技术人员的发展之路,其中对我影响最大的一个段落是:2、去真正的创业公司去顶尖公司和去创业公司在某些时候并不冲突。不过,这里我想讲的是,一个技术能力强的人在大公司可能会被埋没掉。因为大公司业务成功后,成功的公司在招聘各种高级技术人才都不会成为问题,于是少你一个不少,多你一个不多。成功的公司其整个技术体系已经完成,Legacy的问题也比较多,所以,可以供你发挥的余地不大...

2018-10-28 13:56:09 538

原创 下单接口调优实战,性能提高10倍

概述最近公司的下单接口有些慢,老板担心无法支撑双11,想让我优化一把,但是前提是不允许大改,因为下单接口太复杂了,如果改动太大,怕有风险。另外开发成本和测试成本也非常大。对于这种有挑战性的任务,我向来是非常喜欢的,因为在解决问题的过程中,可以学习到很多东西。当时我只是知道下单接口慢,但是没人告诉我慢在哪里,也即是说,哪些瓶颈导致下单接口慢了。其实没人知道也没关系的,因为我们可以通过压测...

2018-10-19 12:15:13 8907 25

原创 优秀互联网高级测试工程师应该具备的能力

优秀互联网高级测试工程师应该具备的能力概述在之前写的互联网高级测试工程师至少具备的能力一文中,提到了测试工程师至少具备的能力,但是并没有提到优秀测试工程师应该具备的能力,下文简单的谈一谈。当然这些全部都是我的个人理解。能发现问题,还能定位问题,而且能给研发解释得清楚在实际的工作中,你可能会遇到很多测试人员在测试功能模块的时候,一遇到问题,马上就来找开发,由开发来定位问题。测试人员发...

2018-10-18 12:28:23 6928 7

原创 SpringCloud Edgware.SR3版本-Ribbon的timeout设置

概述Spring Cloud中,客户端的负载均衡使用的是Ribbon,Ribbon的超时时间默认很短,需要进行调整。Spring Cloud版本Edgware.SR3Ribbon timeout设置Ribbon的默认timeout时间是1秒,这个可以在RibbonClientConfiguration类中看到。public class RibbonClientConfigu...

2018-10-17 10:39:08 3458 1

原创 线上单台Eureka升级到3台Eureka高可用

概述由于前段时间,公司业务发展快,接了太多的业务需求了,没有时间把Eureka搞成高可用的,先用一台Eureka应付。当时由于流量还不大,不会出现问题。但是最近一个月,流量逐渐增大,老板担心万一单台Eureka挂了,服务会用不了。让我赶紧升级成3台Eureka,并两两注册,做到高可用。下面就把升级的过程说一下。未升级前单台Eureka上,只有购物车这个服务提供方,共两台。升级步骤...

2018-10-11 08:53:01 2821

原创 DDD领域驱动设计资料

概述之前我写过一篇Spring Cloud工程模块划分文章,里面提到可以用DDD来划分模块和组织代码,但是对此我也没有仔细研究过,最近有点想在小的项目里尝试一下DDD,故研究了很多文章,下面列出我觉得写的不错的文章。资料领域驱动设计在互联网业务开发中的实践(美团)阿里盒马领域驱动设计实践斑斓(DDD大神的个人博客)...

2018-09-30 10:20:54 1316

原创 找了些关于eureka注册中心高可用的文章

概述最近在研究注册中心高可用,打算把线上的单台注册中心升级为三台注册中心,并两两注册。找了一些相关的资料,记录一下。资料Eureka 源码解析 —— 应用实例注册发现(四)之自我保护机制了解Spring Cloud Eureka Server自我保护和更新阈值The Mystery of Eureka self-preservationService Discovery: Eu...

2018-09-30 09:56:41 496

原创 Junit 5中@ParameterizedTest结合@EnumSource

概述有时候业务代码里会根据一个枚举值来区分业务场景,比如说:public enum ActivityLimitEnum { LIMIT(1,"封顶"), UNLIMIT(0,"上不封顶");}如果编写单元测试来验证业务代码,至少需要写两个测试方法,一个验收封顶逻辑,一

2018-09-20 11:33:28 2152 1

原创 Spring Boot单元测试中使用mockito框架mock掉整个Redis

概述当我们使用单元测试来验证应用程序代码时,如果代码中需要访问Redis,那么为了保证单元测试不依赖Redis,需要将整个Redis mock掉。在Spring Boot中结合mockito很容易这点,如下代码:import org.mockito.Mockito;import org.springframework.context.annotation.Bean;import org....

2018-09-18 18:17:35 17316 1

转载 转载李学凯一篇Intellij IDEA的文章

这篇文章虽然是16年写的,但是目前看来,还是非常经典,值得好好读读,提高操作IDEA的效率。IntelliJ IDEA 详细图解最常用的配置 ,适合刚刚用的新人...

2018-09-14 09:47:19 796

原创 Spring Cloud工程模块划分

Spring Cloud工程模块划分现在网络上都在讲Spring Cloud的各个组件,但当我们自己也把Spring Cloud引入进来的时候,却发现第一个要解决的问题是:工程的模块如何划分在之前我写过一篇重构购物车的过程的文章,下面就以这个购物车工程,来说明当时我是如何思考和如何做的。工程要分几个模块API模块当时的购物车工程是基于Spring...

2018-08-28 16:37:56 18881 1

原创 重构购物车的过程

背景公司目前所有的核心业务都在一个应用中,属于单体应用,随着业务的快速发展和开发人员的不断增加,单体应用的开发模式就开始暴露出各种各样的问题。经历过这个过程的开发人员,想必深有体会。我举个最近才遇到的一个例子。今年的八月份,有5个大需求要在同一天上线,由于只有一个单体应用,5个需求又都不同,因此拉了5个开发分支,对应5个需求。好了,在八月的某个相同时间段,各个测试人员都要开始测试自己负...

2018-08-26 15:31:31 2145 2

原创 Python基础学习-异常的检测和处理

捕获异常# 对数字变量使用append操作a = 123a.apppend(4)执行这个程序时,会抛出:AttributeError: 'int' object has no attribute 'apppend'我们使用try:except语句进行捕获。# 捕获异常a = 123try: a.apppend(4)except AttributeEr...

2018-06-26 14:01:05 982

原创 Python基础学习-文件操作

最简单的写文件操作# 往文件里面写数据file1 = open("test.txt", "w", encoding="utf-8")file1.write("Sam哥哥")file1.close()使用open方法,打开文件

2018-06-21 09:26:53 634

原创 Python基础学习-字典以及字典推导

字典# 空字典map1 = {}print(type(map1))# 给字段赋值map2 = {'x': 1, 'y': 2}print(map2)# 给字典添加值map2['z'] = 3print(map2)输出结果:<class 'dict'>{'x': 1, 'y': 2}{'x': 1, 'y': 2, 'z': 3}字典推...

2018-06-20 09:32:39 427

原创 Python基础学习-条件与循环

if语句最简单的if语句# 定义age变量age = 12# 最简单的if语句if age == 12: print("age等于12")输出结果如下:age等于12python语法比较简洁,if语句里面无需小括号,也无需大括号。但是注意,if语句的最后面,也加上一个冒号。if else 语句# 定义age变量age = 13# 最...

2018-06-18 19:29:10 401

原创 Python基础学习-序列

序列的概念 序列是指它的成员都是有序排列,并且可以通过下标偏移量访问到它的一个或几个成员。像字符串、列表和元祖都属于序列。字符串: “xxxxyyy”列表: [“aa”,”bb”]元祖: (”abc”,”def”)比如对一个字符串的处理:# 定义变量s,存储字母s = "abcdefghijk"# 通过下标0获取第一个字母print(s[0])# 通过...

2018-06-18 18:57:18 741

原创 Python基础学习-基础语法

数据类型整数(int) 浮点数(float) 字符串(str) 布尔值(bool) 区分数字类型我们可以使用type()方法来区分数字类型。# 字符串print(type("111"))print(type("中国"))# 数字print(type(1))# 浮点数print(type(2.2))# bool类型...

2018-06-16 16:23:48 484

原创 Intellij IDEA神器那些让人爱不释手的小技巧

概述在2018年5月6日写了一篇介绍IntellIJ IDEA的文章,Intellij IDEA神器居然还有这些小技巧,主要是列出一些平时大家可能没用过或者没怎么用,但是又非常好用的IntellIJ IDEA小技巧。由于篇幅原因,只是列出了一小部分,那么接下来的这篇文章,会继续补充一些IntellIJ IDEA的小技巧。别轻易自定义快捷键有蛮多操作,IntellIJ I...

2018-06-03 22:47:16 41856 14

原创 遇到过的判断营销活动状态的两种方案

利用活动开始时间和结束时间像天猫、京东、唯品会,经常会推出各种各样的营销活动来吸引用户购买,营销活动是有状态的,一般来说,有以下几种状态。 活动未开始,活动已开始、活动已结束、活动已废弃活动未开始、已开始、已结束,这三个状态可以使用活动开始时间和活动结束时间来得出。public int getActivityState(Activity activity,Date cur...

2018-05-20 12:17:28 2941

原创 犯了个低级错误:mybatis中在select标签中用了update语句

概述昨晚想使用类似下面的语句防并发问题: update xxxxx set state= 1 where id = 1 and state= 0这样万一有线程并发修改state,那么只有一个线程能拿到大于0的影响行数。谁知一调用就报如下错误:attempted to return null from a method with a primitive return t...

2018-05-19 10:35:25 8632 9

原创 推荐一个Intellij IDEA插件--Key Promoter X

概述Key Promoter X 是一个提示插件,当你在IDEA里面使用鼠标的时候,如果这个鼠标操作是能够用快捷键替代的,那么Key Promoter X会弹出一个提示框,告知你这个鼠标操作可以用什么快捷键替代。对于想完全使用快捷键在IDEA的,这个插件就很有用。安装这个插件很简单,只需要打开Settings,然后找到Plugins那一栏目,然后输入key promoter,如果找不到...

2018-05-16 08:31:35 52082 13

原创 Intellij IDEA神器居然还有这些小技巧

概述Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜。出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intellij IDEA技巧分享给大家。本文是这个系列的第一篇,主要介绍一些你可能不知道的但是又实用的小技巧。我最爱的【演出模式】我们可以使用【Presentation Mode】,...

2018-05-06 13:17:01 47707 33

原创 Spring Cloud Config结合Bus实现分布式配置中心

概述假设现在有个需求: 我们的应用部署在10台机器上,当我们调整完某个配置参数时,无需重启机器,10台机器自动能获取到最新的配置。如何来实现呢?有很多种,比如: 1、将配置放置到一个数据库里面,应用每次读取配置都是直接从DB读取。这样的话,我们只需要做一个DB变更,把最新的配置信息更新到数据库即可。这样无论多少台应用,由于都从同一个DB获取配置信息,自然都能拿到最新的配置。...

2018-05-05 09:27:56 3740 5

原创 Spring Boot RabbitMQ 延迟消息实现完整版

概述曾经去网易面试的时候,面试官问了我一个问题,说 下完订单后,如果用户未支付,需要取消订单,可以怎么做我当时的回答是,用定时任务扫描DB表即可。面试官不是很满意,提出: 用定时任务无法做到准实时通知,有没有其他办法?我当时的回答是: 可以用队列,订单下完后,发送一个消息到队列里,并指定过期时间,时间一到,执行回调接口。面试官听完后,就不再问了。其...

2018-05-03 13:19:39 19815 35

原创 win10下安装rabbitmq

下载地址 http://www.rabbitmq.com/install-windows.html打开这个网站,直接下载 rabbitmq-server-3.7.4.exe安装rabbitmq双击rabbitmq-server-3.7.4.exe,注意自己指定一个安装目录,默认的安装目录包含Program Files目录,Program Files是带空格的...

2018-05-02 19:40:14 2335

原创 Win10下安装erlang

下载地址erlang下载地址 http://www.erlang.org/downloads打开网址后,如果是win10是64位的,则选择64位的版本,下载后的文件名如下: otp_win64_20.3.exe双击exe文件,注意最好不要使用默认安装路径,因为默认路径包含Program Files目录,带了空格。最好自己指定一个安装目录。配置环境变量...

2018-05-02 19:13:02 7690 11

原创 连续调用多个外部系统的写接口-如何保证数据一致性(思路)

概述某些场景下,我们将业务数据落地之前,是需要先调用外部系统的多个写接口,当这些写接口都操作成功了,我们才将业务数据落地到自己本地的数据库里面。比如说:public void updateProductInfo(Product product) { //1、将商品价格更新到价格系统 priceService.updatePrice(product); //...

2018-04-28 13:35:52 16914 6

原创 Junit测试带有@Async注解的service,主线程先退出的问题

概述今天使用Junit测试一个带有@Async的业务service,进行debug的时候,业务代码都没执行完,线程就退出了。之前以为是中间抛了什么异常,导致线程提前退出。但是很细心的看了很久,并没有任何异常信息。后面才发现原来是主线程退出了。由于使用了@Async注解,操作是异步的,主线程里面就执行完退出了。那么Junit这边,整个case就提前走完了。后面我用了个笨办法,在让主线...

2018-04-25 21:16:03 4067 4

原创 redis的incrBy操作如何设置key的失效时间

概述最近在使用redis,用到里面的incrBy操作,但是这个API没有提供一个参数来设置key的失效时间。 我自己想了一个比较low的办法。 Long limit = redisStringService.incrBy(limitCacheKey, 1); //拿到数字1的那个线程,设置key的有效期 if (limit == 1) { redisString...

2018-04-20 21:38:06 12089 2

原创 List转Map的三种方法

List转Map三种方法。

2018-04-03 13:26:33 305199 15

原创 第一个微信小程序之Hello World

概述在小程序账号注册完整流程一文中详细介绍了如何注册一个小程序账号。下面我们介绍一下如何开发一个Hello World的小程序。微信开发者工具下载访问(https://mp.weixin.qq.com),用小程序账号登录后,按照如下步骤下载微信开发者工具。1、点击【文档】链接2、点击【开发】链接,在弹出的选项中,选择【小程序开发】3、点击【工具】的链接4、...

2018-04-01 22:25:59 21328

原创 小程序账号注册完整流程

概述在开始写微信小程序之前,必须先有小程序账号,本文将使用图文的方式,详细的介绍整个注册的过程。选择注册类型打开微信公众平台(https://mp.weixin.qq.com)后,点击立即注册按钮。 点击完【立即注册】后,注册类型选择小程序。 点击小程序图标后,将真正进入小程序注册流程。账号信息填写这里大家要注意一下,这里填写的邮箱不可以...

2018-04-01 20:04:33 30826 3

原创 使用Netty的ReplayingDecoder解决拆包和粘包问题

概述在自定义解码器处理半包消息 分隔符解码器处理半包问题 以回车换行结尾的消息如何处理半包问题 三篇文章中,笔者介绍了在Netty如何解决拆包和粘包问题,其中自定义解码器处理半包消息 里面介绍的方法是在线上实际用过的,经过了超级大流量的验证,挺靠谱的。下面再介绍另外一种解决半包问题的方法,虽然我没实际在线上用过,但是可以当成是一种知识补充。直接上代码在...

2018-03-30 09:31:34 6281 4

原创 小程序应用,获取微信用户的unionid

概述关于unionid的作用,可以先看我之前写的小程序中的unionid。那么unionid如何获取呢?有两种方式:1、通过wx.getUserInfo(); 2、通过jscode2session接口。使用getUserInfo方法我们可以在小程序端使用如下代码: wx.getUserInfo()获取到用户的信息,用户信息里面会包含encrypted...

2018-03-26 13:28:37 3017

原创 生成无限制的微信小程序码

概述现在除了用二维码之外,微信还可以为我们生成小程序码,大概长这个样子。 如果要生成无限制的小程序码,需要几个步骤 1、小程序某个页面的地址,也即是指定page参数的值; 2、获取access_token; 3、指定scene参数的值; 4、调用getwxacodeunlimit接口,并将返回结果存储到一个图片里。page参数page参数的值都是以pages开...

2018-03-25 20:19:48 16779 3

原创 小程序中的unionid

概述一家公司可以到微信平台上注册为一个开发者主体,一个主体下可以有多个公众号、小程序等。下面以小程序作为例子来说清楚unionid。开发者主体下有多个小程序一些小型的电商公司,会用小程序来开发商城,但是为了拉新用户,通常还会开发出像福袋、抽奖等小程序。现在假设有这样的场景,在同一个开发者主体下,一个微信用户从福袋小程序中获得了一张优惠券,想到小程序商城这个小程序...

2018-03-25 16:05:28 5020

原创 能不用事务就尽量别用

概述以前在公司里,有个牛人对俺说: 事务就是个垃圾,能不用就尽量不用。当时我刚从传统行业切换到互联网行业,对这个牛人说的这句话是嗤之以鼻的,怎么可能不用事务呢?后来随着开发了多个高并发应用后,才知道这个牛人说的是对的。下面说两个亲身经历的案例来说明这个问题。库存扣减接口(写事务)当时我们有个业务,在购物车阶段的时候,就开始占用库存了,这个库存占用接口的流量...

2018-03-25 12:25:04 5787

原创 微信用户访问小程序的登录过程

概述 当你开发完了一个小程序并部署上线后,某个微信用户第一次访问这个小程序的时候,会弹出一个授权界面,用户可以选择是否使用微信登录,如果选择是,则直接进入到小程序。当你第二次进入该小程序的时候,你会发现授权界面不会弹出来了,直接就进入小程序了。这个过程看起来非常的简单,但其实实现起来相当的麻烦和繁琐。涉及到会话、安全、验证等各种各样的问题。下面笔者介绍一下实现这个登录过程的思路。...

2018-03-24 22:55:44 19027 4

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除