工程设计
工程实战
zhifeng687
这个作者很懒,什么都没留下…
展开
-
选择灰度发布还是全量发布会导致不同的代码逻辑
灰度发布需要同时考虑兼容的情况原创 2016-05-27 00:15:33 · 494 阅读 · 0 评论 -
Feign Client 原理和使用
一、原理Feign 是一个 Java 到 HTTP 的客户端绑定器,灵感来自于 Retrofit 和 JAXRS-2.0 以及 WebSocket。Feign 的第一个目标是降低将 Denominator 无变化的绑定到 HTTP APIs 的复杂性,而不考虑 ReSTfulness。Feign 使用 Jersey 和 CXF 等工具为 ReST 或 SOAP 服务编写 java 客户端。此外,Feign 允许您在 Apache HC 等http 库之上编写自己的代码。Feign 以最小的开销...转载 2016-05-27 16:52:37 · 2824 阅读 · 0 评论 -
Hystrix依赖隔离之线程池隔离
1.依赖隔离概述依赖隔离是Hystrix的核心目的。依赖隔离其实就是资源隔离,把对依赖使用的资源隔离起来,统一控制和调度。那为什么需要把资源隔离起来呢?主要有以下几点:1.合理分配资源,把给资源分配的控制权交给用户,某一个依赖的故障不会影响到其他的依赖调用,访问资源也不受影响。2.可以方便的指定调用策略,比如超时异常,熔断处理。3.对依赖限制资源也是对下游依赖起到一个保护作用,避免大量的并发请求在依赖服务有问题的时候造成依赖服务瘫痪或者更糟的雪崩效应。4.对依赖调用进行封装有利于对调..转载 2020-11-30 02:10:19 · 918 阅读 · 0 评论 -
wait for all threads to finish using ExecutorService
问题引出:使用线程池,怎么阻塞等待所有线程执行完成后,才能继续走下面的逻辑?使用awaitTermination只能阻塞等待定时时间,超过该时间后,主线程不再阻塞等待,而线程池中的线程仍会继续运行。executorService.shutdown();boolean taskCompleted = executorService.awaitTermination(6, TimeUn...转载 2015-08-15 17:07:37 · 826 阅读 · 0 评论 -
Guava限流器RateLimiter
日常开发中,经常会遇到一些需要限流的场景。我们希望每一秒的请求量不要超过某一个阈值,以防止过多的请求对服务造成过大的压力。常见的限流算法有计数器法、漏桶算法和令牌桶算法,下面我们简单的了解一下这几个算法。一.常见限流算法1.计数器法设置一个时间窗口内允许的最大请求量,如果当前窗口请求数超过这个设定数量,则拒绝该窗口内之后的请求。关键词:时间窗口,计数器。举个例子,我们设置1秒钟的最大请求数量为100,使用一个计数器来记录这一秒中的请求数。每一秒开始时,计数器都从0开始记录请求量,如果在这一秒转载 2016-04-15 21:17:58 · 1606 阅读 · 0 评论 -
Guava RateLimiter源码解析
常用限流算法常用的限流算法有两种:漏桶算法和令牌桶算法漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。RateLimite转载 2016-04-15 21:28:24 · 458 阅读 · 0 评论 -
文件下载接口的优化实践
文件下载接口的需求:接口可以正常下载时, 响应的content-type为application/octet-stream;charset=UTF-8. 返回的是一个文件; 接口出现异常时,响应的content-type为application/json, 返回的是包含错误码、错误信息的json格式;过程一: 文件写入response.outputStream, 方法返回值为void@RequestMapping("/downloadFile") public void downlo.原创 2015-12-18 16:01:01 · 1025 阅读 · 0 评论 -
controller aop切面职责
原创 2016-04-16 19:23:53 · 392 阅读 · 0 评论 -
Hibernate Validator 校验继承场景
问题再现交易系统对应不同类型的订单请求,公共字段是放在了一个父类里,例如:@Setter@Getterpublic abstract class BaseOrderRequest{ @NotNull @Min(1) @Max(1000000) private Long totalAmount; ......}然后不同类型的下单请求再去继承这个父类,例如微信下单请求:public class WeiXinOrderRequest ext...转载 2018-06-17 00:32:43 · 875 阅读 · 0 评论 -
JackSonUtil
引用Maven库:<!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.4.3</version> </转载 2017-01-24 21:03:13 · 551 阅读 · 0 评论 -
redis分布式锁实现分布式系统定时任务单个执行
问题描述将带有定时任务的项目部署在单台测试环境上,完全没问题。生产上是两台集群服务器,项目部署上去发现定时任务的模块同时在两台机器上各执行了一遍,这将会导致其他意外的发生。解决方案----redis分布式锁使用redis分布式锁,为定时任务唯一指定的key加锁,并设置锁超时时间。当触发定时任务时,一台服务的任务进入切面,通过setNX(key,value)方法为唯一的key加锁,如果当前key不存在,将放入缓存,并返回true,通过expire(key,second)设置锁超时时间,结束后跳出执转载 2021-01-29 17:04:08 · 1535 阅读 · 0 评论 -
物理删除、逻辑删除以及逻辑删除保留唯一索引的方案
删除数据库记录是一个非常常见的需求,当数据失去价值时,我们便会删除它,但是如果操作不当,往往就会把一些有价值的数据误删掉,造成重要数据的丢失,合理采用删除方式才能更好地利用数据资源,下面介绍几种常用的删除方式。删除方式物理删除物理删除就是直接从数据库中删除一条或多条记录,将数据从磁盘上擦除,可以使用DELETE FROMSQL语句实现,这种方式产生的后果就是记录永久性删除,无法找回,一般适用于小型或数据重要性不高的项目,可以提高数据库资源利用率。物理删除方式是一种最简单最基本的数据删除方式,这里转载 2017-01-18 00:15:30 · 712 阅读 · 0 评论 -
sum处理null值
1.语法:IFNULL(字段,默认值) 即: IFNULL(字段,0)2.使用COALESCE函数,改函数依次判断所有条件并且返回第一个不为null的值, 语法:COALESCE(字段1,字段2......) 即:COALESCE(sum(字段),0)3.case WHEN条件1THEN结果1 ..ELSE其余结果END 即: case when isnull(sum(字段)) then 0 else sum(字段) end...转载 2017-02-24 15:57:52 · 532 阅读 · 0 评论 -
Java异常(exception)性能优化
在Java中,构造异常对象是"十分"耗时的,其原因是在默认情况下,创建异常对象时会调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,JDK中的源码如下:public synchronized Throwable fillInStackTrace() { if (stackTrace != null || backtrace != null /* Out of protocol state */ ) { .转载 2017-01-13 19:57:15 · 339 阅读 · 0 评论