<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[无趣的码农]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/synsdeng</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; synsdeng]]></copyright><item><title><![CDATA[MyBatis分页时foreach异常]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78561139</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78561139</guid><author>synsdeng</author><pubDate>Fri, 17 Nov 2017 14:43:31 +0800</pubDate><description><![CDATA[MyBatis使用分页插件时并且查询条件包含foreach时，分页插件在执行count语句时会抛出异常，报参数为空异常。项目中使用到了MyBatisPlus，分页也是用的它的PaginationInterceptor，项目中的版本为1.3.6。分页插件会新增一个COUNT的SQL，并复制原BoundSql对象，然后使用DefaultParameterHandler.setParameters给CO]]></description><category></category></item><item><title><![CDATA[Could not initialize class net.sf.cglib.beans.BeanCopier]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78544970</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78544970</guid><author>synsdeng</author><pubDate>Wed, 15 Nov 2017 20:59:32 +0800</pubDate><description><![CDATA[使用BeanCopier做对象拷贝时，出现 java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.beans.BeanCopier 异常，但项目中是有该类的。
            Cglib依赖了Asm，后来发现项目中存在两个Asm的Jar包，按理来说Maven项目只会存在一个版本。该项目做了一个框架升]]></description><category></category></item><item><title><![CDATA[Eclipse中Maven工程间循环引用错误]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78541608</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78541608</guid><author>synsdeng</author><pubDate>Wed, 15 Nov 2017 15:48:48 +0800</pubDate><description><![CDATA[如果我们的项目包含多个工程（project），而它们之间又是循环引用的关系，那么Eclipse在编译时会抛出如下一个错误信息： “A cycle was detected in the build path of project: XXX” 解决方法非常简单： Eclipse Menu -> Window -> Preferences… -> Java -> Compiler -> Buildin]]></description><category></category></item><item><title><![CDATA[Spring MVC（一）]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78506550</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78506550</guid><author>synsdeng</author><pubDate>Sat, 11 Nov 2017 14:58:26 +0800</pubDate><description><![CDATA[在SpringBoot中MVC初始化主要由DispatcherServletAutoConfiguration及WebMvcAutoConfiguration完成。DispatcherServletAutoConfiguration会向Spring容器中注册DispatcherServlet，并且使用ServletRegistrationBean动态的把DispatcherServlet添加到Se]]></description><category></category></item><item><title><![CDATA[SpringCloud之Ribbon（二）]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78446920</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78446920</guid><author>synsdeng</author><pubDate>Sat, 04 Nov 2017 23:03:00 +0800</pubDate><description><![CDATA[SpringClientFactory是Feign和Ribbon关联的纽带，具体可参见FeignRibbonClientAutoConfiguration。SpringClientFactory实例化IRule、IPing、ServerList、ILoadBalancer时默认是以PropertiesFactory中的Bean定义优先，PropertiesFactory和SpringClientF]]></description><category></category></item><item><title><![CDATA[SpringCloud之Ribbon（一）]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78417818</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78417818</guid><author>synsdeng</author><pubDate>Wed, 01 Nov 2017 19:53:44 +0800</pubDate><description><![CDATA[在SpringCloud中Feign作为restful客户端，Eureka作为服务注册中心。Ribbon在Feign与Eureka之间充当中介，为客户端提供软件负载均衡算法。在Ribbon这一层中可以实现一个所谓的智能路由。
            Ribbon是在Eureka之后初始化，Configuration类为RibbonAutoConfiguration。里面有如SpringClien]]></description><category></category></item><item><title><![CDATA[SpringCloud之Feign（二）]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78380552</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78380552</guid><author>synsdeng</author><pubDate>Sat, 28 Oct 2017 23:16:36 +0800</pubDate><description><![CDATA[FeignClientsConfiguration初始化配置中：默认Encoder类型为SpringEncoder，功能为调用Spring的HttpMessageConverters处理参数。默认Decoder类型为ResponseEntityDecoder，它包装了SpringDecoder，做的事情也就是调用Spring的HttpMessageConverters处理接口返回值。默认Contr]]></description><category></category></item><item><title><![CDATA[MyBatisPlus注入公共Sql问题]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78354462</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78354462</guid><author>synsdeng</author><pubDate>Thu, 26 Oct 2017 15:30:25 +0800</pubDate><description><![CDATA[同事新建项目运行CRUD时发现MyBatis的Mapper找不到对应方法，该方法为AutoMapper中的公共方法。
       在此之前做了一次依赖及配置清理，怀疑是否不小心多删除了什么或是版本变化导致出了问题。把该项目还原就不会出现此问题，间接证明了此猜想。但另外一个项目同样的框架环境确是正常，所以肯定不是版本的问题。公司MyBatisPlus的版本是1.x版本，同事之前用的版本是2.x。]]></description><category></category></item><item><title><![CDATA[SpringCloud之Feign（一）]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78352793</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78352793</guid><author>synsdeng</author><pubDate>Thu, 26 Oct 2017 13:35:53 +0800</pubDate><description><![CDATA[Feign是SpringCloud中的HTTP客户端，要使用Feign只需在项目中加入@EnableFeignClients注解即可。查看该注解定义可知它是通过FeignClientsRegistrar类实现扫描并注册feign client。
       FeignClientsRegistrar里的registerFeignClients方法通过Spring的ClassPathScanni]]></description><category></category></item><item><title><![CDATA[可靠性消息事务实现]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78302918</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78302918</guid><author>synsdeng</author><pubDate>Sat, 21 Oct 2017 13:09:34 +0800</pubDate><description><![CDATA[本方案基于外部事件表（Mysql）+MQ（ActiveMQ）+SpringCloud方式提供事务型消息发送。此方案并不依赖特定的事件表及MQ，TPS受限时可进行替换。主要应用在事务中包含的重接口、第三方系统调用等，以实现异步化，保证最终一致性。因为是异步调用，所以接口限制为不能有返回值。为了记录完整的调用日志链，整个过程中注意传递请求日志id。
       在SpringCloud中远程调用默]]></description><category></category></item><item><title><![CDATA[Spring Cache自定义缓存格式]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78140994</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78140994</guid><author>synsdeng</author><pubDate>Sat, 30 Sep 2017 11:23:52 +0800</pubDate><description><![CDATA[SpringCache是一个基于注解来更新缓存的组件，对于大多数的缓存操作都适用，本质是基于AOP实现，也不用再重复千轮子，直接使用便是，并且支持SpringEL表达式，对于使用教程网上还是很多的。
       很多时候为了兼容性以及方便，会把对象转换成JSON格式存入缓存（Redis）中，这就需要对Cache进行拦截，在加入缓存及获取缓存时做一个JSON格式转换。
       通过@En]]></description><category></category></item><item><title><![CDATA[Tomcat如何处理一个请求]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/78072173</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/78072173</guid><author>synsdeng</author><pubDate>Sat, 23 Sep 2017 17:28:52 +0800</pubDate><description><![CDATA[Connector（也称为通道或连接器），Tomcat中用于处理请求与响应的组件，接受来自客户端的请求并将请求转交给Engine处理，同时将来自Engine的答复返回给客户端，Connector主要负责处理与客户端的通信。Connector的核心是ProtocolHandler，ProtocolHandler的实现类分为HTTP及AJP两种。HTTP顾名思义就是处理HTTP协议的（HTTP/1.1]]></description><category></category></item><item><title><![CDATA[RocketMQ概述]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77966125</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77966125</guid><author>synsdeng</author><pubDate>Wed, 13 Sep 2017 14:52:22 +0800</pubDate><description><![CDATA[RocketMQ是一个分布式消息中间件，并支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念，如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。
       RocketMQ以Topic来管理不同应用的消息，对于生产者（producer）而言，发送消息时需要指定消息的Topi]]></description><category></category></item><item><title><![CDATA[基于RocketMQ的推送猜想]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77948556</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77948556</guid><author>synsdeng</author><pubDate>Tue, 12 Sep 2017 19:07:19 +0800</pubDate><description><![CDATA[RocketMQ是基于Topic的分布消息中间件，一个Topic对应多个ConsumerQueue，消费者消费指定的ConsumerQueue队列，并且消息是通过Pull方式拉取。为每个用户定义一个Topic这种方式不现实，即使为每个用户定义一个queueId也是不切实际的做法。ConsumerQueue本来是处理分布式及负载均衡，但我们可以换种思路，一个用户关联一个queueId，一个queue]]></description><category></category></item><item><title><![CDATA[ThreadLocal & InheritableThreadLocal]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77864463</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77864463</guid><author>synsdeng</author><pubDate>Wed, 06 Sep 2017 11:34:09 +0800</pubDate><description><![CDATA[ThreadLocal这个类给线程提供了一个本地变量，这个变量是该线程自己拥有，各线程间不共享。在该线程存活和ThreadLocal实例能访问的时候，保存了对这个变量副本的引用。当线程消失的时候，所有的本地实例都会被GC。并且建议ThreadLocal最好是使用 private static 修饰。
       每个线程Thread里面都各有一个类似MAP的成员变量（变量名为threadLoc]]></description><category></category></item><item><title><![CDATA[Linux删除（清空）正在运行的应用日志文件内容]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77839841</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77839841</guid><author>synsdeng</author><pubDate>Mon, 04 Sep 2017 17:36:25 +0800</pubDate><description><![CDATA[在测试环境定位问题时，如果发现日志文件内容太多或太大，有时需要删除该日志，如Tomcat，Nginx日志。以前每次都是先rm -rf ***.log，然后重启应用。直到后来发现了以下命令，原来可以不用重启应用直接清空日志。最简单的方式直接运行以下命令：

>file.log

    还有其它两种方式，分别为：

echo "">file.log

cat /dev/null > ]]></description><category></category></item><item><title><![CDATA[基于同步器的合并接口实现]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77781466</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77781466</guid><author>synsdeng</author><pubDate>Fri, 01 Sep 2017 23:12:46 +0800</pubDate><description><![CDATA[在上篇《高并发下合并接口请求》中是简单的基于计数器来实现，每个线程都会以一定的时间（10毫秒）间隔检查是否有接口返回。其中的延时可以把间隔设置的非常小，但所有线程的调度还是有些浪费CPU资源。近两天看Tomcat源码时无意发现了一个叫AbstractQueuedSynchronizer的同步器，这个是JDK并发包下提供的工具类，如著名的ReentrantLock就是基于此实现。
       A]]></description><category></category></item><item><title><![CDATA[高并发下合并接口请求]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77682570</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77682570</guid><author>synsdeng</author><pubDate>Tue, 29 Aug 2017 17:15:35 +0800</pubDate><description><![CDATA[在有一次对商品详情页进行压力测试时，因为商详页的数据来源非常多，经过的服务多，调用链很长，所以查询数据库的次数也就非常多，数据库连接池很快就被用光，导致很多请求被阻塞，也导致应用整体线程数非常高。虽然通过增加数据库连接池大小可以缓解问题，并且可以通过压力测试，但这治标不治本。商详页中有很多查询已经做了缓存，但还是有些如促销、（活动）价格、库存等是不能缓存（或是不能缓存太长时间）。
       ]]></description><category></category></item><item><title><![CDATA[日志打印及配置更新]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77621738</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77621738</guid><author>synsdeng</author><pubDate>Sun, 27 Aug 2017 17:38:01 +0800</pubDate><description><![CDATA[记录日志是项目不可或缺的功能，一般Java用的比较多的是Slf4j、Log4j、Logback等。而且一般的做法都是在类，或父类里调用 LoggerFactory.getLogger(this.getClass())来创建一个Logger。像Controller、Service等还好，只需在父类中定义即可，其它的工具类，帮助类，抽象出来的业务类等就较麻烦，每个类都要这么来一下。]]></description><category></category></item><item><title><![CDATA[Nginx最大处理连接数]]></title><link>https://blog.youkuaiyun.com/synsdeng/article/details/77571837</link><guid>https://blog.youkuaiyun.com/synsdeng/article/details/77571837</guid><author>synsdeng</author><pubDate>Fri, 25 Aug 2017 12:46:21 +0800</pubDate><description><![CDATA[记录一次最近公司SEO优化压测，以前所有页面上的数据都是通过JS获取的，这样会有一个问题，就是SEO不友好，所以就增加了一层Node，接口请求放在了Node里，通过Node渲染页面后返回给浏览器。因为是一次比较大的改版，所以在测试环境进行了一次性能压测，当然测试环境机器有限，是按比例缩小进行压力测试。中间出现了几个问题，印象最深刻的就是Nginx最大连接数了。最开始因为对Nginx高性能的信任，所]]></description><category></category></item></channel></rss>