Java
文章平均质量分 87
没事干写博客玩
真正的大师永远怀着一颗学徒的心。
展开
-
Java Apache Commons Collection3.2.1 理解Transformer 接口
接口开始分析Transforms the input object (leaving it unchanged) into some output object.@param input the object to be , should be left unchanged@return a transformed object它说传入的对象会,并返回记住了,就是用来用的,在这里你可以先简单的当它是一个。实现此接口的类有下面这些:比如有一些有趣的,我们看看它们的方法它将返回,其中和在其传入原创 2022-06-25 01:44:29 · 1887 阅读 · 0 评论 -
Java SocketChannel控制接收数据字节长度及复用ByteBuffer
Java SocketChannel控制接收数据字节长度及复用ByteBuffer引言混乱的数据结构尝试读取固定大小数据如何复用ByteBuffer文件传输Buffer复用及减少使用用户层缓冲区原创 2021-02-24 03:55:55 · 2639 阅读 · 0 评论 -
Spring Cloud 2020 + Nacos + spring-cloud-loadbalancer + gateway 实现灰度发布
Spring Cloud 2020 + Nacos + spring-cloud-loadbalancer + gateway 实现灰度发布引言Nacos Server 1.4.1Producerpom.xmlControllerapplication.propertiesConsumerpom.xmlControllerGatewaypom.xmlapplication.ymlspring-cloud-loadbalancer 实现灰度发布原理引言Spri原创 2021-02-13 06:54:15 · 2444 阅读 · 13 评论 -
C/C++ 给 Java 通过Socket传输int问题
C/C++ 给 Java 通过Socket传输int问题引言int高低位乱序解决引言事情是这样的,朋友有个软件,但是是单机版本,他想实时向服务器传输生成出来的报告,算是服务器那边有个备份。我先看了一下,软件是C/C++的,CRT也是版本齐全,而且那台电脑也不允许装什么其他环境了,我很自然的就用C/C++写了,而服务端使用JAVA写的,因为服务器那边本来就装了JAVA环境,但没有10以上版本的CRT,所以我就用了2个不同语言写了。int高低位乱序如果两边同时使用c/c++写,那么不会出现这个问题,因原创 2020-12-28 17:21:39 · 1022 阅读 · 1 评论 -
OAuth2协议 白话理解+SpringCloud Security 栗子
OAuth2协议 白话理解+SpringCloud Security 栗子引言白话理解专业名词认证授权服务和资源服务scope作用域关于白话理解搭建认证授权服务引入依赖编写认证配置(SecurityConfig)配置授权服务基于内存Token的授权服务配置基于JwtToken的授权服务配置申请token简化模式申请token申请授权码根据授权码申请token密码模式申请token刷新token检查token搭建资源服务引入依赖配置资源服务远程调用认证授权服务的TokenService资源验证基于JWT的无状原创 2020-12-19 16:38:45 · 1179 阅读 · 4 评论 -
SpringBoot 多数据源 指定数据源实现读写分离 手动实现和使用
引言本篇文章讲一下如何实现多数据源实现读写分离,不涉及JTA和微服务的分布式事务,如果需要了解分布式事务的可以在分布式专栏下找到相关文章。使用dynamic-datasource-spring-boot-starterpom 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-start原创 2020-12-19 15:20:49 · 739 阅读 · 1 评论 -
RocketMQ 入门
RocketMQ引言引入依赖NameServerTopic 和 TagProducer 发送消息同步消息异步消息单向消息Consumer 消费消息PushConsumer及广播模式进阶顺序消息顺序Producer顺序Consumer延迟消息TransactionMQProducer 发送事务消息引言发现写过了RabbitMQ和Kafka,这次补上RocketMQ,之后有空会讲讲这几个消息中间件的实际场景选型和选择原因。本篇文章不写整合Springboot,因为Springboot你可能看不到这些细节。原创 2020-12-10 23:46:34 · 234 阅读 · 0 评论 -
C/C++ php/python/lua java 基本类型字节
C/C++ php java 基本数据类型字节C/C++x86x64php/python/luax86x64javax86x64C/C++x86char wchar short word dword float double无变化,不说了int 4字节long 4字节long long 8字节boolean 1字节BOOL 4字节BOOLEAN 4字节x64int 4字节long 8字节long long 8字节boolean 1字节BOOL 4字节BOOLEAN原创 2020-06-09 18:03:20 · 194 阅读 · 0 评论 -
Kafka 消息确认机制 保证不丢失及手动确认消息
保证消息传输过程中不丢失org.springframework.boot.autoconfigure.kafka.KafkaProperties中可以看见所有配置项,这次讲讲如何保证消息在传输过程中不因为服务器突然宕机而没有收到消息,但producer却认为消息已经发送成功的问题。spring.kafka.producer.acks 这个配置项有3个可选,分别是0,1,-1。ack=0:就是说消息只要通过网络发送出去就不会再管,无论是否被服务器接收到。也就是我只管发,你接到还是没接到我并不关心原创 2020-09-09 17:54:55 · 11256 阅读 · 0 评论 -
AMQP RabbitMQ 新手入门 三种交换机及Producer+Consumer的消息确认机制+事务
AMQP RabbitMQ 新手入门 三种交换机及消息确认机制引言交换机、队列、路由键 简述直连交换机发送消息及监听扇形交换机@RabbitListener 创建+绑定+监听主题交换机创建及绑定发送消息消息确认引言之前写过RabbitMQ的消息打回机制和死信队列,这次准备详细讲一下RabbitMQ,主要是给新手写的入门用的。之前的文章:AMQP RabbitMQ 打回消息后延迟处理Spring Cloud Stream RabbitMQSpring 依赖<dependency&原创 2020-09-08 22:24:29 · 737 阅读 · 0 评论 -
JVM 类加载器与双亲委派模型
JVM 类加载器与双亲委派机制类加载器类加载器的作用.class 文件结构类加载器的命名空间双亲委派机制类加载器Java类加载器(英语:Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。学习类加载器时,掌握Java的委派概念很重要。每个Java类必须由某个类加载器装入到内存。Ja原创 2020-08-31 02:11:31 · 225 阅读 · 0 评论 -
openfeign 转发header 实现全链路灰度发布
openfeign 转发header 实现全链路灰度发布引言实现在服务中修改Predicate加一个Interceptor配置ribbon规则,使用我们自己的规则引言网关层看这里之前写了网关层实现灰度发布,但是这个只能被路由一次像是这样:客户端->网关->根据版本号路由到应用之后应用再调用其他服务,调用链的路由就没办法了,它只会被路由一次。实现在服务中加入在网关层写好的rule和predicate,predicate需要改一下,因为web中没有zuul的RequestCon原创 2020-07-01 19:19:13 · 2430 阅读 · 0 评论 -
Zuul 网关层的灰度发布 使用及手动实现
Zuul 网关层的灰度发布引言简单使用自己实现(原理)Ribbon 中 ILoadBalancer 如何获取元数据ILoadBalancer::chooseServer(key)自己实现(代码篇)写一个Predicate写自定义Rule将规则配置进Zuul,写个配置类测试引言什么是灰度发布?灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大原创 2020-07-01 05:16:01 · 1331 阅读 · 0 评论 -
CI/CD docker/k8s 简介
CI/CD docker/k8s 简介CI/CDJenkinsdockerdocker composedocker swarmKubernetes我们用人话来讲讲这几个名词的意思。CI/CDCI (Continuous Integration)CD (Continuous Deployment)持续集成和持续部署,有很多文章是为了粉丝或流量会拿一些奇奇怪怪的蛇皮名词出来唬人,事实上根本唬不到人,在很久之前python的部分开发者就开始往自动化运维和自动化部署方向跑。什么是持续集成原创 2020-06-27 05:04:33 · 497 阅读 · 0 评论 -
SpringSecurity 无状态JWT验证
SpringSecurity 改为无状态 JWT验证引言pom.xmlSecurity Config编写JWTUtils 用来创建和解析JWT控制器 写login方法,返回JWTJWTAuthenticationFilter 自定义过滤器引言朋友问到JWT的东西,其实这个东西很简单,只是将信息加密,以后前端访问带着这端信息过来,我们只需要解密后匹配一次看看信息是否正确即可。必须使用JWT吗?JWT只是一种规范,事实上你可以使用任何格式进行加密,没有必须让你写成json后加密。你可以将信息按照自己的格原创 2020-06-22 00:15:32 · 788 阅读 · 0 评论 -
maven编译后上传linux 出现Invalid or corrupt jarfile xxx.jar
maven编译后上传linux 出现Invalid or corrupt jarfile尝试解决办法maven编译后,上传linux,docker build后无法运行,通过logs查看发现Invalid or corrupt jarfile错误。尝试网上说MANIFEST.MF的问题 ,那我直接手动java -cp 指定main方法还是不行,排除MANIFEST.MF的问题。结论是上传后文件大小相同,但被损坏,不知道是这个上传工具有问题还是怎么了。解决办法windows使用gitbash,用s原创 2020-06-17 20:11:44 · 707 阅读 · 0 评论 -
Hystrix 服务熔断降级
Hystrix 服务熔断降级引言基本概念注解开启断路器策略配置@DefaultProperties和@HystrixCommand简单的超时配置其他配置隔离策略threadPoolProperties断路器状态断路器时间配置引言Hystrix 属于 Spring Cloud Netflix 中的套件之一,Spring Cloud Netflix 其中还包括Eureka,Feign,Ribbon,Zuul,Bus。本问仅简单讲一下Hystrix这个熔断降级框架。因为Netflix一部分的套件已经停止更原创 2020-06-04 22:04:47 · 528 阅读 · 2 评论 -
Spring源码阅读
Spring源码阅读ApplicationContext(应用上下文)AnnotationConfigApplicationContext做了什么?this()register(@Configuration的类 下面用配置类代替)refresh准备阶段开始做事总结事实上我不太愿意写源码类文章,上个月和本月中发的文章基本是分布式应用中的文章,所以最近就偏向底层原理,我估计我发的源码文章也就这一次了吧。我更喜欢写思路或系统底层的知识。因为事实上读源码是一件很浪费时间的事,毕竟不是所有人都愿意读源码,这种文章看原创 2020-05-27 17:38:30 · 237 阅读 · 0 评论 -
小白文 理解SnowFlake(雪花算法)
小白文 理解SnowFlake(雪花算法)组成结构解决了什么问题各个BIT位作用小白文理解雪花算法单线程下的简单栗子雪花算法(SnowFlake)由Twitter创造的,是一个唯一ID生成算法,且具备有序性和可扩展性.雪花算法难吗?其实并不难,甚至说简单。思路远比技术和代码重要得多。组成结构生成出的ID是一个64bit的整数,其中时间戳占41位,数据中心ID占5位,机器ID占5位,自增序列占12位,还有1位是符号位。这个符号位可以是无符号,这样就可以扩大使用时间或其他地方的bit位数,但是为什么在原创 2020-05-25 13:07:34 · 2118 阅读 · 0 评论 -
Seata 进阶踩坑
Seata 进阶踩坑并发异常手动解绑和绑定事务手动控制事务流程seata单机的例子官网有,关于高可用部署往这看:保姆级配置 Seata1.2 + Nacos并发异常Seata 针对同一个数据在并发情况下,如果先是上游服务成功,下游服务失败会出现异常io.seata.core.exception.GlobalTransactionException:Could not found global transaction xid = 192.168.0.2:8091:2011766308, may b原创 2020-05-16 09:12:14 · 10949 阅读 · 0 评论 -
Java 参数传递我的理解
Java 参数传递理解引言参数传递过程对象值传递猜测对象引用传递猜测思考总结引言Java中的对象是值传递还是引用传递?我个人认为,如果没有学习过c++的小伙伴,对引用这个概念可能只有JAVA的4种引用类型和引用队列这个概念。那么参数的传递是引用还是值传递呢?想看C++的往这看 c++ 左值 右值 拷贝构造 移动构造参数传递过程基本编程入门大家都学过最简单的语言:C语言(语法简单,函数式编程,无面向对象),其中相信大家都接触过指针和引用这2个类型,这里为什么说到C语言,因为这2种参数传递类型原创 2020-05-16 02:33:36 · 217 阅读 · 0 评论 -
保姆级配置 Seata1.2 + Nacos
保姆级配置 Seata1.2 + NacosSeata 配置进Nacos注意坑来了vgroupMapping配置服务端配置(这里不是源码,是编译过的)一切就绪 开始使用pom.xmlyaml关于找不到default服务本篇文章单讲配置,关于分布式事务的文章看我另外一篇。单机方式就是通过conf文件配置即可,但是Seata配合Nacos,我遇到了个坑,写一下希望有人不会和我一样。Seata 配置进Nacos下载seata-1.2.0 源码进入\seata-1.2.0\script\confi原创 2020-05-14 09:26:51 · 2204 阅读 · 3 评论 -
spring websocket + redismq
spring websocket + redismq引言栗子pom.xmlRedisConfigurationWebSocket ConfigurationUserInterceptorControllerhtml引言之前写webflux通过rabbitmq推送消息,这次写websocket基于redis推送消息,区别在于websocket我们可以主动推消息,也就是说我们只需要一个监听就足够了,webflux中是每个用户对应一个监听者,具体原因可以看这->Spring Reactive Web原创 2020-05-14 08:00:10 · 287 阅读 · 0 评论 -
Spring Reactive Web Webflux 整合 RabbitMQ
Spring Reactive Web Webflux 整合 rabbitMQ引言例子(广播消息)pom.xmlConfiguration写一个监听容器工厂在Controller中使用引言在使用spring-web 的 websocket 时我们可以在@RabbitListener或CloudStream @StreamListener中直接使用messagingTemplate.convertAndSendhuozhe或@SendTo 广播消息。在webflux中如何使用mq进行消息推送呢?原创 2020-05-14 06:39:02 · 1504 阅读 · 0 评论 -
Spring Cloud Stream RabbitMQ
Spring Cloud Stream RabbitMQ介绍看个简单的例子pom.xmlyaml发送消息接收消息自定义 Bindingsyaml发送消息接收消息介绍Stream用来做什么呢?如果开发组不同,大数据那边用了kafka,你这边又用了rabbit,那么当你想给kafka发消息的时候你要做的工作就变多了。Stream就是为了减少工作量和学习成本,用Stream封装的的API进行消息传递和接收,这样你可以不关心具体用的是什么消息中间件,不需要去关心什么队列,交换机,Topic,分区等等。它就是原创 2020-05-09 22:39:43 · 474 阅读 · 0 评论 -
Spring Reactive Web 结合OpenFeign
Webflux 直接使用OpenFeign 会提示No qualifying bean of type ‘org.springframework.boot.autoconfigure.http.HttpMessageConverters’ available: expected at least 1 bean which qualifies as autowire candidate. Depe...原创 2020-05-07 02:23:49 · 2616 阅读 · 0 评论 -
Webflux 异常处理
Webflux 异常捕获@Component@Order(-2) //这特么是个迷一样的重点,不设置Order 直接报错页面都没了,封包里只能看见个404public class ExceptionHandler implements ErrorWebExceptionHandler { @SneakyThrows @Override public Mono<V...原创 2020-05-06 14:22:14 · 1572 阅读 · 0 评论 -
分布式事务2PC TCC AT(Seata) 如何理解AT模式
分布式事务2PC TCC AT(Seata)名词:2PC 二阶段提交(Two-phaseCommit)TCC具体实现:SeataAT模式 (AsyncTransaction)名词:TC 事务协调者TM 事务管理器RM 资源管理器2PC 二阶段提交(Two-phaseCommit)TC 给每个参与者发送预备请求,每个参与者要么能成功,要么不能成功,你要返回给TC,如果收到了每个...原创 2020-05-06 14:07:35 · 3034 阅读 · 0 评论 -
JVM volatile 错误理解和正确理解
JVM volatile 错误理解和我的理解可见性错误理解:DCL 单例模式一定要用到volatile吗可见性错误理解: private static boolean test = true; public static void main(String[] args) throws Exception { new Thread().start(); // 开始执行...原创 2020-05-02 23:28:11 · 424 阅读 · 1 评论 -
系统中的CAS
系统中的CAS原子操作系统中的CAS API探究底层原理总线锁CPU缓存一致性本文不是讲单点登录写这篇文章的原因是,看到一个面试过程,面试官问的是Java 中 Atomic 的问题,而面试者的回答却是扯到了多线程上,但只是说了这是CAS,原子操作。如果你不了解底层知识,不要轻易扯到多线程上,最好只回答它经过cas指令,其操作是具有原子性的。一般面试官不会深问,但是你自己扯到多线程上面,如果问了...原创 2020-04-30 06:04:45 · 631 阅读 · 1 评论 -
Zookeeper 安全的修改数据
Zookeeper 安全的修改数据原理curator 例子之前有文章写了Zookeeper 通过节点是否存在进行互斥,实现悲观锁这次来说说如何安全的修改数据。原理ZNode中 Stat结构:cZxid:这是导致创建znode更改的事务ID。mZxid:这是最后修改znode更改的事务ID。pZxid:这是用于添加或删除子节点的znode更改的事务ID。ctime:(Create...原创 2020-04-23 17:07:35 · 702 阅读 · 0 评论 -
Eureka 配置主要参数及含义
Eureka 配置主要参数理解server 配置provider 配置简单介绍一下eureka主要参数配置是做什么的(提醒一句:新项目不要在用eureka了哦,停止更新了)server 配置server: port: 8761eureka: instance: hostname: eureka-server # 实例主机名 ip-address: 192.168...原创 2020-04-22 23:16:50 · 538 阅读 · 0 评论 -
CuratorFramework Zookeeper 分布式锁的使用及手动实现
CuratorFramework Zookeeper 分布式锁的使用及手动实现CuratorFramework 已经实现好的分布式锁手动实现一个简单的不可重入锁CuratorFramework 已经实现好的分布式锁InterProcessLock (接口)InterProcessMutex (可重入互斥锁)InterProcessMultiLock (多个锁的管理容器)InterPr...原创 2020-04-18 18:11:16 · 759 阅读 · 0 评论 -
Springboot2.x AOP 实现 @Cacheable自定义TTL和自动刷新 防止缓存雪崩
Springboot2.x AOP 实现 Cacheable自定义TTL和自动刷新CacheManager个性化设置自定义每个缓存的TTL和自动刷新自己写TTL注解AOP实现使用CacheManager个性化设置可以根据需要,让某些key,默认TTL与基础设置不同,直接看代码这不是重点,只是可以提前DIY一些东西 @Bean public CacheManager cach...原创 2020-04-17 16:56:02 · 2044 阅读 · 5 评论 -
Springboot RedisTemplate 分布式锁
Springboot RedisTemplate 分布式锁RedisTemplate.executeRedisTemplate.executePipelined实现锁测试锁RedisTemplate.executeexecute 有很多参数常用的有execute(RedisCallback) 和 execute(SessionCallback)通常都是使用SessionCallback...原创 2020-04-16 07:37:10 · 1365 阅读 · 0 评论 -
AMQP RabbitMQ 打回消息后延迟处理
AMQP RabbitMQ 打回消息后延迟处理1. 使用DLX实现延迟消息创建一个普通直连交换机和队列创建死信队列测试2. 消息打回延迟处理代码例子是spring boot下的,但是原理都相同。1. 使用DLX实现延迟消息注意,要使用DLX实现延迟队列的前提是,接收的队列无任何消费者监听,否则只会是Unacked的状态,除非消费者退出才会进入死信队列例子中没有宏,没有多余代码,没有复...原创 2020-04-12 08:47:49 · 408 阅读 · 0 评论 -
SpringBoot2.x RestClient 操作ElasticSearch 7.x
SpringBoot Rest 操作ElasticSearch本地环境ES新版和老板差异7.6.2 版本老版本使用 RestClient导入依赖yml配置rest新建索引文档查找本地环境Spring Boot 2.2.6Elasticsearch 7.6.2写这个文章的原因是“The well known TransportClient is deprecated as of Elas...原创 2020-04-11 08:51:20 · 702 阅读 · 0 评论 -
Lucene 8 简单的介绍
Lucene 8 简单的介绍Lucene 简介原理Lucene 代码例子Maven Pom依赖创建 索引 文档搜索更多用法Lucene 简介Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Luc...原创 2020-04-11 01:56:58 · 1623 阅读 · 2 评论