开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

MyCAT源码分析:调试环境搭建

> 原文地址:[MyCAT源码分析:调试环境搭建](https://github.com/YunaiV/Blog/blob/master/Database/MyCAT/1001-MyCAT%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%EF%BC%9A%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md) > `MyCat-Server` **带注释**地址 :[https://github.com/YunaiV/Mycat-Server) > **😈本系列每 1-2 周更新一篇,欢迎订阅、关注、收藏 GitHub:https://github.com/YunaiV/Blog。** ------- - [1. 依赖工具](#) - [2. 源码拉取](#) - [3. 数据库配置](#) - [4. MyCat 配置](#) - [5. MyCAT 启动](#) - [6. MyCAT 测试](#) - [7. 交流](#) # 1. 依赖工具 * Maven * Git * JDK * MySQL * IntelliJ IDEA # 2. 源码拉取 从官方仓库 https://github.com/MyCATApache/Mycat-Server `Fork` 出属于自己的仓库。为什么要 `Fork` ?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。😈 使用 `IntelliJ IDEA` 从 `Fork` 出来的仓库拉取代码。拉取完成后,`Maven` 会下载依赖包,可能会花费一些时间,耐心等待下。 # 3. 数据库配置 我们要搭建的是**非分片表**的调试环境,需要创建一个数据库和表: 1. 创建数据库...
芋艿V 发布于 15小时前 阅读 110 评论 6

spring boot / cloud (一) 使用filter防止XSS

# spring boot / cloud (一) 使用filter防止XSS ##一.前言 ###XSS(跨站脚本攻击) >跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 ##二.思路 ###基于filter拦截,将特殊字符替换为**html转意字符** (如: `"<" 转意为 "<"`) , 需要拦截的点如下: - 请求头 `requestHeader` - 请求体 `requestBody` - 请求参数 `requestParameter` ##三.实现 ###1.创建XssHttpServletRequestWrapper类 在获取请求头,请求参数的这些地方,将目标值使用`HtmlUtils.htmlEscape`方法转意为html字符,而避免恶意代码参与到后续的流程中 ``` java /** * XssHttpServletRequestWrapper.java * Created at 2016-09-19 * Created by wangkang * Copyright (C) 2016 egridcloud.com, All rights reserved. */ package com.egridcloud.udf.core.xss; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.springframework.web...
wangkang80 发布于 23小时前 阅读 217 评论 3 点赞 1

基于Go语言快速构建RESTful API服务

In this post, we will not only cover how to use Go to create a RESTful JSON API, but we will also talk about good RESTful design.
RiboseYim 发布于 1天前 阅读 219 评论 1

实机操作,由IBM的技术大咖带领如何在短时间内迅速上线人工智能应用,名额有限快来报名!”

本次活动还特别设有实机操作环节,由IBM的技术大咖带领开发者在短时间内迅速上线人工智能应用。另外在最后,大家还可以参观体验IBM的创新中心,切身体会技术给时代带来的改变。
IBM技术沙龙

单元测试(二)-桩对象

在单元测试时,难免会碰到一些外部依赖,外部依赖是指在系统中代码与其交互的对象,而且无法对其做人为控制,比如文件系统、线程、内存、时间、数据库结果集等,这时可以使用伪对象(fake)来替代外部依赖,桩对象(stub)便是其中之一   一 桩对象 a) 桩对象是对系统中现有依赖项的一个替代品,可人为控制。通过使用桩对象,无需涉及依赖项,即可直接对代码进行测试。使用桩对象可以轻松地控制模拟依赖项的返回值会行为(比如模拟内存溢出异常)。 b) 使用桩对象的前提是要找到原系统中的接缝(Seam)。接缝是指代码中可以插入不同功能(如桩对象类)的地方。有时需要通过重构来制造接缝并解除依赖的方法,可以抽取接口来制造接缝,这样底层实现就可以被替换了。     二 替换底层实现的方法   常用的替换底层实现的方法有: 在构造函数中接收一个接口实现(构造函数注入) 在属性中接收一个接口实现(属性注入) 在方法的参数中接收一个接口实现(参数注入) 使用工厂方法产生接口实现   a) 在构造函数中接收一个接口实现 如果要使用类LogAnalyzer中的IsValidLogFileName方法来判断文件名是否有效,在生产环境下,IsValidLogFileName方法要读取配置文件,然后根据配置内容来...
zhixin9001 发布于 2天前 阅读 111

dhm-echarts图表架构与说明书

通过自定义div,ajax提交数据实现echarts图表展示
阿杜杜不是阿木木 发布于 2天前 阅读 188

如何保证微服务接口的幂等性

在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: > 1. 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 > 2. 在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次 > 3. 当这笔订单开始支付,在支付请求发出之后,在服务端发生了扣钱操作,接口响应超时了,调用方重试了一次 > 4. 一个订单状态更新接口,调用方连续发送了两个消息,一个是已创建,一个是已付款。但是你先接收到已付款,然后又接收到了已创建 > 5. 在支付完成订单之后,需要发送一条短信,当一台机器接收到短信发送的消息之后,处理较慢。消息中间件又把消息投递给另外一台机器处理 以上问题,就是在单体架构转成微服务架构之后,带来的问题。当然不是说单体架构下没有这些问题,在单体架构下同样要避免重复请求。但是出现的问题要比这少得多。 为了解决以上问题,就需要保证接口的幂等性,接口的幂等性实际上就是**接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的**。有些接口可以天然的实现幂等性,比如查询接口,对于查询来说,你查询一次和两次,对于系统来说,没有任何影响,查出的结果也是一样。 除了查询功能具有天然的幂等性...
wangyan9110 发布于 3天前 阅读 470 评论 2

基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

![poi](http://poi.apache.org/resources/images/pb-poi.png "poi") # 注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能。过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好。 # 序 由于 poi 本身只是针对于 excel 等office软件的一个工具包,在一些常规的 excel 导入导出时,还需要再做一次精简的封装,简化代码耦合。 ## 一、现状 本人经历过几家公司的代码封装,导入导出一般存在下面的情况。 ### 1.1 导入 1. 传入文件地址,返回 Sheet 对象,在业务代码中进行循环遍历,做相对应的类型转换,业务处理(二零零几年的代码框架) 2. 传入文件地址,返回 List 的对象,外部直接做强转 3. 传入文件地址,返回 List 的对象,外部将字符串对象转换为对应的类型 总结:如果只有上述的选择,本人是比较倾向于第二种,毕竟对外层是非常友好的 ### 1.2 导出 1. 直接在逻辑代码中进行遍历封装sheet,传入到生成file的方法中(二零零几年的代码框架) 2. 先循环遍历 List 对象,转换为 List> 对象,带上 fieldName 传入到封装好excel生成的方法中,内部则使用 map.get() 方法操作 3. 直接将 List 对象带上 fieldName 传入到封装...
倚楼听风雨_ 发布于 3天前 阅读 3463 评论 16 点赞 6

高性能Web Server思考

# 0xFF **Web服务可以让你在HTTP协议的基础上通过XML或者JSON来交换信息。** 醍醐灌顶!!! 你可以编写一段简短的代码,通过抓取这些信息然后通过标准的接口开放出来,就如同你调用一个本地函数并返回一个值。(rpc? rest?) 平台无关性. 目前主流的有如下几种Web服务:REST、SOAP。 **作为客户端** 向远端某台机器的的某个网络端口发送一个请求 **作为服务端** 把服务绑定到某个指定端口,并且在此端口上监听 # Socket编程 现在的网络编程几乎都是用Socket来编程 而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket也是一种文件描述符. 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 ## Socket如何通信 网络中的进程之间通过Socket通信.利用三元组(ip地址,协议,端口)就可以标识网络中的唯一进程 ![](https://github.com/astaxie/build-web-application-with-golang/raw/master/zh/images/8.1.socket.png?raw=true) ### TCP Socket **TC...
陶加涛 发布于 4天前 阅读 885 评论 4 点赞 1

RocketMQ源码解析:事务消息

> 原文地址:[RocketMQ源码解析:事务消息](https://github.com/YunaiV/Blog/blob/master/RocketMQ/1011-RocketMQ源码解析:事务消息.md) > `RocketMQ` **带注释**地址 :[YunaiV/incubator-rocketmq](https://github.com/YunaiV/incubator-rocketmq) > **😈本系列每 1-2 周更新一篇,欢迎订阅、关注、收藏 GitHub。** ------- - [1. 概述](#) - [2. 事务消息发送](#) - [2.1 Producer 发送事务消息](#) - [2.2 Broker 处理结束事务请求](#) - [2.3 Broker 生成 ConsumeQueue](#) - [3. 事务消息回查](#) - [3.1 Broker 发起【事务消息回查】](#) - [3.1.1 官方V3.1.4:基于文件系统](#) - [3.1.1.1 存储消息到 CommitLog](#) - [3.1.1.2 写【事务消息】状态存储(TranStateTable)](#) - [3.1.1.3 【事务消息】回查](#) - [3.1.1.4 初始化【事务消息】状态存储(TranStateTable)](#) - [3.1.1.5 补充](#) - [3.1.2 官方V4.0.0:基于数据库](#) - [3.2 Producer 接收【事务消息回查】](#) # 1. 概述 **必须必须必须** 前置阅读内容: * [《事务消息(阿里云)》](https://help.aliyun.com/document_detail/43348.html?spm=5176.doc43490.6.566.Zd5Bl7) # 2. 事务消息发送...
芋艿V 发布于 4天前 阅读 378 评论 2

redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性。
爱宝贝丶 发布于 4天前 阅读 598 评论 4 点赞 1

Nginx 实现灰度发布的三种方式

Nginx 实现灰度发布的三种方式
IamOkay 发布于 5天前 阅读 456 点赞 1

Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 - 《史蒂夫·乔布斯传》 』 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+,ElasticSearch 2.3.2 本文提纲 一、ES 的使用场景 二、运行 springboot-elasticsearch 工程 三、springboot-elasticsearch 工程代码详解   推荐 -  「springboot-learning-example」开源项目,Fork 一下,多多 Pull Request~ spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。 https://git.oschina.net/jeff1993/springboot-learning-example 一、ES 的使用场景 简单说,ElasticSearch(简称 ES)是搜索引擎,是结构化数据的分布式搜索引擎。 在《Elasticsearch 和插件 elasticsearch-head 安装详解》  和 《Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用》 我详细的介绍了如何安装,初步使用了 IK 分词器。 这里,我主要讲下 SpringBoot 工程中如何使用 ElasticSearch。 ES 的使用场景大致分为两块 1. 全文检索。加上分词(IK 是其中一个)、拼音插件等可以成为强大的全文搜索引擎。 2. 日志统计分析。可以...
泥沙砖瓦浆木匠 发布于 6天前 阅读 3725 评论 13 点赞 5

一步步完成Maven+Spring+Dubbo+Zookeeper的整合示例

本文给出一个整合Maven+Spring+Dubbo+Zookeeper的示例,并且一步步给出完成步骤,并对其中可能遇到的问题进行解决~ Maven模块化 创建一个名为dubbo-demo的Maven工程,该工程包含三个模块 dubbo-demo-interface   (定义对外开放接口) dubbo-demo-provider   (接口实现) dubbo-demo-consumer (接口调用) dubbo-demo工程中的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>dubbo-demo-provider</module> <module>dubbo-demo-consumer</module> <module>dubbo-demo-interface</module> </modules> </project> 关于dubbo-demo Maven工程的模块化构建,请参考博文【使用Maven构建模块化工程】 接下来,我们就一步一步来完成interface、provider以及con...
王孟君 发布于 7天前 阅读 1034 评论 4 点赞 2

一个脚本实现全量增量备份,并推送到远端备份中心服务器

摘要 由于工作需要,刚好需要这样一个功能的脚本,主要解决: 1. 不想在crontab中调度两条备份任务,一个做全量一个做增量 2. 如果每小时做增量,凌晨4点做全量,那会导致crontab写的复杂,增量需要跳过凌晨4点 3. 自动推备份文件到远程的备份中心服务器   前提 1. 操作系统CentOS,其他没测,当然理论上没问题 2. 本地运行MySQL/MariaDB数据库服务 3. 安装必要的包 3.1 percona-toolkit 3.2 percona-xtrabackup 4. 演示服务器 4.1 10.0.0.2 CentOS 7.3 x86_64 / MariaDB 10.1.21 + percona-toolkit-3.0.2 + percona-xtrabackup-2.3.6 数据库 4.2 10.0.0.3 CentOS 7.3 x86_64 备份   步骤 1. 打通服务器互信 1.1 登录到数据库服务器,在终端执行ssh-keygen -t rsa # ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:Nwh9Ao11ea3HcRS49wcygYmEfwQxUUL2RVS04QM...
__Untitled 发布于 1周前 阅读 672 评论 2 点赞 3

Spring思维导图,让Spring不再难懂(ioc篇)

>写在前面 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象。 就好像我们无需考虑对象的销毁回收一样,因为java垃圾回收机制帮助我们实现了这个过程;而ioc则是让我们无需考虑对象的创建过程,由ioc容器帮我们实现对象的创建、注入等过程。 ![Spring知识细节.png](http://upload-images.jianshu.io/upload_images/4120002-55b18f0249f25054.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >控制反转 ![Spring ioc简介.png](http://upload-images.jianshu.io/upload_images/4120002-7e89f6da34fe7bc9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >spring ioc容器 在Spring框架中的核心组件只有三个:Core、Context和Bean。它们构建起了整个Spring的骨骼架构,没有它们就不可能有AOP、Web等特性功能。 ![Spring 整体结构图.jpg](http://upload-images.jianshu.io/upload_images/4120002-1ad5bb59e5e9f209.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 如果说在三个核心中再选出一个核心,那就非Bean莫属了。可以说,Spring就是面向B...
java思维导图 发布于 1周前 阅读 9002 评论 25 点赞 21

TCC型分布式事务原理和实现之:Transaction与Participant

前言       在TCC型分布式事务原理和实现之:TransactionManager一文中,介绍了TCC事务管理器的主要功能和实现原理。相较于事务管理器,事务则包含了更多的属性状态,下面的UML图中可以清晰的体现Transaction与Participant的关系。              事务       事务具有很多的属性状态。首先,事务必须具有一个唯一ID来标识自己(保证进程内唯一即可),这样不同的事务就可以进行隔离控制,常见的事务ID生成方法就是使用uuid了;TCC事务一共有try、confirm和cancel三个阶段,因此,事务必须有一个事务状态字段来标识事物当前的状态:TRYING, CONFIRMING, CANCELLING;在TransactionManager一文中,多次提到根事务和分支事务,此处再重新提一下,所谓根事务,就是指事务的主动发起方,而分支事务,就是事务的被动发起方,也就是谁先开始谁就是老大,剩下的都是追随者、参与者。那么事务当然需要一个类型字段来标识当前事务的类型了,根事务用ROOT标识,分支事务用BRANCH标识;事务不一定总是成功,否则的话分布式事务也就不再是什么难题和秘密了,事务失败了怎么办呢?很多人第一想法就是回滚啊,其实,可以完成回滚的事务我将其理解为“正常事务”,也就是事...
黑客画家 发布于 1周前 阅读 531 评论 4 点赞 1

将项目发布到 maven 中央仓库踩过的坑

记录第一次将项目发布到 maven 中央仓库踩过的坑和解决方案。
brianway 发布于 1周前 阅读 498 点赞 2

RocketMQ源码解析:Filtersrv

> 原文地址:[RocketMQ源码解析:Filtersrv](https://github.com/YunaiV/Blog/blob/master/RocketMQ/1008-RocketMQ源码解析:Filtersrv.md) > `RocketMQ` **带注释**地址 :[YunaiV/incubator-rocketmq](https://github.com/YunaiV/incubator-rocketmq) > **😈本系列每 1-2 周更新一篇,欢迎订阅、关注、收藏 GitHub。** ------- - [1. 概述](#) - [2. Filtersrv 注册到 Broker](#) - [3. 过滤类](#) - [3.1 Consumer 订阅时设置 过滤类代码](#) - [3.2 Consumer 上传 过滤类代码](#) - [3.3 Filter 编译 过滤类代码](#) - [4. 过滤消息](#) - [4.1 Consumer 从 Filtersrv 拉取消息](#) - [4.2 Filtersrv 从 Broker 拉取消息](#) - [5. Filtersrv 高可用](#) # 1. 概述 `Filtersrv` ,负责**自定义规则**过滤 `Consumer` 从 `Broker` 拉取的消息。 ![Filtersrv.png](https://raw.githubusercontent.com/YunaiV/Blog/master/RocketMQ/images/1008/Filtersrv.png) 为什么 `Broker` 不提供过滤消息的功能呢?我们来看看官方的说法: > * Broker 端消息过滤 > 在 Broker 中,按照 Consumer 的要求做过滤,优点是减少了对于 Consumer 无用消息的网络传输。 缺点是增加了 Brok...
芋艿V 发布于 1周前 阅读 184

RocketMQ源码解析:定时消息与消息重试

> 原文地址:[RocketMQ源码解析:定时消息与消息重试](https://github.com/YunaiV/Blog/blob/master/RocketMQ/1010-RocketMQ源码解析:定时消息与消息重试.md) > `RocketMQ` **带注释**地址 :[YunaiV/incubator-rocketmq](https://github.com/YunaiV/incubator-rocketmq) > **😈本系列每 1-2 周更新一篇,欢迎订阅、关注、收藏 GitHub。** ------- - [1. 概述](#) - [2. 定时消息](#) - [2.1 延迟级别](#) - [2.2 Producer 发送定时消息](#) - [2.3 Broker 存储定时消息](#) - [2.4 Broker 发送定时消息](#) - [2.5 Broker 持久化定时发送进度](#) - [3. 消息重试](#) # 1. 概述 **建议**前置阅读内容: * [《Message发送&接收》](https://github.com/YunaiV/Blog/blob/master/RocketMQ/1003-RocketMQ源码解析:Message发送&接收.md) * [《Message拉取&消费(下)》](https://github.com/YunaiV/Blog/blob/master/RocketMQ/1005-RocketMQ源码解析:Message拉取&消费(下).md) 😈 为什么把**定时消息**与**消息重试**放在一起?你猜。 👻 你猜我猜不猜。 # 2. 定时消息 > **定时消息**是指消息发到 Broker 后,不能立刻被 Consumer 消费,要到特定的时间点或者等待特...
芋艿V 发布于 1周前 阅读 462

TCC型分布式事务原理和实现之:TransactionManager

前言       目前,还没有一款商用成熟的开源TCC框架,所以很多人基于不同思想实现了TCC的很多版本,本文所分析的TCC框架,是笔者在读了一些TCC开源代码、JTA设计思想之后逐步修改而来,由于代码还在逐步优化中,但是大体已经成型,所以将TCC框架的一点设计思想分享出来。 核心类图              事务管理器(TransactionManager)作为TCC分布式事务的核心组件,负责事务的管理工作(包括事务的提交和回滚)。 每一个事务的参与者(Participant)中都会有一个单例的事务管理器负责本地事务的管理工作。在TCC的try阶段,根事务(ROOT,表示事务的发起方)参与者中的事务管理器会负责创建根事务并持久化事务日志,同时会将创建的事务保存在ThreadLocal类型的队列中,处于分支事务参与者中的事务管理器会直接从事务上下文中传播(propagation)一个新的分支事务,同时也会持久化事务日志并将事务加入ThreadLocal队列中。在根事务端,try阶段结束后,TCC框架会根据try阶段是否有异常分别自动调用根事务管理器的commit和rollback方法,以commit为例,根事务管理器的commit又会调用根事务(transaction)的commit方法,根事务(transaction)的commit方法会遍历所有的事...
黑客画家 发布于 1周前 阅读 379 评论 2 点赞 3

iText PDF使用示例

目前生成PDF主要是使用itext pdf,最近工作原因重新使用了下,目前大部分也只是集中在生成段落文字,支持中文,生成水印,加盖印章.网络上大部分的例子对于水印都是对已经存在的PDF进行操作,这边介绍使用PageEvent一个一边生成文档内容一边生成水印的办法. 首先,要是用的话依赖于itext包,如果有中文字体的话增加asian依赖,其中也可以使用自定义字体. <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.1</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> 代码示例如下 public static void main(String[] args)throws Exception { File file = new File("itext.pdf"); if(!file.exists()) file.createNewFile(); OutputStream os = new FileOutputStream(file); Document document = new Document(); PdfWriter pdfWriter = PdfWriter.getInstance(document, os); //打开文档 document.open(); //每页使用 pdfWriter.setPageEvent(new WatermarkPageEvent("this is the watermark")); //设置字体...
D_GrayMan 发布于 11个月前 阅读 333

Spring Boot基础教程——web应用开发-模板引擎

一.    spring boot的web应用开发,是基于spring mvc 二.    Spring boot 在spring默认基础上,自动配置添加了以下特性: 1.    包含了ContentNegotiatingViewResolver和BeanNameViewResolver beans。 2.    对静态资源的支持(图片、js、css等),包括对WebJars的支持。 3.    自动注册Converter,GenericConverter,Formatter beans。 4.    对HttpMessageConverters的支持。 5.    自动注册MessageCodeResolver。 6.    对静态index.html的支持。 7.    对自定义Favicon的支持。 8.    主动使用ConfigurableWebBindingInitializer bean 三.    模板引擎的选择 FreeMarker Thymeleaf Velocity (1.4版本之后弃用,Spring Framework 4.3版本之后弃用) Groovy Mustache 注:jsp应该尽量避免使用,原因如下: 1.    jsp只能打包为:war格式,不支持jar格式,只能在标准的容器里面跑(tomcat,jetty都可以)  2.    内嵌的Jetty目前不支持JSPs 3.    Undertow不支持jsps 4.    jsp自定义错误页面不能覆盖spring boot 默认的错误页面 四.  相关依赖 1、 FreeMarker Demo <dependency>     <groupId>org.springframewor...
微步凌波 发布于 13小时前 阅读 10

Linux IO Scheduler(Linux IO 调度器)

     每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request。I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动,提高效率。每个设备的请求队列里的请求将按顺序被响应。实际上,除了这个队列,每个调度器自身都维护有不同数量的队列,用来对递交上来的request进行处理,而排在队列最前面的request将适时被移动到请求队列中等待响应。      IO调度器在内核栈中所处位置如下:              内核中实现的IO调度器主要有四种--Noop,Deadline,CFG, Anticipatory。 1,Noop算法      Noop调度算法是内核中最简单的IO调度算法。Noop调度算法也叫作电梯调度算法,它将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,当然对于一些在磁盘上连续的IO请求,Noop算法会适当做一些合并。这个调度算法特别适合那些不希望调度器重新组织IO请求顺序的应用。      这种调度算法在以下场景中优势比较明显:      1)在IO调度器下方有更加智能的IO调度设备。如果您的Block Device Drivers是Raid,或者SAN,NAS等存储设备,这些设备会更好地组织...
ChrisYuan 发布于 6小时前 阅读 8

实机操作,由IBM的技术大咖带领如何在短时间内迅速上线人工智能应用,名额有限快来报名!”

本次活动还特别设有实机操作环节,由IBM的技术大咖带领开发者在短时间内迅速上线人工智能应用。另外在最后,大家还可以参观体验IBM的创新中心,切身体会技术给时代带来的改变。
IBM技术沙龙

jenkins + gradle +android自动编译

前言     请确定你的centos版本是7.0及其以上,否则,在接下去的过程中你可能会遇到如下情况     /root/soft/Android/build-tools/25.0.3/aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /root/soft/Android/build-tools/25.0.3/aapt) 原因是glibc版本低 ,可以通过如下方式来查看支持的glibc版本 [root@hzlocal takungonlineV2]# strings /lib64/libc.so.6 |grep GLIBC_ GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 GLIBC_2.6 GLIBC_2.7 GLIBC_2.8 GLIBC_2.9 GLIBC_2.10 GLIBC_2.11 GLIBC_2.12 GLIBC_PRIVATE 发现不支持需要的GLIBC_2.14     什么?更新glibc版本……然后改库是linux的底层核心库,无法简单替换。会出错哦…………     还有方式就是使用旧版的aapt覆盖新build-tools中的相应命令。然而这样真的好么?版本升级总归是有道理的吧,直接替换成旧版不会出现问题么?即使现在没有,以后也会没有么? 步骤1: 插件管理中安装 Android Lint plugin 和 Android Sigin plugin 步骤2:     需要做一些基础配置     JDK的路径需要配置一下,git配置。默认的jdk会自动下载,git...
街角的小丑 发布于 2小时前 阅读 6

文件传输系统FTP

本文介绍的是vsftp来构架FTP server, 其中主要包括虚拟用户以保证vsftp用户的管理和安全,FTP over SSL, 基于IP的虚拟服务器
terry_hding 发布于 2年前 阅读 67

Spring @Async 应用于出现循环依赖的 Bean 报错的解决方案

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'a': Bean with name 'a' has been injected into other beans [b] in its raw version as part of a circular reference, but has eventually been wrapped.
傅易君 发布于 5个月前 阅读 112

laravel开发资源

集大成者 http://labs.infyom.com/laravelgenerator/  We have worked on many projects that required to create APIs and scaffold CRUD type of thing. And the problem that we faced was every time create bunch of files like Migration, Model, Controller, Repository and even test cases. 前端用到的 Restful API https://github.com/dingo/api  Alipay https://github.com/Latrell/Alipay  Markdown https://github.com/yccphp/laravel-5-markdown-editor  购物车 https://github.com/overtrue/laravel-shopping-cart  第三方登录,国内国外都有,超级丰富 https://github.com/laravel/socialite  短信验证码 https://github.com/toplan/laravel-sms  后台用到的 CRUD自动生成器 https://github.com/appzcoder/crud-generator  表单构造器 https://laravelcollective.com/docs/5.2/html  Datatable  http://datatables.yajrabox.com/  编辑器,百度的ueditor https://github.com/stevenyangecho/laravel-u-editor  OAuth2 Server https://github.com/lucadegasperi/oauth2-server-laravel  图片处理: http://image.intervention.io/getting_sta...
ifeixiang 发布于 1年前 阅读 210 点赞 1

session过期,使用Ajax每隔一段时间向服务器发送一次请求,来防止session过期

window.setInterval("connection();",20*60*1000); //定时发送ajax请求,防止Session过期  function connection(){       var link = "${ctx}/ajaxConnection/ajaxAction.json?rd=" + new Date().valueOf();//加随机参数防止缓存        $.ajax({       url:link,       type:"POST",       dataType:"json",       context:this,       success : function(data) {       },       error:function(data){        alert("error");       }      });
wangwenya 发布于 3年前 阅读 364

newCachedThreadPool()可缓存线程池详解,代码示例

package com.dy.pool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 在Executors类里面提供了一些静态工厂,生成一些常用的线程池。 3. newCachedThreadPool 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程, 那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。 此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。 */ public class CachedThreadPool { public static void main(String[] args) { System.out.println("欢迎来到线程世界!"); //创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newCachedThreadPool(); //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 CachedThreadPool.MyThread t1 = new CachedThreadPool().new MyThread("线程实例1"); CachedThreadPool.MyThread t2 = new CachedThreadPool().new MyThread("线程实例2"); CachedThreadPool.MyThread ...
洋哥6 发布于 1年前 阅读 176 点赞 1

zookeeper下载安装

zookeeper下载安装
Mr_Tea 发布于 11个月前 阅读 231

ubuntu kylin (ubuntu16)安装Tomcat7

第一个网址用Google打开。 http://www.myexception.cn/linux-unix/1944653.html http://lucene.apache.org/solr/quickstart.html tomcat 端口配置http://www.duntuk.com/how-install-apache-solr-46-apache-tomcat-7-use-drupal 一、环境说明: 操作系统:Ubuntu 12.04.2 LTS Tomcat:apache-tomcat-7.0.52 二、下载 下载地址:http://tomcat.apache.org/ 这里下载的是 apache-tomcat-7.0.52.tar.gz。 三、安装配置 我这下载完成后在当前用户的下载文件夹。进入下载文件夹: 解压下载的压缩包: ~$ tar -zxvf apache-tomcat-7.0.52.tar.g 重命名解压文件: ~$ mv apache-tomcat-7.0.52 tomcat7 将tomcat7文件夹移动到/usr/local/: ~$ sudo mv tomcat7 /usr/local/ 设置环境变量: $ sudo gedit ~/.bashrc 最下方加入: #set tomcat environment CATALINA_HOME=/usr/local/tomcat7 export CATALINA_HOME 保存退出。 进入tomcat7文件夹: ~$ cd /usr/local/tomcat7 编辑catalina.sh文件 : ~$ sudo gedit bin/catalina.sh 在文档开头添加: CATALINA_HOME=/usr/local/tomcat7 JAVA_HOME=/usr/local/java/jdk1.7.0_25 其中。JAVA_HOME是安装的jdk路径,CATALINA_HOME是tomca...
Airship 发布于 8个月前 阅读 231

java后台开发推荐书籍

java后台
席道坤 发布于 3个月前 阅读 49

Linux Vim编辑命令

首先安装Vim:$ sudo apt-get -y install vim;安装完了就可以使用VIM编辑了,Vim比VI好用得多。
boonya 发布于 2年前 阅读 534

dubbo系列----rpc初探

dubbo系列----rpc初探
令飞 发布于 2年前 阅读 501

Python实现单例模式

Python实现单例模式的几种方法
alazyer 发布于 2小时前 阅读 4

Spring-data-redis配置 订阅/发布 功能

Spring-data-redis配置 订阅/发布 功能
nibilly 发布于 2年前 阅读 296 评论 2

JAVA使用回溯法解决n皇后问题的算法

package test; public class nQueenQuestion { /** 皇后数组,数组的下标表示第几个皇后,也表示皇后在哪一行,元素的值表示皇后对应的列位置 */ private int[] queen; /**  * 计算并输出n皇后问题的位置  *   * @param n  *            有几个皇后  */ public void backtrackMethod(int n) { // 初始化数组 queen = new int[n]; for (int i = 0; i < queen.length; i++) { queen[i] = -1;// 初始化皇后的起点 } // 从第1个皇后开始 int k = 0; while (true) { queen[k] += 1;// 第k个皇后移动一个 /* 判断是否应该回溯到上一行开始搜索 */ if (queen[k] >= n) {// 第k个皇后移动后溢出,即跑出边界,则确定这一行的皇后没有任何位置可选 if (k > 0) {// 如果不是第一个皇后,则目标皇后更新为地k-1个皇后 queen[k] = -1;// 该皇后的起点回归到原始 k--;// 目标更新为第k-1个皇后 continue;// 跳过下面的判断,从方法体开始处开始 } else {// 如果该皇后是第一个,则已经遍历所有位置,跳出循环 break; } } ...
Awisper 发布于 2年前 阅读 29

linux下手动安装git教程

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。而国外的GitHub和国内的Coding都是项目的托管平台。但是在使用git工具的时候,第一步要学会如何安装git,本教程就手把手教大家如何手动编译安装git。 1、介绍 使用Coding管理项目,上面要求使用的git版本为1.8.0以上,而很多yum源上自动安装的git版本为1.7,所以需要掌握手动编译安装git方法。 2、安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker 3、删除已有的git yum remove git 4、下载git源码 切换到你的包文件存放目录下 cd /usr/src 下载git安装包 wget https://www.kernel.org/pub/software/scm/git/git-2.8.3.tar.gz 解压git安装包 tar -zxvf git-2.8.3.tar.gz cd git-2.8.3 配置git安装路径 ./configure prefix=/usr/local/git/ 编译并且安装 make && make install 查看git版本号 git --version git已经安装完毕 5、将git指令添加到bash中 vi /etc/profile 在最后一行加入 export PATH=$PATH:/usr/local/git/bin 让该配置文件立即生效 source /etc/profile 著作权归作者所有。商业转载请联系作者获...
李劲辉 发布于 3小时前 阅读 4

Tomcat启动过程原理详解

基于Java的Web 应用程序是 servlet、JSP 页面、静态页面、类和其他资源的集合,它们可以用标准方式打包,并运行在来自多个供应商的多个容器。Web 应用程序存在于结构化层次结构的目录中,该层次结构是由 Java Servlet 规范定义的。Web 应用程序的根目录包含直接存储或存储在子文件夹中的所有公共资源,比如图像、HTML 页面等。构成:Web应用由Web组件(一组Java类库)、html文件,静态资源文件(如图像)、帮助类和库组成。 1 – Tomcat Server的组成部分 1.1 – Server A Server element represents the entire Catalina servlet container. (Singleton) 1.2 – Service A Service element represents the combination of one or more Connector components that share a single Engine Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求 1.3 – Connector 一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户 TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求 Coyote Http/1.1 Connector 在端口...
耀子 发布于 2年前 阅读 1369

ContentType大全

类型 ContentType的 ".*"="application/octet-stream" ".001"="application/x-001" ".301"="application/x-301" ".323"="text/h323" ".906"="application/x-906" ".907"="drawing/907" ".a11"="application/x-a11" ".acp"="audio/x-mei-aac" ".ai"="application/postscript" ".aif"="audio/aiff" ".aifc"="audio/aiff" ".aiff"="audio/aiff" ".anv"="application/x-anv" ".asa"="text/asa" ".asf"="video/x-ms-asf" ".asp"="text/asp" ".asx"="video/x-ms-asf" ".au"="audio/basic" ".avi"="video/avi" ".awf"="application/vnd.adobe.workflow" ".biz"="text/xml" ".bmp"="application/x-bmp" ".bot"="application/x-bot" ".c4t"="application/x-c4t" ".c90"="application/x-c90" ".cal"="application/x-cals" ".cat"="application/s-pki.seccat" ".cdf"="application/x-netcdf" ".cdr"="application/x-cdr" ".cel"="application/x-cel" ".cer"="application/x-x509-ca-cert" ".cg4"="application/x-g4" ".cgm"="application/x-cgm" ".cit"="application/x-cit" ".class"="java/*" ".cml"="text/xml" ".cmp"="application/x-cmp" ".cmx"="application/x-cmx" ".cot"="appl...
大哥哥一休 发布于 2年前 阅读 80

基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

![poi](http://poi.apache.org/resources/images/pb-poi.png "poi") # 注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能。过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好。 # 序 由于 poi 本身只是针对于 excel 等office软件的一个工具包,在一些常规的 excel 导入导出时,还需要再做一次精简的封装,简化代码耦合。 ## 一、现状 本人经历过几家公司的代码封装,导入导出一般存在下面的情况。 ### 1.1 导入 1. 传入文件地址,返回 Sheet 对象,在业务代码中进行循环遍历,做相对应的类型转换,业务处理(二零零几年的代码框架) 2. 传入文件地址,返回 List 的对象,外部直接做强转 3. 传入文件地址,返回 List 的对象,外部将字符串对象转换为对应的类型 总结:如果只有上述的选择,本人是比较倾向于第二种,毕竟对外层是非常友好的 ### 1.2 导出 1. 直接在逻辑代码中进行遍历封装sheet,传入到生成file的方法中(二零零几年的代码框架) 2. 先循环遍历 List 对象,转换为 List> 对象,带上 fieldName 传入到封装好excel生成的方法中,内部则使用 map.get() 方法操作 3. 直接将 List 对象带上 fieldName 传入到封装...
倚楼听风雨_ 发布于 3天前 阅读 3463 评论 16 点赞 6

您想参观体验IBM的创新中心,切身体会技术给时代带来的改变么?”

本次活动还特别设有实机操作环节,由IBM的技术大咖带领开发者在短时间内迅速上线人工智能应用。另外在最后,大家还可以参观体验IBM的创新中心,切身体会技术给时代带来的改变。
IBM技术沙龙

Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 - 《史蒂夫·乔布斯传》 』 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+,ElasticSearch 2.3.2 本文提纲 一、ES 的使用场景 二、运行 springboot-elasticsearch 工程 三、springboot-elasticsearch 工程代码详解   推荐 -  「springboot-learning-example」开源项目,Fork 一下,多多 Pull Request~ spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。 https://git.oschina.net/jeff1993/springboot-learning-example 一、ES 的使用场景 简单说,ElasticSearch(简称 ES)是搜索引擎,是结构化数据的分布式搜索引擎。 在《Elasticsearch 和插件 elasticsearch-head 安装详解》  和 《Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用》 我详细的介绍了如何安装,初步使用了 IK 分词器。 这里,我主要讲下 SpringBoot 工程中如何使用 ElasticSearch。 ES 的使用场景大致分为两块 1. 全文检索。加上分词(IK 是其中一个)、拼音插件等可以成为强大的全文搜索引擎。 2. 日志统计分析。可以...
泥沙砖瓦浆木匠 发布于 6天前 阅读 3725 评论 13 点赞 5

Spring思维导图,让Spring不再难懂(ioc篇)

>写在前面 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象。 就好像我们无需考虑对象的销毁回收一样,因为java垃圾回收机制帮助我们实现了这个过程;而ioc则是让我们无需考虑对象的创建过程,由ioc容器帮我们实现对象的创建、注入等过程。 ![Spring知识细节.png](http://upload-images.jianshu.io/upload_images/4120002-55b18f0249f25054.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >控制反转 ![Spring ioc简介.png](http://upload-images.jianshu.io/upload_images/4120002-7e89f6da34fe7bc9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >spring ioc容器 在Spring框架中的核心组件只有三个:Core、Context和Bean。它们构建起了整个Spring的骨骼架构,没有它们就不可能有AOP、Web等特性功能。 ![Spring 整体结构图.jpg](http://upload-images.jianshu.io/upload_images/4120002-1ad5bb59e5e9f209.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 如果说在三个核心中再选出一个核心,那就非Bean莫属了。可以说,Spring就是面向B...
java思维导图 发布于 1周前 阅读 9002 评论 25 点赞 21

高性能Web Server思考

# 0xFF **Web服务可以让你在HTTP协议的基础上通过XML或者JSON来交换信息。** 醍醐灌顶!!! 你可以编写一段简短的代码,通过抓取这些信息然后通过标准的接口开放出来,就如同你调用一个本地函数并返回一个值。(rpc? rest?) 平台无关性. 目前主流的有如下几种Web服务:REST、SOAP。 **作为客户端** 向远端某台机器的的某个网络端口发送一个请求 **作为服务端** 把服务绑定到某个指定端口,并且在此端口上监听 # Socket编程 现在的网络编程几乎都是用Socket来编程 而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket也是一种文件描述符. 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 ## Socket如何通信 网络中的进程之间通过Socket通信.利用三元组(ip地址,协议,端口)就可以标识网络中的唯一进程 ![](https://github.com/astaxie/build-web-application-with-golang/raw/master/zh/images/8.1.socket.png?raw=true) ### TCP Socket **TC...
陶加涛 发布于 4天前 阅读 885 评论 4 点赞 1

aio系列文档(1)----t-io的hello world

hello world例子简介 本例子演示的是一个典型的TCP长连接应用,代码位于example/helloworld目录中。 服务端和客户端的消息协议比较简单,消息头为4个字节,用以表示消息体的长度,消息体为一个字符串的byte[] 服务端先启动,监听6789端口 客户端连接到服务端后,会主动向服务器发送一条消息 服务器收到消息后会回应一条消息 之后,框架层会自动从客户端发心跳到服务器,服务器也会检测心跳有没有超时 框架层会在断链后自动重连(对t-io来说,只需多一行代码便拥有自动重连功能) 公共模块代码 <dependency> <groupId>org.t-io</groupId> <artifactId>tio-core</artifactId> <version>1.6.9.v20170408-RELEASE</version> </dependency> 注:有时候服务器和客户端的业务消息包结构不一样,这种情况下,消息包的定义就不要放在公共模块 public class HelloPacket extends Packet { public static final int HEADER_LENGHT = 4;//消息头的长度 public static final String CHARSET = "utf-8"; private byte[] body; /** * @return the body */ public byte[] getBody() { return body; } /** * @para...
talent-tan 发布于 1个月前 阅读 3116 评论 16 点赞 13 打赏 1

Nginx 实现灰度发布的三种方式

Nginx 实现灰度发布的三种方式
IamOkay 发布于 5天前 阅读 456 点赞 1

redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性。
爱宝贝丶 发布于 4天前 阅读 598 评论 4 点赞 1

RocketMQ源码解析:事务消息

> 原文地址:[RocketMQ源码解析:事务消息](https://github.com/YunaiV/Blog/blob/master/RocketMQ/1011-RocketMQ源码解析:事务消息.md) > `RocketMQ` **带注释**地址 :[YunaiV/incubator-rocketmq](https://github.com/YunaiV/incubator-rocketmq) > **😈本系列每 1-2 周更新一篇,欢迎订阅、关注、收藏 GitHub。** ------- - [1. 概述](#) - [2. 事务消息发送](#) - [2.1 Producer 发送事务消息](#) - [2.2 Broker 处理结束事务请求](#) - [2.3 Broker 生成 ConsumeQueue](#) - [3. 事务消息回查](#) - [3.1 Broker 发起【事务消息回查】](#) - [3.1.1 官方V3.1.4:基于文件系统](#) - [3.1.1.1 存储消息到 CommitLog](#) - [3.1.1.2 写【事务消息】状态存储(TranStateTable)](#) - [3.1.1.3 【事务消息】回查](#) - [3.1.1.4 初始化【事务消息】状态存储(TranStateTable)](#) - [3.1.1.5 补充](#) - [3.1.2 官方V4.0.0:基于数据库](#) - [3.2 Producer 接收【事务消息回查】](#) # 1. 概述 **必须必须必须** 前置阅读内容: * [《事务消息(阿里云)》](https://help.aliyun.com/document_detail/43348.html?spm=5176.doc43490.6.566.Zd5Bl7) # 2. 事务消息发送...
芋艿V 发布于 4天前 阅读 378 评论 2

如何保证微服务接口的幂等性

在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: > 1. 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 > 2. 在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次 > 3. 当这笔订单开始支付,在支付请求发出之后,在服务端发生了扣钱操作,接口响应超时了,调用方重试了一次 > 4. 一个订单状态更新接口,调用方连续发送了两个消息,一个是已创建,一个是已付款。但是你先接收到已付款,然后又接收到了已创建 > 5. 在支付完成订单之后,需要发送一条短信,当一台机器接收到短信发送的消息之后,处理较慢。消息中间件又把消息投递给另外一台机器处理 以上问题,就是在单体架构转成微服务架构之后,带来的问题。当然不是说单体架构下没有这些问题,在单体架构下同样要避免重复请求。但是出现的问题要比这少得多。 为了解决以上问题,就需要保证接口的幂等性,接口的幂等性实际上就是**接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的**。有些接口可以天然的实现幂等性,比如查询接口,对于查询来说,你查询一次和两次,对于系统来说,没有任何影响,查出的结果也是一样。 除了查询功能具有天然的幂等性...
wangyan9110 发布于 3天前 阅读 470 评论 2

mybatis思维导图,让mybatis不再难懂(一)

>写在前面 与hibernate相比,我无疑更喜欢mybatis,就因为我觉得它真的好用,哈哈。它简单上手和掌握;sql语句和代码分开,方便统一管理和优化;当然缺点也有:sql工作量很大,尤其是字段多、关联表多时,更是如此。而且sql依赖于数据库,导致数据库移植性差。 选用一个框架之前最好先了解它的优缺点,对项目最好用,效率最高的才是一个你最好的选择。 >mybatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 >直接上思维导图 ![1、mybatis简介.png](http://upload-images.jianshu.io/upload_images/4120002-8593f17572d1a1b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![2、与hibernate对比.png](http://upload-images.jianshu.io/upload_images/4120002-fe73ae40aeece93e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![3、几个关键类.png ](http://upload-images.jianshu.io/upload_images/412000...
java思维导图 发布于 1个月前 阅读 9622 评论 27 点赞 28

Spring思维导图,让spring不再难懂(一)

Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架
java思维导图 发布于 3周前 阅读 4587 评论 6 点赞 16

一步步完成Maven+Spring+Dubbo+Zookeeper的整合示例

本文给出一个整合Maven+Spring+Dubbo+Zookeeper的示例,并且一步步给出完成步骤,并对其中可能遇到的问题进行解决~ Maven模块化 创建一个名为dubbo-demo的Maven工程,该工程包含三个模块 dubbo-demo-interface   (定义对外开放接口) dubbo-demo-provider   (接口实现) dubbo-demo-consumer (接口调用) dubbo-demo工程中的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx.dubbo.demo</groupId> <artifactId>dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>dubbo-demo-provider</module> <module>dubbo-demo-consumer</module> <module>dubbo-demo-interface</module> </modules> </project> 关于dubbo-demo Maven工程的模块化构建,请参考博文【使用Maven构建模块化工程】 接下来,我们就一步一步来完成interface、provider以及con...
王孟君 发布于 7天前 阅读 1034 评论 4 点赞 2

t-io 入门篇(三)即时消息发送demo学习

T-io Im聊天demo分析
卡尔码农 发布于 2周前 阅读 2273 评论 14 点赞 5

t-io闭源发展通告

t-io闭源发展通告 鉴于本人自身问题及周边环境因素,t-io将择期闭源发展,请知悉 t-io的闭源解读 不是完全闭源,代码仍会对以下用户进行开放,并提供技术支持 2017年4月20号前已经用上t-io的朋友 这么些时候接触下来,我觉得靠谱并有良知的技术朋友 认可的开源中国的开源作者 2017年4月20号前未使用过t-io,但愿意有偿使用的 摸索一种更好更适应中国环境的开源方式来玩开源,让无良喷子们得不到好东西,让有良知的技术人员更好地享受技术壁垒 闭源了,这里给t-io简单作了一小结吧 t-io的发展 t-io的前身是talent-aio,2016年11月19号形式在码云开源,2017年1月1号正式入驻开源中国,2017年4月1号改名为t-io 官方QQ群,最初免费入群,发展太快,遂开启付费模式,入群费用分别是0.1,6.6,50,后来开启谢绝加入模式,只由本人物色好的技术人员入群。 用户量,由第一个月的缪缪数人,发展到现在的几十人(只算反馈到我这的),考虑到t-io框架的高端性和稀用性,这个用户量还是不错的。 本人的道歉 曾经说过性能秒掉netty,后来觉得框架的对比需要综合考虑,这话刺激到各位的,请各位原谅 曾经说过struts的作者们是一群很努力,但天赋不足的工程师。这话刺激到各位的,请各位原...
talent-tan 发布于 1个月前 阅读 2384 评论 34 点赞 10

基于python的七种经典排序算法

一、排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定的。 内排序和外排序 内排序:排序过程中,待排序的所有记录全部放在内存中 外排序:排序过程中,使用到了外部存储。 通常讨论的都是内排序。 影响内排序算法性能的三个因素: 时间复杂度:即时间性能,高效率的排序算法应该是具有尽可能少的关键字比较次数和记录的移动次数 空间复杂度:主要是执行算法所需要的辅助空间,越少越好。 算法复杂性。主要是指代码的复杂性。 根据排序过程中借助的主要操作,可把内排序分为: 插入排序 交换排序 选择排序 归并排序 按照算法复杂度可分为两类: 简单算法:包括冒泡排序、简单选择排序和直接插入排序 改进算法:包括希尔排序、堆排序、归并排序和快速排序 以下的七种排序算法只是所有排序算法中最经典的几种,不代表全部。 二、 冒泡排序 冒泡排序(Bubble sort):时间复杂度O(n^2) 交换排序的一种。其核心...
舒运 发布于 2周前 阅读 483 评论 1 点赞 1

Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)

Spring Boot官方文档中文翻译(更新至 29. 使用SQL数据库)
侯法超 发布于 2个月前 阅读 4675 评论 19 点赞 12

tomcat启动报错Invalid character found in method name. HTTP method names must be tokens

tomcat运行一段时间后,重新发包部署出现报错::Invalid character found in method name. HTTP method names must be tokens
FrendLin 发布于 2个月前 阅读 1823

t-io官方QQ群入群规范(V4.0-2017-05-09)

前言:使用和学习t-io不需要入群,群里并无任何额外的资料和福利,但是如果要入群,则必须按下面的规范来。 t-io项目早期因为无规范地发展,导致了一些不良的后果,甚至差点闭源,这些经历,倒逼t-io进入不将就的规范管理阶段!您看到的每一条入群规则,其实都是一些故事! 入群途径一:码云帐号入群 您必须要有码云帐号,该帐号必须star和fork过t-io项目,且star和fork排名不能在第一页和第二页(也就是说不能是最近才star和fork的) 加QQ:33745965,并附上"t-io 123"或"tio 123" 好友通过后,请您主动把您的码云主页地址以及截图发送过来(不要只发截图) 加QQ示范截图 等待审核,审核通过即会加入群 注意:以上步骤是必要条件,但不是充分条件 入群途径二:高等级群友推荐入群 群等级在六级的拥有此特权,一周只能用一次,一共只能用6次 仍然需要提供码云帐号,但是没有途径一的要求 需要说明推荐理由 入群途径三:助力t-io生态系统入群 助力传送门:http://www.t-io.cn:9292/donate.html?v=16 助力点数:>665人民币的随机整数,不允许<=665 加QQ:33745965,并附上"已助力${助力点数}点",譬如"已助力999999点"! 注:入群后请务必先看 “本群须知”...
talent-tan 发布于 4周前 阅读 1259 评论 12 点赞 2

aio系列文档(2)----图解bytebuffer

因何而写 网上关于bytebuffer的文章真的很多,为何在此还要写一篇呢?主要是基于以下几点考虑 很多人在使用t-io时,还不会bytebuffer,只会照着t-io提供的例子照猫画虎,不利于灵活运用 网上搜到的一些相关文章,讲得不是太易懂,不利于初学者灵活运用bytebuffer 本文旨在讲解灵活运用bytebuffer所需的最小知识,以帮助用户快速掌握bytebuffer 用极易的方式认识一下bytebuffer bytebuffer之第一眼印象 我们可以把bytebuffer理解成如下几个成员组成的一个新对象,对,就是一个普通的java对象,像string一样的java对象。(强调一下,这里只是说这样理解,实际上有些bytebuffer的实现类并非这样实现,并且这里只列出掌握bytebuffer所需要的最小知识集合,其它诸如mark等字段本文并不介绍,以免增加初学者的惑度) byte[] bytes: 用来存储数据 int capacity: 用来表示bytes的容量,那么可以想像capacity就等于bytes.size(),此值在初始化bytes后,是不可变的。 int limit: 用来表示bytes实际装了多少数据,可以容易想像得到limit <= capacity,此值是可灵活变动的 int position: 用来表示在哪个位置开始往bytes写数据或是读数据,此值是可灵活变动的 通过下图,对bytebuffer形成...
talent-tan 发布于 3周前 阅读 3486 评论 25 点赞 12

Node.js 成为 Web 应用开发最佳选择的十个原因

一项颠覆性的技术进入技术市场总会带来一阵震惊,但随之而来往往是被放弃。然而,Node.js 当然不是这样的情况,它是一个开源的、跨平台的基于 Chrome 的 JavaScript 运行时。Node.js 由 Ryan Dahl 于 2009 年开发,该平台现在已成为实时 Web 应用开发的独特选择,通过提供高度交互的用户体验来提高 ROI。 使用 Node.js 的最大优点是开发人员可以在客户端和服务器端编写 JavaScript。值得一提的是,像 PayPal, Yahoo, eBay, Netflix, The Mail Online, 和 Walmart 这样的企业已经通过使用 Node.js 实现了各自的业务。继续阅读下面的内容,了解大多数企业选择 Node.js 开发 Web App 的十大主要原因。 点击此处了解顶级 JavaScript 框架/库 使用 Node.js 进行 Web App 开发人气暴涨背后的十大原因: Image Source: CronJ 1. 加快开发进度 Node.js 使用由 Google 开发的 V8 引擎,它可以将 JavaScript 编译成原生机器码并快速执行。由于 Node.js 使用事件驱动的非阻塞 I/O 模型,因此对于内存使用和数据密集的实时 Web 应用十分高效和轻便,可在多个设备上工作。 使用 Node.js,可以非常快速地执行常见的 Web 应用任务,例如读取或写入数据库,读取或写入网络连接,以及读取或写...
编辑部的故事 发布于 2周前 阅读 7101 评论 54 点赞 4

golang trace工具使用

1)增加如下代码 //导入包 import ( "net/http" _ "net/http/pprof" ) //增加如下代码 go func() { fmt.Println(http.ListenAndServe(":5567", nil)) }() 2)执行curl 127.0.0.1:5567/debug/pprof/trace?seconds=10 > trace.data,获取到trace.data数据 3) 执行 go tool trace -http=':8888' your_app_bin trace.data。会跳转到浏览器查看trace到数据.
xloogson 发布于 55分钟前 阅读 9

nginx开启GZIP来压缩网页

HTTP协议上的GZIP编码是一种用来改进web应 用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务 器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果 就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。 减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip 是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。 在Nginx安装完成之后,我们可以开启Gzip压缩功能,这里Nginx默认只能对text/html类型的文件进行压缩。   下面的指令为开启Gzip的指令: # 启用 gzip 压缩功能 gzip on; # 默认值是1.1,就是说对HTTP/1.1协议的请求才会进行gzip压缩 gzip_http_version 1.1; gzip_vary on; # 压缩级别,1压缩比最小处理速度最快,9压缩比最大但处理最慢,同时也最消耗CPU,一般设置为3就可以了 gzip_comp_level 6;...
jin_6868 发布于 1小时前 阅读 1

kill -9杀掉nginx主进程、reload失败解决办法

前言: 无意间使用 kill -9 命令杀掉了nginx的主进程,当我再次使用 ./nginx -s reload 重新刷新nginx的时候,一直出现了下面的错误信息: nginx: [alert] kill(27905, 1) failed (3: No such process)   同时,执行命令 ./nginx -t 返回的结果如下: nginx: the configuration file /opt/nginx-1.4.7/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx-1.4.7/conf/nginx.conf test is successful   nginx正常运行,只是无法使用reload刷新,我也头大了,怎么办呢。 网上找到如下解决方法: 文章地址: http://www.2cto.com/os/201303/198394.html   文章中有一个命令 fuser -n tcp 80  查看80端口被哪些程序占用。最终控制台输出的信息如下: 80/tcp: 4613 4614   好吧,kill掉这2个子进程。 重新启动nginx,再次使用 ./nginx -s reload ,,OK了! 还好没有酿成大祸。。记录下来,以便需要时参考。          文章转载地址:http://www.cnblogs.com/zhoubang521/p/5200236.html...
jin_6868 发布于 1小时前 阅读 2

实机操作,由IBM的技术大咖带领如何在短时间内迅速上线人工智能应用,名额有限快来报名!”

本次活动还特别设有实机操作环节,由IBM的技术大咖带领开发者在短时间内迅速上线人工智能应用。另外在最后,大家还可以参观体验IBM的创新中心,切身体会技术给时代带来的改变。
IBM技术沙龙

nginx处理静态资源的配置

修改nginx.conf文件,用于nginx处理静态资源。   主要配置如下(在server配置中加入location配置即可): server { listen 80; server_name 123.57.162.75; charset utf-8; index index.html index.htm index.jsp index.do; root /opt/nginx-1.4.7/html/resources; #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /opt/nginx-1.4.7/html/resources; #expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力 expires 7d; } }          文章转载地址:http://www.cnblogs.com/zhoubang521/p/5200280.html...
jin_6868 发布于 1小时前 阅读 1

Java并发编程:Callable、Future和FutureTask原理解析

返回结果的任务Callable与Future Executor框架使用Runnable作为其基本的任务表示形式。Runnable是一种有很大局限的抽象,它不能返回一个值或抛出一个受检查的异常。Runnable接口: public interface Runnable { public abstract void run(); } 由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。 许多任务实际上都是存在延迟的计算,对于这些任务,Callable是一种更好的抽象:它会返回一个值,并可能抛出一个异常。Callable接口: public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; } 可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。 Runnable和Callable描述的都是抽象的计算任务。这些任务通常是有生命周期的。Executor执行的任务有4个生命周期阶段:创建、提交、开始和完成。由于有些任务可能要执行很长时间,因此通常希望可以取消这些任务。在Executor框架中,已提交但尚未开始的任务可以取消,对于已经开始执行...
舒运 发布于 1小时前 阅读 1

Java并发编程:Callable、Future和FutureTask

Java并发编程:Callable、Future和FutureTask   在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。   这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。   如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。   而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。   今天我们就来讨论一下Callable、Future和FutureTask三个类的使用方法。以下是本文的目录大纲:   一.Callable与Runnable   二.Future   三.FutureTask   四.使用示例   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3949310.html    一.Callable与Runnable   先说一下java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法: public interface Runnable {     public abstract void run(); }   Callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个...
舒运 发布于 1小时前 阅读 1

docker 镜像的使用和下载

docker 搞好了,,,肯定要镜像啊,,可是镜像从哪里来?? 一般来说,我们的 基础入门docker 书籍都是这样说的,比如 要 搞已 tomcat 的 镜像 ``` docker pull tomcat ``` 可是我按照这样搞了,,,结果出现了问题, ``` Tag latest not found in repository 意思就是我们获取 tomcat的镜像,可是并没有 指定 tag,一般来说是 要指定 那个tag的值的 比如我们一般要使用 docker pull tomcat:latest ``` 困惑并不仅仅是这些。如果我从资源库docker pull一个镜像却没指定标签,会发生什么呢?如果你认为会获取下所有的镜像,那么就错了,它只会获取下来带有latest标签的那个。如果你需要获取全部镜像,需要加上-a标志。 如果你在资源库执行了pull操作,却没带latest标签,会发生什么呢?如下所示: $ docker pull amouat/myrepo Pulling repository amouat/myrepo 2015/01/21 12:04:06 Tag latest not found in repository amouat/myrepo 意料之中的是Docker给出了错误信息。但是我认为你不知道这其中发生了什么。 这个是docker 规定的吧,可以参考 http://dockone.io/article/165 好吧,那我就带上 latest 吧,,, 也许是我的中国网络访问外国比较慢,,也许是我的 docker 比...
欧阳懂渊 发布于 2小时前 阅读 1

linux设置系统级代理

# set system proxy http_proxy="http://username:password@172.2.15.130:8080" ftp_proxy="http://username:password@172.2.15.130:8080" export ftp_proxy http_proxy no_proxy
健康的程序员 发布于 2小时前

jenkins + gradle +android自动编译

前言     请确定你的centos版本是7.0及其以上,否则,在接下去的过程中你可能会遇到如下情况     /root/soft/Android/build-tools/25.0.3/aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /root/soft/Android/build-tools/25.0.3/aapt) 原因是glibc版本低 ,可以通过如下方式来查看支持的glibc版本 [root@hzlocal takungonlineV2]# strings /lib64/libc.so.6 |grep GLIBC_ GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 GLIBC_2.6 GLIBC_2.7 GLIBC_2.8 GLIBC_2.9 GLIBC_2.10 GLIBC_2.11 GLIBC_2.12 GLIBC_PRIVATE 发现不支持需要的GLIBC_2.14     什么?更新glibc版本……然后改库是linux的底层核心库,无法简单替换。会出错哦…………     还有方式就是使用旧版的aapt覆盖新build-tools中的相应命令。然而这样真的好么?版本升级总归是有道理的吧,直接替换成旧版不会出现问题么?即使现在没有,以后也会没有么? 步骤1: 插件管理中安装 Android Lint plugin 和 Android Sigin plugin 步骤2:     需要做一些基础配置     JDK的路径需要配置一下,git配置。默认的jdk会自动下载,git...
街角的小丑 发布于 2小时前 阅读 6

Python实现单例模式

Python实现单例模式的几种方法
alazyer 发布于 2小时前 阅读 4

使用Redis存储Nginx+Tomcat负载均衡集群的Session

环境:Cent OS 7.0(虚拟机环境)、Nginx 1.9.8、Redis 3.2.1 一、背景 在使用Nginx+Tomcat实现负载均衡的时候,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因为会出现session不同步或者丢失的问题。 二、Nginx安装与配置 1、Nginx安装 网上的资源对于安装Nginx的介绍比较多,例如最简单的为: (1) 获取nginx,在http://nginx.org/download/上可以获取当前最新的版本下载,例如: wget http://nginx.org/download/nginx-1.9.8.tar.gz (2)解压缩tar -xvf nginx-1.9.8.tar.gz包。 (3)进入解压缩目录,执行./configure --prefix=/usr/local/nginx-1.9.8 将Nginx安装到/usr/local/nginx-1.9.8目录下 (4)make & make install 安装的过程会将Nginx安装到/usr/local/nginx-1.9.8目录下,启动Nginx测试是否可以正常启动。 2、修改Nginx配置多Tomcat服务器 2.1、修改conf/nginx.conf文件,在server标签上边添加upstream如下: upstream mynginxserver { #weigth参数表示权值,权值越高被分配到的几率越大 #本机上的Squid开启3128端口 server 127.0.0.1:8080 weight=1; server 127.0.0.1:8060 weight=1...
舒运 发布于 2小时前 阅读 3

java中将数字转换成excel中列名

public static void main(String[] args) { // 列索引从0开始 int columnIndex = 730; String back = ""; if (columnIndex <= 0) { back = ""; } String columnStr = ""; do { /* 索引从0开始,如果不减1,从倒数第二位向前都会递加一位 如730,减一是ABC,不减是BCC */ if (columnStr.length() > 0) { columnIndex--; } columnStr = ((char) (columnIndex % 26 + (int) 'A')) + columnStr; columnIndex = (int) ((columnIndex - columnIndex % 26) / 26); } while (columnIndex > 0); back = columnStr; System.out.println(back); }...
李阳-kevin 发布于 2小时前 阅读 2

redis + Tomcat 8 的session共享解决

如果英文不错的看,建议直接看官网吧,官网写的挺清楚。下面的内容是转载的一篇文章,自己补充了一些,供大家参考,也欢迎大家一起讨论 官方截止到2015-10-12前是不支持Tomcat8的,详情见官网:https://github.com/jcoleman/tomcat-redis-session-manager 锐洋智能修改的支持Tomcat8的 reyo.redis.session.manager.tomcat8 修改的源代码:RedisSessionManager.java     @SuppressWarnings("deprecation")     private void initializeSerializer() throws ClassNotFoundException, IllegalAccessException, InstantiationException {         log.info("Attempting to use serializer :" + serializationStrategyClass);         serializer = (Serializer) Class.forName(serializationStrategyClass).newInstance();         Loader loader = null;         if (getContainer() != null) {             loader = getContainer().getLoader();         }         ClassLoader classLoader = null;         if (loader != null) {             classLoader = loader.getClassLoader();         ...
舒运 发布于 2小时前 阅读 1

禁用apache httpClient的debug信息

disable apache httpClient debug info
喔喔兒 发布于 2小时前 阅读 2

ubuntu修改profile导致无法登录问题的解决

安装jdk修改profile导致的无法登录问题
Object_小风 发布于 2小时前 阅读 2

Java进程CPU使用率高排查

方法一: 转载:http://www.linuxhot.com/java-cpu-used-high.html 1.jps 获取Java进程的PID。 2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。 3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。 4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。 5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。 6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。   方法二: 1.使用top 定位到占用CPU高的进程PID top  通过ps aux | grep PID命令 2.获取线程信息,并找到占用CPU高的线程 ps -mp pid -o THREAD,tid,time | sort -rn  3.将需要的线程ID转换为16进制格式 printf "%x\n" tid 4.打印线程的堆栈信息 jstack pid |grep tid -A 30
舒运 发布于 2小时前

从glibc源码看系统调用原理

前言       本文试图解答系统调用与库函数之间的关系、glibc库函数的实现原理、系统调用的实现原理等知识,本文讲述的CPU架构限定为ARM核心,为什么是ARM呢,原因很简单,X86我不熟。 系统调用概念       从某种程度上来说,操作系统就是一个计算机的资源管理器,也可以理解为一个虚拟的计算机。那么这台虚拟计算机要向外提供功能,就必须提供一些接口,这些接口就是系统调用。       有很多开发人员经常搞不清楚库函数和系统调用之间的关系,以为库函数(比如fork、read、write等)就是系统调用,从内核层次来划分,这其实是不对的,为此可以声明以下几点: 系统调用是操作系统内核为了向外提供服务而规定的一些调用接口(调用规范),它处于内核空间而非用户空间。 库函数(比如glibc)处于用户空间,它不是系统调用,但是它通常是进行系统调用的入口,它内部封装了进行系统调用的细节(和平台有关,比如arm和mips等),大多数库函数暴露的接口和系统调用接口都是一一对应的。 进行系统调用不一定非得经过库函数,应用代码依然可以使用嵌入式汇编/内联汇编/syscall等方式发起系统调用。                                         ...
黑客画家 发布于 2小时前 阅读 2

apache-common pool使用

http://blog.csdn.net/tiantiandjava/article/details/42915331 http://lavasoft.blog.51cto.com/62575/217547/ http://blog.csdn.net/bhy5683/article/details/8776498 http://pangwu86.iteye.com/blog/1123801
yiqifendou 发布于 2小时前 阅读 3

Jeesite 二次开发-多用户登录Shiro模块

    此次二次开发将从头开始记录,开发顺序会从多用户模块入手,解决默认显示首页,前后台登录分离等问题。 问题难点 默认首页的显示 Shiro权限模块的多用户登录验证等,较为复杂 数据库表     本次使用的数据库为MySql,拓展数据库管理工具为Navicat。        在Jeesite搭建完成的基础上,首先从数据库表的建设开始,后台用户表已经有了,这里建立的是前台用户表,前后用户分离,参照后台用户表的字段信息,去掉了几个字段,且将Id主键修改为自增长的Int类型,不按照原始设定的UUID字符串,为了利用到自增长的排序功能。 前台用户表 front_user 配置文件     Jeesite中已经集成代码生成模块,即通过依赖注入(DI-Dependency Injection)的方式,构建相关Java类文件,自动生成简单的增删查改功能。     找到resources包下的jeesite.properties文件,简单设置以下几项,此次使用的mysql的配置。 jdbc.type 数据库类型 jdbc.driver 数据库驱动jar包 jdbc.url 数据库链接 jdbc.username 用户名 jdbc.password 密码 projectPath 该项为注释项,切换到Source模式去除注释后可显示,用于设置代码生成路径,指定为当前工程的所在物理路径 模块生成     使用代...
华山猛男 发布于 2小时前 阅读 2

第 2 章 应用层

HTTP
xkl1992 发布于 3小时前 阅读 1

基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

![poi](http://poi.apache.org/resources/images/pb-poi.png "poi") # 注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能。过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好。 # 序 由于 poi 本身只是针对于 excel 等office软件的一个工具包,在一些常规的 excel 导入导出时,还需要再做一次精简的封装,简化代码耦合。 ## 一、现状 本人经历过几家公司的代码封装,导入导出一般存在下面的情况。 ### 1.1 导入 1. 传入文件地址,返回 Sheet 对象,在业务代码中进行循环遍历,做相对应的类型转换,业务处理(二零零几年的代码框架) 2. 传入文件地址,返回 List 的对象,外部直接做强转 3. 传入文件地址,返回 List 的对象,外部将字符串对象转换为对应的类型 总结:如果只有上述的选择,本人是比较倾向于第二种,毕竟对外层是非常友好的 ### 1.2 导出 1. 直接在逻辑代码中进行遍历封装sheet,传入到生成file的方法中(二零零几年的代码框架) 2. 先循环遍历 List 对象,转换为 List> 对象,带上 fieldName 传入到封装好excel生成的方法中,内部则使用 map.get() 方法操作 3. 直接将 List 对象带上 fieldName 传入到封装...
倚楼听风雨_ 发布于 3天前 阅读 3463 评论 16 点赞 6

Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 - 《史蒂夫·乔布斯传》 』 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+,ElasticSearch 2.3.2 本文提纲 一、ES 的使用场景 二、运行 springboot-elasticsearch 工程 三、springboot-elasticsearch 工程代码详解   推荐 -  「springboot-learning-example」开源项目,Fork 一下,多多 Pull Request~ spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。 https://git.oschina.net/jeff1993/springboot-learning-example 一、ES 的使用场景 简单说,ElasticSearch(简称 ES)是搜索引擎,是结构化数据的分布式搜索引擎。 在《Elasticsearch 和插件 elasticsearch-head 安装详解》  和 《Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用》 我详细的介绍了如何安装,初步使用了 IK 分词器。 这里,我主要讲下 SpringBoot 工程中如何使用 ElasticSearch。 ES 的使用场景大致分为两块 1. 全文检索。加上分词(IK 是其中一个)、拼音插件等可以成为强大的全文搜索引擎。 2. 日志统计分析。可以...
泥沙砖瓦浆木匠 发布于 6天前 阅读 3725 评论 13 点赞 5

【福利】蓝色巨人的云计算PaaS平台IBM Bluemix免费试用!

IBM Bluemix,包含认知、物联网、大数据分析、安全、DevOps、应用、应用整合、移动、计算、网络、存储等 11 大类共 140 多个服务的云计算平台。
IBM Bluemix

Spring思维导图,让Spring不再难懂(ioc篇)

>写在前面 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象。 就好像我们无需考虑对象的销毁回收一样,因为java垃圾回收机制帮助我们实现了这个过程;而ioc则是让我们无需考虑对象的创建过程,由ioc容器帮我们实现对象的创建、注入等过程。 ![Spring知识细节.png](http://upload-images.jianshu.io/upload_images/4120002-55b18f0249f25054.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >控制反转 ![Spring ioc简介.png](http://upload-images.jianshu.io/upload_images/4120002-7e89f6da34fe7bc9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >spring ioc容器 在Spring框架中的核心组件只有三个:Core、Context和Bean。它们构建起了整个Spring的骨骼架构,没有它们就不可能有AOP、Web等特性功能。 ![Spring 整体结构图.jpg](http://upload-images.jianshu.io/upload_images/4120002-1ad5bb59e5e9f209.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 如果说在三个核心中再选出一个核心,那就非Bean莫属了。可以说,Spring就是面向B...
java思维导图 发布于 1周前 阅读 9002 评论 25 点赞 21

解Bug之路-Druid的Bug

#解Bug之路-Druid的Bug 笔者很热衷于解决Bug,同时比较擅长(网络/协议)部分,所以经常被唤去解决一些网络IO方面的Bug。现在就挑一个案例出来,写出分析思路,以飨读者,希望读者在以后的工作中能够少踩点坑。 #前言 此Bug是Druid低版本的Bug,此Bug至少在1.0.12版本就已经修复。 #Druid的Bug现场 在紧张的新项目开发的日子里,突然收到线上某系统的大量报警,对应系统的人员发现此系统在某一台机器上dump了大量的error日志。日志基本都是: ``` Druid: GetConnectionTimeoutException ``` 此系统所有用到数据库的地方都抛出此异常。于是祭出重启大法,重启过后,一切Okay。然后对应的系统人员开始排查这个问题,一直没有结果。 过了两天,又收到此类型的error日志报警,而且这一次是有两台系统同时爆出此种错误。紧急重启后,将此问题紧急报到我们这边处理。鉴于本人有丰富的IO处理经验,当然落到了本人头上。 #Bug复盘 此系统是通过Druid连接后面的数据库分库分表Proxy,再由此Proxy连接后面的数据库。示意图如下所示: ![输入图片说明](https://static.oschina.net/uploads/img/201705/15104710_ieM5.png "在这里输入图片标题") ##缩小Bug范围 获取连接超时(GetConnectionTimeo...
无毁的湖光-Al 发布于 1周前 阅读 2666 评论 45 点赞 28 打赏 1

详解 awk 工具的使用方法

当你第一次拿起双手在电脑上使用 awk 命令处理一个或者多个文件的时候,它会依次读取文件的每一行内容, 然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容, awk 使用一对单引号来表示 一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。 awk 的每个花括号内同时又可以有多个指令,每一个指令用分号分隔,awk 其实就是一个脚本编程语言。说了这么多,你肯定还是一脸的懵逼。你猜对了,上面这些都是废话。先别急,客官请往下看。。。 **awk 命令的基本格式** ``` awk [options] 'program' file ``` `options` 这个表示一些可选的参数选项,反正就是你爱用不用,不用可以拉到。。。 `program` 这个表示 awk 的可执行脚本代码,这个是必须要有的。 `file` 这个表示 awk 需要处理的文件,注意是纯文本文件,不是你的 mp3,也不是 mp4 啥的。。 **先来一个 awk 的使用例子热热身** ``` $ awk '{print $0}' /etc/passwd ``` awk 命令的可执行脚本代码使用单引号括起来,紧接着里面是一对花括号,记住是 "花括号" 不是 "花姑娘",然后花括号里面就是一些可执行的脚本代码段,当 awk 每读取一行之后,它会依...
Jarly 发布于 2周前 阅读 3095 评论 16 点赞 16

t-io 入门篇(三)即时消息发送demo学习

T-io Im聊天demo分析
卡尔码农 发布于 2周前 阅读 2273 评论 14 点赞 5

惊呆了,Servlet3.0的这个特性竟然99%的人都还不知道!

目前tomcat8和java8基本上得道了普及,基于Servlet3.0(tomcat7就支持)来设计我们的java mvc框架显然会使我们的框架更加轻量! 今天我要说的是:`ServletContainerInitializer`Servlet容器初始化器。 很多小伙伴对她并不陌生,例如Spring中的无web.xml配置也采用她来加载自定义WebApplicationInitializer。 ```java @HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer { // 省略部分代码和注释 } ``` 然而好像大家都是在使用她查找自定义实现类,我脑洞大开可以使用她来查找注解类吗? 查看文档无果,没有说明是否支持注解!直接上代码测试吧~ ### 实现类 ```java package net.dreamlu.learn.core; import java.util.Set; import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.HandlesTypes; import net.dreamlu.learn.ioc.annotation.Component; import net.dreamlu.learn.ioc.annotation.Service; import net.dreamlu.learn.mvc.annotation.Controller; /** * 采用...
如梦技术 发布于 2周前 阅读 5147 评论 29 点赞 3

电子凭证-Java生成Pdf

Java生成Pdf技术方案,通过Html模板引擎进行数据渲染,通过iText生成Pdf,通过Jpedal生成图片。解决CSS样式兼容问题,中文字体问题等。
蛙牛 发布于 3周前 阅读 6072 评论 50 点赞 28

解Bug之路-串包Bug

#解Bug之路-串包Bug 笔者很热衷于解决Bug,同时比较擅长(网络/协议)部分,所以经常被唤去解决一些网络IO方面的Bug。现在就挑一个案例出来,写出分析思路,以飨读者,希望读者在以后的工作中能够少踩点坑。 #串包Bug现场 ##前置故障Redis超时 由于某个系统大量的hget、hset操作将Redis拖垮,通过监控发现Redis的CPU和IO有大量的尖刺,CPU示意图下图所示: ![输入图片说明](https://static.oschina.net/uploads/img/201704/27101220_ckSF.png "在这里输入图片标题") CPU达到了100%,导致很多Redis请求处理不及时,其它业务系统都频繁爆出readTimeOut。此时,紧急将这个做大量hget、hset的系统kill,过了一段时间,Redis的CPU恢复平稳。 ##一波未平,一波又起 就在我们以为事件平息的时候,线上爆出登录后的用户名称不正确。同时错误日志里面也有大量的Redis返回不正确的报错。尤为奇葩的是,系统获取一个已经存在的key,例如get User123456Name,返回的竟然是redis的成功返回OK。示意图如下: ``` Jedis.sendCommand:get User123456Name Jedis.return:OK or Jedis.sendCommand:get User123456Name Jedis.return:user789 ``` 我们发现此情况时,联系op将Redis集群的所有Key紧急delete,...
无毁的湖光-Al 发布于 1个月前 阅读 2159 评论 32 点赞 15

用python找出那些被“标记”的照片

想必大家对照片这个东西再熟悉不过,但我不知道在座的各位是否知道相片的EXIF信息。简单得说它就是每一张图片的"指纹信息",然后这边写了个小工具,或许社工的时候可以用到。
AI3 发布于 1个月前 阅读 2207 评论 14 点赞 3

解Bug之路-TCP粘包Bug

#解Bug之路-TCP粘包Bug #前言 ##关于TCP流 TCP是流的概念,解释如下 ``` TCP窗口的大小取决于当前的网络状况、对端的缓冲大小等等因素, TCP将这些都从底层屏蔽。开发者无法从应用层获取这些信息。 这就意味着,当你在接收TCP数据流的时候无法知道当前接收了 有多少数据流,数据可能在任意一个比特位(seq)上。 ``` 详情见笔者另一篇博客https://my.oschina.net/alchemystar/blog/833937 ##关于"粘包" 由于TCP流的特性,经常发生一个收到多于(长连接)或者小于当前包字节数的情况,看起来像一个包后面"粘着"后面包的一点内容,所以被应用层的人形象的称为"粘包",这个概念不是笔者发明的,老早就这么叫了。 ##关于流和"粘包" TCP流本身就是操作系统在屏蔽了mac帧、ip包这些底层概念与细节后抽象出来的概念。如果较真,TCP流在网络层也是由ip包一个一个传输组装而来。 TCP本身把底层的各种细节屏蔽抽象成"流"。 应用层的人把TCP导致的收多了(长连接)收不满的现象抽象成"粘包"。 笔者觉得无可厚非,无高下之分。 ##关于喷子 喷子有个特点,就是不看文章内容,只要和他所想不和,就开始喷。 笔者搞过协议栈,完整分析过三个协议栈(从ARP到TCP,分别是lwip、BsdTcp,xinu)的源码,...
无毁的湖光-Al 发布于 1个月前 阅读 3363 评论 107 点赞 16

mybatis思维导图,让mybatis不再难懂(一)

>写在前面 与hibernate相比,我无疑更喜欢mybatis,就因为我觉得它真的好用,哈哈。它简单上手和掌握;sql语句和代码分开,方便统一管理和优化;当然缺点也有:sql工作量很大,尤其是字段多、关联表多时,更是如此。而且sql依赖于数据库,导致数据库移植性差。 选用一个框架之前最好先了解它的优缺点,对项目最好用,效率最高的才是一个你最好的选择。 >mybatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 >直接上思维导图 ![1、mybatis简介.png](http://upload-images.jianshu.io/upload_images/4120002-8593f17572d1a1b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![2、与hibernate对比.png](http://upload-images.jianshu.io/upload_images/4120002-fe73ae40aeece93e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![3、几个关键类.png ](http://upload-images.jianshu.io/upload_images/412000...
java思维导图 发布于 1个月前 阅读 9622 评论 27 点赞 28

Spring Boot 整合 Redis 实现缓存操作

摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 产品没有价值,开发团队再优秀也无济于事 – 《启示录》 』 本文提纲 一、缓存的应用场景 二、更新缓存的策略 三、运行 springboot-mybatis-redis 工程案例 四、springboot-mybatis-redis 工程代码配置详解   运行环境: Mac OS 10.12.x JDK 8 + Redis 3.2.8 Spring Boot 1.5.1.RELEASE   强烈推荐读者 -  「springboot-learning-example」开源项目,Star 一下 spring boot 实践学习案例,是 spring boot 初学者及核心技术巩固的最佳实践。 https://git.oschina.net/jeff1993/springboot-learning-example     一、缓存的应用场景 什么是缓存? 在互联网场景下,尤其 2C 端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用 Redis 作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。 Redis 是一个高性能的 key-value 数据库。GitHub 地址:https://github.com/antirez/redis 。Github 是这么描述的: Redis is an in-memory database that persists on disk. The data model is key-va...
泥沙砖瓦浆木匠 发布于 1个月前 阅读 3568 评论 17 点赞 1

Java 的泛型擦除和运行时泛型信息获取

# 前言 现在很多程序员都会在简历中写上精通 Java。但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌握 Java 语法和 JDK 的使用,还需要对 Java 这门语言的各方面原理有深入的了解。除了像并发、JVM 等方面,以及软引用、弱引用等高级知识以外,其实很多我们每天接触到的 Java 特性里面也是另有乾坤。Java 5 引入的泛型便是其中之一。本文这里不谈泛型的使用以及泛型方法、泛型类的定义,这些东西很多书和文章都讲了。本文将介绍一下 Java 泛型的擦除和运行时泛型获取这两个看似矛盾的特性。 # Java 的泛型擦除 程序员界有句流行的话,叫 talk is cheap, show me the code,所以话不多说,看代码。 ## 代码一 ```java Class c1 = new ArrayList().getClass(); Class c2 = new ArrayList().getClass(); System.out.println(c1 == c2); /* Output true */ ``` `ArrayList` 和 `ArrayList` 在编译的时候是完全不同的类型。你无法在写代码时,把一个 String 类型的实例加到 `ArrayList` 中。但是在程序运行时,的的确确会输出true。 这就是 Java 泛型的类型擦除造成的,因为不管是 `ArrayList` 还是 `ArrayList`,在编译时都会被编译器擦除成了 `ArrayList`。Java 之所以要避...
编走编想 发布于 1个月前 阅读 1919 评论 12 点赞 7

微服务常用技能之优雅的重试

一般从事软件开发工作的同时通常需要调用远程服务,但是即使是亚马逊、阿里巴巴、腾讯这些巨头提供的服务也可能因为网络或者服务高可用方面的一些问题,或许会遇到超时等异常情况,这时候我们就必需要考虑到异常情况下我们的应用如何能处变不惊处理这些异常,是直接抛出异常还是说可以自动进行一些处理呢? 通常情况下我们首先想到的解决方案一定是重试对吧。 我看过很多代码,他们都怎么写的呢,如下 public String invoke(int times) {    for(int i = 0; i < times; i ++) {        try{            // do some thing            // return        }catch(Exception e) {            return invoke(i);        }    } } 上面的代码意思是首先传入一个次数参数,假设我们传递的是3,那么当遇到异常的时候,重新调用当前方法,次数变为2… 你有没有发现如果调用外部服务很多的时候,这样的for循环写的让人不舒服,因为都是重复的代码,而且显的很啰嗦呢,spring boot给我们带来了一些福音,我们看看spring boot框架下如何进行重试 1、 首先引入JAR包 <dependency>    <groupId>org.springframework.retry</groupId>    <...
稻草鸟人 发布于 2个月前 阅读 2711 评论 20 点赞 4

MySql-Proxy之多路结果集归并

#MySql-Proxy之多路结果集归并 笔者觉得Cobar之类的分库分表最神奇的部分就是靠一条sql查询不同schema下(甚至不同实例下)的不同的表。例如 ``` select * from t_test; // 映射为 |------select * from schema1.t_test |------select * from schema2.t_test ResultSet // 返回结果集为两者的归并 |--schema1.t_test.ResultSet |--schema2.t_test.ResultSet ``` 以笔者这种刨根到底的性格当然要把这个过程DIY出来。 由于Cobar对MySql的连接是BIO的。而笔者喜欢NIO,于是用NIO将Corbar的多节点查询全部重写(基于Netty)。NIO的难度更大,性能也更好,这个重写的过程就记录成博客,以飨读者。 #多路归并原理 #多节点发送select语句 ![lancelot_select](https://static.oschina.net/uploads/img/201704/07102727_1Km3.png "lancelot_select") 当客户端发送给select * from test后,Lancelot会根据配置将语句将当前语句路由到多个不同的DB实例上,如上图所示。 FrontEnd:用来和client交互,一个FrontEnd可以对应多个Backend BackEnd:用来和DB交互 #多节点归并结果集 ![result_set](https://static.oschina.net/uploads/img/201704/07102815_m4GK.png "result_set") 每条语句在一个D...
无毁的湖光-Al 发布于 2个月前 阅读 2088 评论 27 点赞 10

高性能可定制化分布式发号器

分布式发号器
liubingsmile 发布于 2个月前 阅读 3286 评论 19 点赞 1

如何理解Nginx、uWSGI和Flask之间的关系?

之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑。通过查阅了些资料,总算把它们的关系理清了。
_Change_ 发布于 2个月前 阅读 1963 评论 5 点赞 3

nginx+tomcat 配置负载均衡集群

一、Hello world 1、前期环境准备 准备两个解压版tomcat,如何同时启动两个tomcat,请看我的另一篇文章《一台机器同时启动多个tomcat》。 nginx官网下载解压版nginx。 创建一个简单的web项目。为了直观的区分访问的哪个tomcat,在页面写上标记8081、8082。 分别部署到对应的tomcat下。如图:​​​​ ​ 2、配置nginx 进入nginx-1.10.1\conf路径,修改配置文件nginx.conf。 1、配置服务器组,在http{}节点之间添加upstream配置。(注意不要写localhost,不然访问速度会很慢) upstream nginxDemo { server 127.0.0.1:8081; #服务器地址1 server 127.0.0.1:8082; #服务器地址2 } 2、修改nginx监听的端口号80,改为8080。 server { listen 8080; ...... } 3、在location\{}中,利用proxy_pass配置反向代理地址;此处“http://”不能少,后面的地址要和第一步upstream定义的名称保持一致。 location / { root html; index index.html index.htm; proxy_pass http://nginxDemo; #配置方向代理地址 } 如下图: 3、启动nginx和tomcat,访问 我是Windows系统,所以直接在nginx-1.10.1目录下双击ngi...
努力白十一 发布于 2个月前 阅读 7106 评论 41 点赞 30

Spring Boot JMS与IBM WebSphere MQ集成配置

# Spring Boot JMS与IBM WebSphere MQ集成配置 [TOC] ## 前言 Spring Boot作为简化Spring开发的框架,已经为我们集成了ActiveMQ和RabbitMQ。只需在Spring Boot配置几个MQ的连接方式即可开箱即用。大大简化了开发配置过程。 Spring的JavaConfig相比传统的XML的配置方式使得配置更加的可靠和方便。 本文将会说明如何用JavaConfig的方式将Spring与IBM WebSphere MQ(以下简称IBM MQ)集成配置,也可以作为其他MQ的配置参考。 ## 开发工具 - IntelliJ Idea - JDK 1.8.0_121 - Maven ## 解决依赖 ### 获取IBM MQ依赖包 IBM MQ相关的连接依赖包为`com.ibm.mq.allclient.jar`,该包不存在于公共Maven仓库,所以我们需要找到该依赖包并手动安装到我们本机的Maven仓库中。 该依赖包位于`[IBM MQ 安装路径]\java\lib`下,Windows下的默认安装路径为`C:\Program Files\IBM\WebSphere MQ\`,Linux下的默认安装路径为`/opt/mqm/`。可以将该包复制到开发机上。 通过以下命令安装该包到本地仓库 ``` mvn install:install-file -Dfile=[jar包所在路径] -DgroupId=com.ibm -DartifactId=mq.allclient -Dversion=1.0 -Dpackaging=jar ``` > 在Idea中可以按四次Shift键调出全局搜索框,键入Exe...
lzp4ever 发布于 2个月前 阅读 974 评论 2
顶部