JAVA
文章平均质量分 59
java
zhexiao27
Keep going.
展开
-
JNA、JNI、原生C++函数调用效率及测试过程
6.将生成的DLL及依赖的算法DLL复制到jdk/bin目录下。1.Visual Studio配置头文件及lib库文件的路径。7.java调用JNI函数执行DLL方法。2.生成.h头文件,用于包装C++方法。3.通过Clion封装C++函数。拷贝.h文件,并创建cpp文件。1.构建DLL Library。配置cmakelist文件。5.构建项目,会生成DLL。3.调用函数计算时长。原创 2024-04-09 10:45:06 · 438 阅读 · 0 评论 -
重新认识 Java 中的内存映射(mmap)
恰恰和网传的很多言论相反,mmap 由于其不切态的特性,特别适合顺序读写,但由于 sun.nio.ch.FileChannelImpl#map(MapMode mode, long position, long size) 中 size 的限制,只能传递一个 int 值,所以,单次 map 单个文件的长度不能超过 2G,如果将 2G 作为文件大 or 小的阈值,那么小于 2G 的文件使用 mmap 来读写一般来说是有优势的。一个实用的技巧是动态分配的内存映射区域,在读取过后,可以异步回收掉。原创 2023-03-02 17:14:47 · 1762 阅读 · 0 评论 -
SpringCloud Gateway + Security + JWT 最快速的集成
*** 需要访问的url/*** 额外放开权限的url** @param urls 自定义的url* @return 自定义的url和监控中心需要访问的url集合} //放开权限的地址 Collections . addAll(set , addContextPath(permitUrl));} /*** 地址加访问前缀* @returni ++) {} }原创 2022-12-30 16:56:51 · 2068 阅读 · 3 评论 -
springboot rabbitmq 配置文件详解
rabbit mq 配置原创 2022-07-06 20:19:02 · 1123 阅读 · 0 评论 -
Redis 过期删除策略和内存淘汰策略
Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。过期删除策略有哪些?在说 Redis 过期删除策略之前,先跟大家介绍下,常见的三种过期删除策略:定时删除;惰性删除;定期删除;接下来,分别分析它们的优缺点。定时删除策略的做法是,在设置 key 的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行 key 的删除操作。定时删除策略的优点:可以保证过期 key 会被尽快删除,也就是内存可以被尽快地释放。因此,定原创 2022-07-05 14:03:08 · 402 阅读 · 0 评论 -
java插件化开发
插件化原创 2022-06-28 18:59:14 · 2056 阅读 · 0 评论 -
文件流读取不存在乱码的数据
过滤乱码数据原创 2022-06-28 13:35:20 · 101 阅读 · 0 评论 -
NIO 主从Reactor服务
NIO 主从Reactor服务模型如下:方案说明:Reactor主线程 MainReactor 对象通过select 监听连接事件, 收到事件后,通过Acceptor 处理连接事件当 Acceptor 处理连接事件后,MainReactor 将连接分配给SubReactorsubreactor 将连接加入到连接队列进行监听,并创建handler进行各种事件处理当有新事件发生时, subreactor 就会调用对应的handler处理handler 通过read 读取数据,原创 2022-03-30 18:44:29 · 321 阅读 · 0 评论 -
单 Reactor 多线程
单 Reactor 多线程方案:1)Reactor 对象通过 select 监控客户端请求事件,收到事件后,通过 dispatch 进行分发2)如果是建立连接请求,则由 Acceptor 通过 accept 处理连接请求,然后创建一个 Handler 对象处理完成连接后的各种事件3)如果不是连接请求,则由 Reactor 对象会分发调用连接对应的 Handler 来处理4)Handler 只负责响应事件,不做具体的业务处理,通过 read 读取数据后,会分发给后面的 Worker 线程池的某个线程原创 2022-03-30 14:27:21 · 531 阅读 · 0 评论 -
单 Reactor 单线程
Reactor模式原理Reactor模型是相对传统IO机构来说的,也就是NIO模型, NIO模型之所以可以优化,得益于它是基于事件,基于异步,不像传统IO,是阻塞的Reactor模型分为几个组件,分别是Reactor、Acceptor、HandlerReactor组件负责分发事件,如果是连接那么交给Acceptor;如果是读写事件那么交给HandlerAcceptor负责处理连接事件(获取新连接,注册到Selector上,注册读写事件,绑定Handler)Handler负责处理读写事件(使用ch原创 2022-03-24 15:23:22 · 1214 阅读 · 2 评论 -
NIO 高性能服务 Discard Server + Client
DiscardServerNIOpackage com.company;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import原创 2022-03-19 16:38:48 · 172 阅读 · 0 评论 -
springcloud loadBalancer 源码深入
LoadBalancerClientServiceInstanceChooser 定义根据服务ID获取服务实例的接口。LoadBalancerClient 继承 ServiceInstanceChooser 并新增了一些负载均衡客户端需要的方法。BlockingLoadBalancerClient 默认的负载均衡客户端实现方法;这个实现方法依赖 LoadBalancerClientFactory 工厂类,这个工厂类的 getInstance 方法返回一个异步的 ReactiveLoadBalanc原创 2021-07-02 16:24:13 · 644 阅读 · 0 评论 -
springcloud nacos 源码深入
对nacos从服务注册的源码进行剖析。服务注册AutoServiceRegistrationConfiguration:一个空实现,用来标注服务的自动注册。@Configuration(proxyBeanMethods = false)@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)@ConditionalOnProperty(value = "spring.cloud.service-registry原创 2021-07-01 15:30:40 · 359 阅读 · 0 评论 -
Seata分布式事务
SeataSeata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。两阶段提交协议的演变:一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。二阶段:提交异步化,非常快速地完成,回滚通过一阶段的回滚日志进行反向补偿。环境搭建下载地址https://github.com/seata/seata/releases/download/v1.4原创 2021-05-06 17:14:18 · 650 阅读 · 2 评论 -
@Configuration proxyBeanMethods 属性详解
@Configuration注释中的proxyBeanMethods参数是springboot1.0,升级到springboot2.0之后新增的比较重要的内容,该参数是用来代理bean的。1.理论首先引出两个概念:Full 全模式,Lite 轻量级模式。Full(proxyBeanMethods = true) :proxyBeanMethods参数设置为true时即为:Full 全模式。 该模式下注入容器中的同一个组件无论被取出多少次都是同一个bean实例,即单实例对象,在该模式下SpringBo原创 2021-04-26 11:43:02 · 1764 阅读 · 0 评论 -
SpringCloud Gateway + Spring Security
父模块pom.xml<?xml version="1.0" encoding="UTF-8"?><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原创 2021-04-15 14:24:47 · 7763 阅读 · 15 评论 -
kafka介绍与深入
Kafka概述什么是Kafka?Apache Kafka是一个分布式发布订阅消息系统/队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。Kafka适合离线、在线的消息消费。 Kafka的消息保留在磁盘上,并在集群内复制以防止数据丢失。 Kafka构建在ZooKeeper同步服务之上。 它可以与Apache Storm、Apache Spark非常好地集成,并用于实时流式数据处理。支持的客户端语言:C/C++PythonGo (AKA golang).NETNode.js原创 2021-04-02 17:17:29 · 163 阅读 · 0 评论 -
SpringCloud Oauth2认证 数据库+JWT版本
强烈建议先看基础版本再看数据库版本,不然很多东西无法理解。强烈建议先看基础版本再看数据库版本,不然很多东西无法理解。强烈建议先看基础版本再看数据库版本,不然很多东西无法理解。基本版本地址:https://zhexiao.blog.csdn.net/article/details/115261019Spring Cloud Oauth2 集成Spring Cloud版本<dependency> <groupId>org.springframework.boot<原创 2021-03-27 14:46:55 · 801 阅读 · 0 评论 -
SpringCloud Oauth2认证 基础版本
理解什么是OAUTH2OAuth2是什么OAuth 就是一种授权机制,数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。授权机制和密码机制的区别:(1)令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。(2)令牌可以被数据所有者撤销,会立即失效。密码一般不允许被他人撤销。(3)令牌有权限范围(scope)。对于网络服务来说,只读令牌就比读写令牌更安全。密码一般是原创 2021-03-27 10:28:21 · 727 阅读 · 0 评论 -
从pom读取参数变量到yml配置使用
比如我们在pom中配置了一些属性,希望可以直接读取到yml里面作为配置使用。<artifactId>config-center</artifactId><packaging>jar</packaging><properties> <application.name>${artifactId}</application.name></properties>下面我希望直接使用 @xx@ 来读取p原创 2021-03-24 17:50:07 · 4138 阅读 · 3 评论 -
kafka 发送、接收大消息解决办法 - Spring Cloud Stream + Kafka
kafka默认发送和接收的消息是1M大小,如果要发送或者接收超过1M大小的数据,则需要修改以下配置。Broker: message.max.bytes and replica.fetch.max.bytesProducer: max.request.sizeConsumer: max.partition.fetch.bytes注意: message.max.bytes必须小于等于replica.fetch.max.bytes实例:server.propertiesbroker.id=1m原创 2021-03-22 13:47:40 · 856 阅读 · 0 评论 -
Java NIO + ByteArrayOutputStream 读取文件数据并转为字节数组
package com.zhexiao.kafka.component;import org.apache.kafka.common.utils.Bytes;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import java.io.*;import java.nio.ByteBuffer;import java.nio.chann原创 2021-03-22 10:34:28 · 1870 阅读 · 0 评论 -
SpringCloud Bus+Kafka 实现配置刷新
Spring Cloud 基础版本pom.xml<!--springboot依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.0.RELEASE</version> <ty原创 2021-03-17 19:22:51 · 438 阅读 · 0 评论 -
SpringCloud Nacos 配置中心搭建
部署Nacos本地服务通过官方下载对应的包后,通过命令启动nacos服务。默认用户名和密码都是 nacos 。编写配置中心的配置信息新增配置SpringCloud配置父Cloud版本这个是整个SpringCloud的版本。 <!--springboot依赖--> <dependency> <groupId>org.springframework.boot</groupId&原创 2021-03-10 14:35:48 · 246 阅读 · 0 评论 -
自定义编写Redis缓存注解
下面我会自定义一个注解方法,可以直接在方法上面使用,达到的效果如下:如果redis缓存没有数据,则执行方法体内的操作如果redis缓存存在数据,则直接读取缓存数据,不执行方法体操作核心代码如下RedisCacheAnnotation支持在方法上面使用这个注解来缓存返回数据到Redis。package com.zhexiao.cache.component;import java.lang.annotation.ElementType;import java.lang.annotatio原创 2021-03-03 11:01:41 · 399 阅读 · 2 评论 -
解决jackson2无法反序列化LocalDateTime的问题
import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.SerializationFeature;import com.fasterxml.jackson.d原创 2021-03-03 09:53:18 · 1319 阅读 · 2 评论 -
com.netflix.zuul.exception.ZuulException: Hystrix Readed time out
在Zuul网关配置:ribbon: ReadTimeout: 60000zuul: host: connect-timeout-millis: 60000 socket-timeout-millis: 60000hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 60000pom配置原创 2021-03-01 18:57:27 · 203 阅读 · 0 评论 -
Ubuntu Maven打包项目
maven安装与配置下载mavenhttps://downloads.apache.org/maven/maven-3/3.6.3/binaries/ 下载zip包安装unzip并解压$ sudo apt-get install unzip$ unzip apache-maven-3.6.3-bin.zip配置环境变量$ sudo vim /etc/profileexport M2_HOME=/home/vagrant/apache-maven-3.6.3export M2=$原创 2021-02-01 20:20:09 · 493 阅读 · 0 评论 -
贪心算法
贪心算法的概念所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。基本思路建立数学模型来描述问题。把求解的问题分成若干个子问题。对每一子问题求解,得原创 2021-01-27 17:13:23 · 145 阅读 · 0 评论 -
NIO 读取中文文件并解决乱码问题
package com.zhexiao.convert.component;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.multipart.MultipartFile;import java.io.*;import java.nio.ByteBuffer;import原创 2021-01-20 10:05:08 · 493 阅读 · 0 评论 -
多线程的一些基本概念
什么是java多线程?进程与线程进程当一个程序被运行,就开启了一个进程, 比如启动了qq,word程序由指令和数据组成,指令要运行,数据要加载,指令被cpu加载运行,数据被加载到内存,指令运行时可由cpu调度硬盘、网络等设备线程一个进程内可分为多个线程一个线程就是一个指令流,cpu调度的最小单位,由cpu一条一条执行指令并行与并发并发:单核cpu运行多线程时,时间片进行很快的切换,线程轮流执行cpu并行:多核cpu运行多线程时,真正的在同一时刻运行多线程难在哪里单线程只有一原创 2021-01-18 15:44:16 · 282 阅读 · 0 评论 -
四种常见的限流算法实现 窗口实现、桶实现
固定窗口使用计数器在周期内累加访问次数,当达到设定的阈值时就会触发限流策略。下一个周期开始时,清零重新开始计数。此算法在单机和分布式环境下实现都非常简单,可以使用Redis的incr原子自增和线程安全即可以实现。图解:这个算法常用于QPS限流和统计访问总量,对于秒级以上周期来说会存在非常严重的问题,那就是临界问题,如下图:可以发现:我们设置的限流策略是1分钟限制计数100。在第一个周期最后5秒和第二个周期的开始5秒,请求的计数都是88;则在10秒时间内的请求计数达到了176次,已经远远超过之原创 2021-01-13 11:31:53 · 487 阅读 · 2 评论 -
Java 有限状态机
Java 有限状态机编写代码的时候,有时会遇见较为复杂的swith…case…和if…else…语句;这一刻有时会想到状态机,用有限状态机替换swith…case…和if…else…。状态机优点:降低程序的复杂度提高程序的可维护性状态机模式体现了开闭原则和单一职责原则每个状态都是一个子类,增加状态就要增加子类;修改状态只要修改一个类就行了缺点:使用状态机子类会增多,也就是类膨胀,这点需要程序员在开发中自己衡量。举个例子我们每天都乘坐电梯,电梯有四种状态:开门、关门、运行、停止。定原创 2021-01-11 18:51:39 · 574 阅读 · 2 评论 -
Spring + Zookeeper 实践分布式锁、数据监听
一、Spring Zookeeper 使用介绍1.1 ZooKeeper 是什么ZooKeeper 是 Apache 的顶级项目。ZooKeeper 为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面,ZooKeeper 并没有直接采用 Paxos 算法,而是采用了名为 ZAB 的一致性协议。ZooKeeper 主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储。但是 Z原创 2021-01-11 16:58:26 · 439 阅读 · 0 评论 -
Springboot事务的7种传播行为
事务传播行为什么叫事务传播行为?听起来挺高端的,其实很简单。即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。Spring定义了七种传播行为:1、PROPAG原创 2021-01-05 16:39:08 · 3969 阅读 · 1 评论 -
GET feign.FeignException$MethodNotAllowed: status 405 reading - @SpringQueryMap
这个问题的核心就在于:因为Feign默认使用的连接工具实现类,所以里面发现只要你有body体对象,就会强制的把GET请求转换成POST请求。这个时候应该使用 @SpringQueryMap 来标注feign client的请求是个GET。参考:https://cloud.spring.io/spring-cloud-openfeign/reference/html/#feign-querymap-supportController: @ApiOperation(value = "用户列表")原创 2021-01-04 16:57:16 · 610 阅读 · 1 评论 -
自动装箱引起的效率问题 long与Long 的测试对比
自动装箱,它允许将基本类型和装箱基本类型(Boxed Primitive Type)混用,按需自动装箱和拆箱。自动装箱使得基本类型和装箱基本类型之间的差别变得模糊起来,但是并没有完全消除。它们在语义上还有微妙的差别,在性能上也有着比较明显的差别。请考虑以下方法,该方法计算所有正整数值的总和,为此,程序必须使用 long 类型,因为 int 类型无法容纳所有正整数的总和: public static void main(String[] args) { long start = Sys原创 2020-12-31 16:19:39 · 539 阅读 · 1 评论 -
构建器 builder 构建对象实例
考虑用一个类表示包装食品外面显示的营养成分标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里,还有超过 20 个可选域:总脂肪、饱和脂肪量、转化脂肪、胆固醇、钠等等。大多数产品在某几个可选域中都会有非零的值。对于这样的类,应该采用哪种构造器或者静态方法来编写呢?习惯采用重叠构造器(telescoping constructor)模式,在这种模式下,提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个有两个可选参数,以此类推,最后一个构造器包含所有可选参数。上面这种方法虽原创 2020-12-31 14:21:21 · 355 阅读 · 0 评论 -
一致性哈希算法原理
基本概念一致性哈希算法(Consistent Hashing)最早在论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》中被提出。简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下:整个空间按顺时针方向组织。0和232-原创 2020-12-29 10:50:35 · 230 阅读 · 0 评论 -
Thread的几种状态方法
线程共包括一下5种状态新建、初始状态(New) :线程对象被创建后就进入了新建状态,Thread thread = new Thread();就绪(Runnable):也被称之为“可执行状态”,当线程被new出来后,其他的线程调用了该对象的start()方法,即thread.start(),此时线程位于“可运行线程池”中,只等待获取CPU的使用权,随时可以被CPU调用。进入就绪状态的线程除CPU之外,其他运行所需的资源都已经全部获得。运行(Running):线程获取CPU权限开始执行。注意原创 2020-12-29 10:20:18 · 1748 阅读 · 0 评论