自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 mongo分片部署实战

应用场景主要应对大数据量及其高吞吐场景,此模式下mongodb提供自动分片功能。优点在上述场景下会一定程度改善mogodb的性能问题缺点数据量不大的情况下,性能较集群模式差。demo三个数据节点三个配置节点一个路由节点// mongo下载地址https://www.mongodb.com/try/download/community// 添加环境变量export PATH=/opt/mongodb/bin:$PATH// 配置数据节点// 可能遇到的问题// -bas

2021-05-09 21:14:56 268

原创 MongoDB入门

定义MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。mongo属于文档存储类型,文档存储一般用类似 json 的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。在NoSQL界,MongoDB是一个最像关系型数据库的非关系型数据库。适用场景用在应用服务器的日志记录,查找起来比文本灵活,导出也很方便。用来存储一些监控数据O2O快递应用对象或者json数据存储不适用场景高度事务性的功能需要复杂sql查询的功能传统

2021-05-05 14:15:05 239 2

原创 内存泄漏的场景

各种提供了close方法的对象数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏。这种情况下一般都会在try里面创的连接,在finally里面释放连接。单例模式单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量.

2021-04-10 20:37:23 213

原创 深入浅出hashmap原理

属性相关的问题默认容量为什么是16?HashMap作为一种数据结构,元素在put的过程中需要进行hash运算,目的是计算出该元素存放在hashMap中的具体位置。hash运算的过程其实就是对目标元素的Key进行hashcode,再对Map的容量进行取模,而JDK 的工程师为了提升取模的效率,使用位运算代替了取模运算,这就要求Map的容量一定得是2的幂。作为默认容量,太大和太小都不合适,所以16就作为一个比较合适的经验值被采用了。为什么默认负载因子为0.75?负载因子表示一个数组可以达

2021-01-17 22:37:59 231

原创 Arthas之热部署

背景项目源代码public class HotDeployDemo { public static void main(String[] arrstring) throws InterruptedException { for (int i = 0; i >= 0; ++i) { new Thread(new Runnable(){ @Override public void ru

2021-01-06 00:12:08 2371 1

原创 浅析jvm基础工具

jps命令jvm process status tool, 虚拟机进程状况工具可以列出正在运行的虚拟机进程, 并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一id用法jps -l 显示主类名称. windows下有些进程的主类为什么不显示?jps -m 显示main函数参数jps -v 显示虚拟机进程启动时的jvm参数, 每启动一个项目都会有一个虚拟机进程jstat命令jvm statistics monitoring tool, 虚拟机统计信息监视工具显示进程的类加

2021-01-02 16:09:36 134

原创 伪异步I/O示例

特点通过线程池可以灵活地调配线程资源,设置线程的最大值,防止由于海量并发接入导致线程耗尽。读取输入流是阻塞的, 阻塞的时间取决于对方IO线程的处理速度和网络IO的传输速度。服务器端package com.example.nettydemo.bio_2;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * @author juzhenxing * @date 2020

2020-11-21 13:33:11 141

原创 Mycat分片入门

目的通过实现数据库的分表, 读写分离来解决数据库性能瓶颈数据库中间件的实现流程解析sql数据源管理数据源分配请求/响应结果整合Mycat中的概念逻辑库(schema)在云计算时代,数据库中间件可以以多租户的形式给一个或多个应用提供服务,每个应用访问的可能是一个独立或者是共享的物理库,常见的如阿里云数据库服务器 RDS。逻辑表(table)分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表

2020-11-15 21:33:09 129

原创 jvm锁优化

自旋锁与自适应自旋互斥同步对性能最大的影响是阻塞的实现现在绝大多数的个人电脑和服务器都是多路(核)处理器系统,如果物理机器有一个以上的处理器或者处理器核心,能让两个或以上的线程同时并行执行,我们就可以让后面请求锁的那个线程“稍等一会”,但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只须让线程执行一个忙循环(自旋),这项技术就是所谓的自旋锁。自旋次数的默认值是十次,用户也可以使用参数-XX:PreBlockSpin来自行更改。自适应意味着自旋的时间不再是固定的了,

2020-10-25 14:33:49 238

原创 浅析redis五种对象的底层数据结构

对象的类型与编码Redis中的每个对象都由一个redisobject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性和ptr属性类型// 查询msg键对应值对应值对象的类型type msg编码和底层实现// 查看一个数据库键的值对象的编码object encoding msg通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为Redis可以根据不同的使用场景来为一

2020-10-24 14:40:57 197

原创 线程安全

定义当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。java语言中的线程安全不可变只要一个不可变的对象被正确地构建出来(即没有发生this引用逃逸的情况),那其外部的可见状态永远都不会改变,永远都不会看到它在多个线程之中处于不一致的状态。Java语言中,如果多线程共享的数据是一个基本数据类型,那么只要在定义时使用final关键字修饰

2020-10-03 21:51:13 205

原创 同步阻塞式I/O(BIO)示例

特点缺乏弹性伸缩的能力,无法满足高性能、高并发接入的场景客户端个数与服务端线程数:1:1阻塞io,同步ioapi使用简单调试简单可靠性差吞吐量低服务器端package com.example.demo.bio;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * 同步阻塞io */public class TimeServer { public

2020-08-22 23:11:05 216

原创 feign客户端get请求如何传递日期类型的参数?

问题的本质关键在于日期的格式问题, 为feign客户端增加对应的日期处理器即可, 保证与服务提供方日期类型参数格式一致, 就不会报参数异常了代码实现import org.springframework.cloud.openfeign.FeignFormatterRegistrar;import org.springframework.core.convert.converter.Converter;import org.springframework.format.FormatterRegistr

2020-08-02 22:36:39 1648

原创 feign客户端get请求如何优雅地传递多个参数?

环境spring-cloud-dependencies(Finchley.RELEASE)spring-cloud-starter-openfeign解决方法方法一, 将一个复杂的参数转换成多个参数(不推荐)import feign.QueryMap;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import

2020-08-02 22:04:44 2949 3

原创 自定义mybatis分页插件(mysql数据库)

代码实现分页插件实现// 定义分页请求参数对象package com.example.plugin.page.request;import lombok.Data;@Datapublic class PageParams { /** * 当前页码 */ private Integer page; /** * 每页限制条数 */ private Integer pageSize; /** * 是

2020-07-19 21:54:04 475

原创 eureka启动https

背景公网访问不安全证书生成// server端证书keytool -genkeypair -alias server -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore server.p12 -validity 3650// client端证书keytool -genkeypair -alias client -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore client.p12 -

2020-07-15 00:51:23 301 1

原创 梳理SpringBean的生命周期

demopublic class Source { /** * 类型 */ private String fruit; /** * 糖分描述 */ private String sugar; /** * 大小杯 */ private String size; public String getFruit() { return fruit; } pu

2020-07-05 15:32:58 171

原创 构建Multi Zone Eureka Server

Zone与Region设计Region代表一个独立的地理区域, 每个Region之间是相互独立及隔离的, 默认情况下资源只在单个Region之间的AvailabilityZone进行复制.AvailabilityZone 可看作Region下面的一个个机房,各个机房相对独立,主要是为了Region 的高可用设计,当同一个Region下面的AvailabilityZone不可用时,还有其他AvailabilityZone可用。Eureka Server原生支持了Region及Availability

2020-07-02 00:30:06 225

原创 手写rpc框架

服务端public interface HelloService { String sayHello(String msg);}public class HelloServiceImpl implements HelloService { @Override public String sayHello(String msg) { return "hello, " + msg; }}import java.io.IOExceptio

2020-06-27 00:49:16 221

原创 rmi入门

定义RMI, 全称是remote method invocation, 远程方法调用,一种用于远程过程调用的应用程序编程接口,是纯 java 的网络分布式应用系统的核心解决方案之一。RMI目前使用Java远程消息交换协议 JRMP(Java Remote Messageing Protocol)进行通信,由于 JRMP 是专为 Java对象制定的,是分布式应用系统的百分之百纯 java 解决方案,用 Java RMI 开发的应用系统可以部署在任何支持 JRE的平台上缺点是,由于 JRMP 是专门为

2020-06-26 23:21:56 181

原创 dubbo入门

dubbo-server创建父工程dubbo-server以同样的方法创建两个子模块, server-api和server-provider. 其中server-api存放dubbo服务暴露的接口, server-provider为服务的实现模块.server-api模块实现public interface IGpHello { String sayHello(String msg);}server-provider模块实现// 引入依赖 <dep

2020-06-16 00:34:58 181

原创 浅析MySQL索引原理和使用规则

索引到底是什么?数据库索引, 是数据库管理系统中一个排序的数据结构, 以协助快速查询, 更新数据库表中数据.索引的类型Normalunique, 允许为空. 主键, 不允许为空.full text, 解决全模糊查询无法命中索引的问题, 最好用搜索引擎实现// TODO 使用全文索引的语法? 为什么不推荐使用全文索引? SELECT *FROM table1WHERE MATCH(NAME) AGAINST('name6na' IN NATURAL LANGUAGE MODE)为什

2020-05-17 14:45:47 196

原创 浅析Mybatis缓存

一级缓存默认启用,并且不能控制。有时会产生难以发现的错误。通过select标签的flushCache属性来控制。生命周期是SqlSession,在同一个SqlSession中查询时,MyBatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。任何的insert、update和delete操作都会清空一级缓存。二级缓存生命周期是SqlSessionFactory。通过全局配置中的cacheEnabled参数来控制。与命名空间相绑定,即二级缓存需.

2020-05-10 20:54:39 171

原创 浅析HotSpot虚拟机的垃圾收集器

垃圾收集器期望的目标停顿时间, 停顿时间越短就适合需要与用户交互的程序吞吐量, 主要适合在后台计算而不需要太多交互的任务覆盖区, 在达到前面两个目标的情况下,尽量减少堆的内存空间垃圾收集器组合方案垃圾收集器分类新生代垃圾收集器Serial收集器特点采用复制算法, 单线程, “Stop The World”应用场景HotSpot在Client模式下默认的新生代收集器.在用户的桌面应用场景中, 可用内存一般不大(几十M至一两百M), 可以在较短时间内完成垃圾收集(几十MS至

2020-05-10 20:38:29 200

原创 浅析mysql的架构和执行流程

mysql体系结构与模块划分是啥?架构分层第一层是连接层, 用来管理连接和权限验证.第二层是服务层, 包括解析器, 预处理器, 优化器, 执行器和缓存. 解析器用来进行词法解析和语法解析. 预处理器进行语义分析和权限检查, 生成新的解析树. 优化器是基于成本/开销的, 用于执行计划的生成, 驱动表的选择, 索引选择. 执行器用于调用存储引擎的接口获取数据, 然后进行数据计算, 过滤和排序等...

2020-05-07 23:18:53 209

原创 浅析Redis集群

redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发redis replication基本原理核心机制redis采用异步方式复制数据到slave节点,不过redis 2.8开始,slave node会周期性地确认自己每次复制的数据量一个master node可以配置多个slave nodeslave node也可以连接...

2020-05-03 00:06:09 330

原创 引入redis缓存的常见问题

缓存雪崩什么是缓存雪崩?缓存中数据大批量到过期时间,或者缓存中间件宕机,而查询数据量巨大,引起数据库压力过大甚至down机。如何解决缓存雪崩?事前: 保证redis集群高可用,采用主从+哨兵,或者redis cluster,避免全盘崩溃。事中:本地ehcache缓存+限流组件,保证数据库绝对不会死,同时系统不是完全不可用。事后:redis持久化机制,尽快恢复缓存集群,一旦重启,自动从...

2020-05-02 23:53:22 256

原创 浅析Redis

为什么要用缓存缓存是为了高性能和高并发。高性能指对于复杂耗时的查询,如果查询结果一直不变,并且访问频率特别高,那么可以把查询结果放到缓存里,第二次查询直接走缓存,性能提升很大。高并发指因为数据库能承载的并发量是有限的,单机大概2000qps左右,如果想实现高并发,那么只能把剩余的请求交给缓存处理,缓存性能是数据库的几十倍,防止数据库被打满,整个系统挂掉。redis和memcached的区别...

2020-04-04 23:24:28 149

原创 浅析常见消息队列

消息队列常见的使用场景解耦,比如A系统需要推送相同的数据给B系统和C系统,如果不使用mq,那么大致相同的逻辑我们要维护两份。假如未来某一天,又要对接n个系统或者取消对某个系统的推送,那么维护这个模块的人得疯,可扩展性比较差。同时,还要考虑其他系统的接口是否会访问超时或者直接访问不通,还得引入重试机制等。如果使用了mq,那么A系统只需将数据发送到队列中,其他系统根据自己的实际业务主动去订阅或者取...

2020-03-29 00:40:39 232

原创 分布式事务解决方案

分布式一致性协议XA接口XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。事务管理器控制着全局事务,管理事务生命周期,并协调资源。资源管理器负责控制和管理实际资源(如数据库或JMS队列)JTA规范作为java平台上事务规范JTA(Java Transaction API)也定义了对XA事务的支...

2020-01-19 21:40:12 222

原创 二叉树的合并(java实现)

import java.util.LinkedList;import java.util.List;import java.util.Scanner;public class BiTree { private BiTree left; private BiTree right; private int data; public static BiTr...

2019-12-26 23:27:28 911

原创 服务治理之Eureka集群搭建

EurekaServer_1// 引入依赖, 注意spring-boot, spring-cloud和eureka-server版本<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20...

2019-12-01 13:55:54 96

原创 单向散列加密、对称加密与非对称加密

单向散列加密是什么?散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。适用场景单向散列函数一般用于产生消息摘...

2019-11-16 22:44:21 816

原创 OAuth2.0协议认证过程

总结第一步:用户同意授权,获取code第二步:通过code换取网页授权access_token第三步:刷新access_token(如果需要)第四步:拉取用户信息(需scope为 snsapi_userinfo)微信公众号授权实战关注微信测试公众号进入微信公众帐号测试号申请系统填写自己服务器域名实现代码// 在application.yml中配置相关参数 ...

2019-11-14 23:01:21 484

原创 开放平台如何保证接口安全?

常用解决办法使用加签名方式,防止篡改数据使用Https加密传输搭建OAuth2.0认证授权使用令牌方式搭建网关实现黑名单和白名单令牌方式保证接口安全表设计CREATE TABLE `table_app` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `app_name` varchar(255) NOT N...

2019-11-04 00:10:29 864

原创 浅析mysql的锁

存储引擎分类MyISAM只支持表锁, 支持全文索引, 不支持外键和事务. 适用于读多写少的场景, 比如 select count(1).InnoDB支持表锁和行锁, 支持外键和事务, 并支持类似于 Oracle 的非锁定读, 不支持全文索引, 但是可以借助sphinx插件实现. 适用于并发比较高的场景.在此呼吁, 为了我们的身心健康, 请使用InnoDB.InnoDB存储引擎表锁...

2019-10-27 15:09:50 313

原创 浅析Spring事务的传播性

方法A和方法B的事务传播性都为PROPAGATION_REQUIRED当方法A调用方法B, 方法B报错, 即使报错被外层捕获, 整体事务也会回滚.报错信息为UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only代码演示@Overridepubl...

2019-10-26 22:35:14 553

原创 如何保证接口幂等?(注解版本)

背景在开发过程中, 经常会遇到一些重复数据的问题, 这就是幂等性问题.常见的解决方案前端可以通过按钮置灰, 来防止用户重复点击;乐观锁, 前提是接口中要有更新的逻辑, 需要有事务, 更新失败需要报错;唯一索引或去重表;悲观锁, 包括本地锁和分布式锁, 适用于写多读少的场景;使用token来解决, 比如防止表单重复提交.使用token来解决(注解版本)// 生成token的自定...

2019-10-21 23:41:39 556

原创 Web常用攻击手段之盗图

防御之前防御之后如何防御?通过http请求头中的Referer参数进行判断代码实现// 获取域名的工具类import java.util.regex.Matcher;import java.util.regex.Pattern;public class DomainUtils { public static String getDomain(String ur...

2019-10-05 15:31:53 437

原创 Web常用攻击手段之XSS脚本

防御之前防御之后如何防御?使用过滤器对特殊字符进行转义代码实现//重写getParameter方法, 对特殊字符进行转义public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { private HttpServletRequest httpServletRequest;...

2019-09-26 23:28:23 176

空空如也

空空如也

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

TA关注的人

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