记一次ajax的JSESSIONID 变化解决、非跨域变化

前言某一天测试提了一个bug,系统进入到某个页面中后,出现登录失效,不管怎么样,只要进入这个页面再点击其他链接就会去到登录页面,测试环境没有问题。 开始解决第一步:怀疑代码问题因为测试环境没有任何问题,所以怀疑是代码本身的问题,于是在本地测试,发现本地没有问题,于是重新打包部署到正式服务器测试,发现还是出现异常。 第二步:确认为何会登录失效因为代码和测试环境与本地都是一样的,所以怀疑是数据原因导致登录失效,所以在本地将配置切换到正式环境,发现本地还是没有任何问题,排除这一问题,同时后台也没有任何异常产生,最终追踪到页面,发现页面发出的ajax请求的JSESSIONID 发生了改变,于是开始排查JSESSIONID 为什么会改变,百度到了2种原因: 一、response调用了reset方法导致登录失效二、ajax跨域导致登录失效首先第一个,如果是因为调用reset方法导致登录失效,那么所有的环境理论上都会登录失效,但是为了保险起见,还是检查一下,最后发现并没有地方调用reset方法,所以排除此项。于是检查第二个,但是整个系统并没有跨域,但是为了保险,还是将网上说的方法在ajax请求中添加 beforeSend: function(xhr) { xhr.withCredentials = true; } crossDomain:true, 加上之后发现还是不行,于是以上2种原因被排除 第三步:…

通过Maven profile实现环境切换,快速部署到正式环境

前言在开发工作中存在多个环境:开发环境、测试环境、正式环境(生产环境),而每个环境的MySQL、Redis、Rabbitmq、ElasticSearch等配置各不相同,所以每次开发完成部署或者更新都需要手动改变配置文件,尤其是当使用jenkins等相关自动化编译部署的工具的时候,必须要先修改配置文件再上传代码,否则更新就容易出错。解决这个问题常用的方法有:一是通过Git分支,不同环境不同分支,因为配置文件很少修改,所以一般来说合并不会出现问题,另外就算修改了,在提交代码的时候手动合并一下也就可以了。二是通过maven profile,也是本文主要介绍的方式,maven profile方式有个弊端就是每次修改配置文件就需要修改所有的配置文件,好处就是不管什么分支,配置文件都是相同的(在没有修改配置文件的情况下),不用担心切换分支导致环境异常等等。git和maven profile各有优缺点,具体采用哪种可以根据实际情况采用 开始使用Maven profile创建对应文件夹使用maven profile需要给不同的环境创建不同的配置文件夹,比如我的项目主要有测试环境和正式环境,所以在resources文件夹创建了2个目录dev(测试环境)和formal(正式环境),同时把配置文件application.yml放入2个文件夹,修改dev的application.yml服务端口为8081,formal的application.yml的服务端口为8080,具体结构如下图 修改pom.xml文件首先在pom.xml中创建测试环境和开发环境节点…

ElasticSearch优化会员列表搜索

ElasticSearch简介ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便,维基百科、Stack Overflow、Github 都采用它 为什么使用ElasticSearch当一个系统的搜索非常复杂,需要关联多张表、拥有多种条件来进行查询时,数据库处理起来无疑会很慢,当数据少的时候可能还不明显,但是一旦数据多了,数据库就会被严重拖慢,就算使用索引以及对SQL语句进行优化,可以优化的空间也很少的情况下,那么就可以考虑使用搜索引擎来优化搜索了,Java开源的搜索引擎有很多,比如Lucene、ElasticSearch、Solandra、Nutch等等,具体选用哪种引擎可以根据不同的引擎的特性来选择,而我是基于引擎本身特性、实施难度、学习开发难度、速度综合来选择的,当然ElasticSearch对于我们来说不一定是最优的,但是技术解决方案永远都没有最优的,只有差不多合适的 安装ElasticSearch因为服务器是用的centos7,所以这里的安装都是基于centos7的,另外ElasticSearch需要jdk 8的支持,所以如果还在用Java8一下的可以考虑更新一下了,或者同时安装一个Java8的JDK 下载ElasticSearch wget https:…

Rabbitmq延迟队列实现定时任务

场景开发中经常需要用到定时任务,对于商城来说,定时任务尤其多,比如优惠券定时过期、订单定时关闭、微信支付2小时未支付关闭订单等等,都需要用到定时任务,但是定时任务本身有一个问题,一般来说我们都是通过定时轮询查询数据库来判断是否有任务需要执行,也就是说不管怎么样,我们需要先查询数据库,而且有些任务对时间准确要求比较高的,需要每秒查询一次,对于系统小倒是无所谓,如果系统本身就大而且数据也多的情况下,这就不大现实了,所以需要其他方式的,当然实现的方式有多种多样的,比如Redis实现定时队列、基于优先级队列的JDK延迟队列、时间轮等。因为我们项目中本身就使用到了Rabbitmq,所以基于方便开发和维护的原则,我们使用了Rabbitmq延迟队列来实现定时任务,不知道rabbitmq是什么的和不知道springboot怎么集成Rabbitmq的可以查看我之前的文章Spring boot集成RabbitMQ Rabbitmq延迟队列Rabbitmq本身是没有延迟队列的,只能通过Rabbitmq本身队列的特性来实现,想要Rabbitmq实现延迟队列,需要使用Rabbitmq的死信交换机(Exchange)和消息的存活时间TTL(Time To Live) 死信交换机一个消息在满足如下条件下,会进死信交换机,记住这里是交换机而不是队列,一个交换机可以对应很多队列。 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。 上面的消息的TTL到了,消息过期了。 队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上。 死信交换机就是普通的交换机,只是因为我们把过期的消息扔进去,所以叫死信交换机,…

MySQL读写分离基于Mycat实现

为什么需要读写分离至于为什么需要读写分离,在我之前的文章有介绍过了,相信看到这篇文章的人也知道为什么需要读写分离了,当然如果你也需要了解一下,那么欢迎查看我之前的文章SpringBoot Mybatis 读写分离配置,顺便也可以了解一下怎么通过代码进行读写分离的 MySQL主从复制主从复制是读写分离的关键,不管通过什么方式进行读写分离,前提就是MySQL有主从复制,当前双机主从也行,但是关键的关键,是要能保证2个库的数据能一致(出掉刚写入主库从库还未能及时反应过来的情况),如果2个库的数据不一致,那么读写分离也有没有任何意义了,具体MySQL怎么做主从复制可以查看我之前的文章MySQL主从复制搭建,基于日志(binlog) Mycat是什么一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 一个新颖的数据库中间件产品 以上内容来自Mycat官网,简单来说,Mycat就是一个数据库中间件,对于我们开发来说,就像是一个代理,当我们需要使用到多个数据库和需要进行分库分表的时候,我们只需要在mycat里面配置好相关规则,程序无需做任何修改,只是需要将原本的数据源链接到mycat而已,当然如果以前有多个数据源,需要将数据源切换为单个数据源,这样有个好处就是当我们的数据量已经很大的时候,需要开始分库分表或者做读写分离的时候,不用修改代码(只需要改一下数据源的链接地址) Mycat读写分离设置配置Mycat用户Mycat的用户就跟MySQL用户是同一个意思,主要配置链接到Mycat的用户名以及密码,…

SpringBoot Mybatis 读写分离配置

为什么需要读写分离当项目越来越大和并发越来大的情况下,单个数据库服务器的压力肯定也是越来越大,最终演变成数据库成为性能的瓶颈,而且当数据越来越多时,查询也更加耗费时间,当然数据库数据过大时,可以采用数据库分库分表,同时数据库压力过大时,也可以采用Redis等缓存技术来降低压力,但是任何一种技术都不是万金油,很多时候都是通过多种技术搭配使用,而本文主要就是介绍通过读写分离来加快数据库读取速度 实现方式读写分离实现的方式有多种,但是多种都需要配置数据库的主从复制,当然也许是有不需要配置的,只是我不知道而已 方式一数据库中间件实现,如Mycat等数据库中间件,对于项目本身来说,只有一个数据源,就是链接到Mycat,再由mycat根据规则去选择从哪个库获取数据 方式二代码中配置多数据源,通过代码控制使用哪个数据源,本文也是主要介绍这种方式 读写分离优劣优点1.降低数据库读取压力,尤其是有些需要大量计算的实时报表类应用 2.增强数据安全性,读写分离有个好处就是数据近乎实时备份,一旦某台服务器硬盘发生了损坏,从库的数据可以无限接近主库 3.可以实现高可用,当然只是配置了读写分离并不能实现搞可用,最多就是在Master(主库)宕机了还能进行查询操作,具体高可用还需要其他操作 缺点1.增大成本,一台数据库服务器和多台数据库的成本肯定是不一样的 2.增大代码复杂度,不过这点还比较轻微吧,但是也的确会一定程度上加重 3.增大写入成本,虽然降低了读取成本,…

微信Speex转wav,Speex to wav

前言微信公众号开发,因为需要在页面发送语音和播放,由于公众号页面中录音必须要调用微信js录音,录音完成由前端上传到微信临时素材,再由后端下载到服务器,然后给前端播放,但是因为从微信下载下来的语音智能是speex格式(高清语音)和amr格式,然而这2种格式都是无法直接在HTML中播放的,所以需要对语音进行转码,由于speex格式清晰度较高,所以我选择了下载speex格式的语音进行转码,本文就是记录如果一步一步调用speex官方源码和微信提供部分C代码进行转码,注:本文所有环境和命令是基于Linux的 下载并安装speex环境:Linux Centos Gcc JDK 1.8 speex 1.2.0 步骤:首先下载speex最新的源码,下载地址,解压然后进入源码目录,执行命令 sudo ./configure 验证环境是否有误,如果有问题,则根据具体提示自行安装和配置,如果没有异常,则可以执行命令进行编译安装了 sudo make;sudo make install 如果没有出问题,则会在/usr/local/lib文件夹下面产生libspeex.so等文件,…

Spring Cloud的基本认识和使用Spring Cloud的基本教程

认识Spring CloudSpring Cloud简单来说就是一个微服务相关的框架,至于什么是微服务,简单来说就是一个整体项目由多个单独运行的小项目构成,每个小项目负责一个或多个功能,每个小项目有1个或者1个以上运行实例,项目之间可以相互调用。如果有接触Dubbo,那么就可以很容易理解,Dubbo是一个提供不同项目相互调用的框架,同时Dubbo需要依赖于Zookeeper,所以说Spring Cloud做的事和Dubbo类似,却又有很大不同,但是它们的目的确实相同的,那就是提供不同项目之间的调用和负载均衡 Spring Cloud 常用组件Spring Cloud EurekaSpring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次分装,由两个组件组成:Eureka服务器和Eureka客户端。 Eureka服务器用作服务注册服务器。Eureka客户端是一个Java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支 持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡,其中Eureka Server角色相当于Dubbo的Zookeeper,Eureka Client相当于服务提供者和调用者 Spring Cloud Zookeeper对Zookeeper的封装,…