
java后端技术实践
文章平均质量分 75
主要针对分布式、微服务等场景下的各类技术实践
未完成交响曲-KyleWang
问陌以致远
展开
-
关于Hystrix超时机制和线程状态的测试观察和个人理解
我们有个项目中是手动创建HystrixCommand来包裹RestTemplate发起请求的。但是在服务运行过程中,发现一个情况,就是当HystrixCommand超时返回fallback结果后,RestTemplate请求过程还没有结束,导致线程池占用较多。HystrixCommand执行过程中,有两个线程,一个是HystrixCommand任务执行线程,一个是等着给HystrixCommand判定超时的线程(HystrixTimer)。当其中一个线程完成自己的逻辑时,会尝试将HystrixComman原创 2019-09-04 17:29:47 · 2337 阅读 · 0 评论 -
单元测试新手上路——个人实践总结
软件要易于修改:最近在看一本书《代码整洁之道:程序员的职业素养》,这本书里面说到,代码设计要遵循一个重要的原则-易于修改,并且要实现这个目标就应该经常修改它,而不是等到大量积累了臃肿代码之后再进行深度重构。 一套完善的测试用例是修改代码的安全保障:而如何保证在频繁修改优化代码之后,不影响其原本的功能呢?那就是要编写一套完善的测试用例,能覆盖到所有的链路场景,通过测试用例的执行结果来确保代码修改的正确性。<br />特别是我们做金融场景业务的开发,尤其要注意代码的正确性、安全性,那么写好单测是不可或缺的原创 2021-07-26 12:36:38 · 424 阅读 · 0 评论 -
Pinpoint关闭指定Plugin
Pinpoint默认加载全部Plugin,对相应的类进行增强。通过在resources目录下新增一个pinpoint.config文件,并配置profiler.plugin.disable=XxxPlugin即可完成对特定Plugin进行禁用。此配置在源码中是由DefaultProfilerConfig类加载,并在DefaultProfilerPluginContextLoader加载Plugin时应用原创 2020-12-22 16:20:21 · 1351 阅读 · 1 评论 -
Java开发避坑指南 - 常见易错点总结
业务开发中的细节问题非常多,每个开发者都或多或少踩过坑。有些细节问题,可能只会在某些特定情况下(比如高并发、多线程)出现,一经出现便会成为重大的生产事故;有些细节问题,可能暂时只会影响程序运行的性能,在量变到质变的瞬间爆发;还有些细节问题,比如所谓的服务器不稳定问题,或许运维同学改改配置、时不时重启下系统也能解决,但没从代码层面解决,就意味着程序里始终有一颗定时炸弹。其实,我们不是不重视这些细节,更不是不想从根儿上解决问题,只是不知道问题到底出在了哪里。而要做好这些细节、避开这些坑,第一步就得知道它原创 2020-10-24 09:58:45 · 2295 阅读 · 0 评论 -
一个简单的Quarkus CRUD入门
Quarkus是一个由Red Hat开源的 Java 微服务框架,根据2020年8月18日发布的《 2020 年微服务领域开源数字化报告》,Quarkus 作为云原生微服务框架,在微服务框架中活跃度排名第一,全球 GitHub 开源项目活跃度中排名 40,也具有着巨大的影响力。前面已经简单尝试过web服务构建,现在来试试实现CRUD数据操作。原创 2020-09-04 11:02:46 · 2762 阅读 · 2 评论 -
Quarkus整合Hibernate ORM下实现自定义命名策略(表、字段命名映射)
表和字段的命名都是使用蛇形(下划线)命名法,Java实体类设计时使用驼峰命名法,存在一个映射的过程,有两种解决办法:1. 显式声明实体属性对应的字段名2. 通过命名策略来实现自动映射属性较多时,通过注解显式声明比较麻烦,最好能自动映射,在spring-data整合的Hibernate实现中,Spring提供了默认从驼峰到蛇形命名的映射,但Quarkus和Hibernate本身并没有提供这种映射策略,因此需要自己实现PhysicalNamingStrategy原创 2020-09-03 18:31:54 · 2484 阅读 · 0 评论 -
一个简单的Quarkus web服务入门
Quarkus是一个由Red Hat开源的 Java 微服务框架,根据2020年8月18日发布的《 2020 年微服务领域开源数字化报告》,Quarkus 作为云原生微服务框架,在微服务框架中活跃度排名第一,全球 GitHub 开源项目活跃度中排名 40,也具有着巨大的影响力。虽然目前SpringBoot拥有着几乎不可动摇的地位,但对于其他的微服务框架,还是可以了解下的,下面就来看下如何使用Quarkus来构建一个web服务吧。原创 2020-08-28 17:52:28 · 4184 阅读 · 0 评论 -
TransmittableThreadLocal(TTL)实现线程变量传递的原理分析
TransmittableThreadLocal(TTL)是阿里开源的,用于解决异步执行时上下文传递的问题的组件,在InheritableThreadLocal基础上,实现了线程复用场景下的线程变量传递功能。TTL做的实际上就是将原本与Thread绑定的线程变量,缓存一份到TtlRunnable对象中,在执行子线程任务前,将对象中缓存的变量值设置到子线程的ThreadLocal中以供run()方法的代码使用,然后执行完后,又恢复现场,保证不会对复用线程产生影响。原创 2020-08-07 12:20:33 · 19016 阅读 · 4 评论 -
初窥Sentinel集群流控:从源码分析到效果测试
Sentinel从1.4.0 开始引入了集群流控模块,用于控制应用集群内某个 API 的总 QPS 。在Sentinel集群流控中,主要有两种身份:Token Client和Token Server,实现集群流控的流程就是应用实例(Token Client)向Token Server请求令牌,TokenServer根据集群流控规则来控制总体的QPS。待解决的问题:1. 通过Nacos流控规则配置不直观2. SentinelCluster无官方高可用方案原创 2020-07-31 10:29:06 · 5232 阅读 · 0 评论 -
Dubbo从2.5.3升级到2.7.7记录(避免Dubbo远程代码执行漏洞)
近日 Dubbo 官方报告了一个 Dubbo 远程代码执行问题(CVE-2020-1948),该问题由 Provider 反序列化漏洞引起。根据介绍,攻击者可以使用无法识别的服务名称或方法名称,并带上一些恶意参数有效载荷发送 RPC 请求。当恶意参数反序列化后,将执行一些恶意代码。我们之前是使用的2.5.3版本的dubbo,这次需要升级到2.7.7以避免该漏洞,而由于dubbo 在2.6.x之后就托管到Apache了,其包名都替换了,很多地方需要修改。原创 2020-07-05 17:31:29 · 5211 阅读 · 1 评论 -
手把手教你自定义一个Druid Filter记录sql,并结合Nacos实现动态开关和判断阈值调整
基于springboot、mybatis、nacos;Durid是一款应用比较广泛的数据库连接池,其性能优越、监控机制强大,并且还支持通过filter的机制进行扩展。Druid自带一个StatFilter可以进行慢sql记录,但是有两个缺点:1.此Filter打印日志为ERROR级别,当系统监控ERROR日志时可能会频繁触发告警,2.判断阈值只能在配置文件中进行设置,不支持动态调整,因此尝试使用一个自定义的Filter来打印日志,并实现动态开关及阈值调整。原创 2020-06-29 09:55:39 · 6425 阅读 · 0 评论 -
初探Pinpoint Agent 启动源码
Pinpoint通过字节码增强技术来实现无侵入式的调用链采集。其核心实现是基于JVM的Java Agent机制。我们使用Pinpoint时,需要在Java应用启动参数上加上-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar参数,这样,当我们的Java应用启动时,会同时启动Agent。Pinpoint Agent在启动的时候,会加载plugin文件夹下所有的插件,这些插件会对特定class类修改字节码,在一些指定的方法调用前后加上链路采集逻辑原创 2020-05-30 19:21:19 · 2633 阅读 · 0 评论 -
Undertow容器获取端口号的方法
Undertow是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器。springboot也将Undertow作为可选的内嵌容器,为其提供支持。作为公司的中间支撑团队,我们为其他团队提供了一些通用功能的jar包,比如统一的日志采集和jvm指标监控等,其中有一些需要获取到java应用的端口。而最近有一个业务团队将springboot中的容器换成了undertow,原本的获取端口的工...原创 2019-08-19 09:40:29 · 3012 阅读 · 0 评论 -
Kafka核心设计与实践原理总结:进阶篇
kafka作为当前热门的分布式消息队列,具有高性能、持久化、多副本备份、横向扩展能力。我学习了《深入理解Kafka:核心设计与实践原理总结》一书后,对其中主要的知识点进行了总结,便于理解和掌握kafka的原理和应用。在这里分享出来,希望也能帮助到大家。总结的知识点分为两部分:基础篇:基本概念、生产者和消费者的使用和原理,以及主题和分区的管理...进阶篇:深入解析kafka服务端(broker)、客户端的进阶原理(包括重分配、事务等)、kafka的高级应用...原创 2019-08-01 16:11:40 · 2172 阅读 · 0 评论 -
Kafka核心设计与实践原理总结:基础篇
kafka作为当前热门的分布式消息队列,具有高性能、持久化、多副本备份、横向扩展能力。我学习了《深入理解Kafka:核心设计与实践原理总结》一书后,对其中主要的知识点进行了总结,便于理解和掌握kafka的原理和应用。在这里分享出来,希望也能帮助到大家。总结的知识点分为两部分:基础篇:基本概念、生产者和消费者的使用和原理,以及主题和分区的管理...进阶篇:深入解析kafka服务端(broker)、客户端的进阶原理(包括重分配、事务等)、kafka的高级应用...原创 2019-07-23 13:15:15 · 2081 阅读 · 0 评论 -
快速上手jvm调优:GC调优思路及参数设置
作为Java语言的核心之一,JVM垃圾回收帮我们解决了让我们很头疼的垃圾回收问题。我们依然会遇到内存泄露问题,如果我们想提高我们程序的稳定性和其他性能我们能从什么地方下手?相信这些问题是我们程序过程中不可逾越的。了解GC调优相关知识,对于程序性能的优化和提升还是很有必要的。本文介绍了垃圾回收器的选择、GC基础调优,以及Parallel GC,CMS,G1这三种垃圾回收器做了针对性的说明。原创 2019-07-06 22:05:52 · 2601 阅读 · 0 评论 -
两行代码获取java程序实时内存指标数据——内存管理MXBean使用简介
作为一个java后端开发,关注线上java程序的运行指标数据是非常重要的。我们会对运行在jvm上的程序的cpu、内存、GC等数据进行实时采集和监控。而JDK提供了一些JVM检测的API,这就是有名的java.lang.management 包,包里提供了许多MXBean的接口类,可以很方便的获取到JVM的内存、GC、线程、锁、class、甚至操作系统层面的各种信息。原创 2019-06-23 00:34:44 · 8234 阅读 · 0 评论 -
一篇文章带你构建"分布式架构"知识图谱——极客时间《左耳听风》分布式系列专题总结
最近几年,我们一直在谈论各式各样的架构,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等。我在极客时间上我订阅了陈皓开设的《左耳听风》专栏,其中有针对分布式架构的一系列文章,这里对主要的知识点进行简单的总结,作为学习分布式架构的纲要。分布式系统架构的冰与火;分布式系统的难点;分布式系统的技术栈;分布式系统关键技术:全栈监控;分布式系统关键技术:服务调度;分布式系统关键技术:流量与数据调度;洞悉PaaS平台的本质原创 2019-06-14 17:54:33 · 1952 阅读 · 0 评论 -
采集Hystrix线程池指标并使用influxDB+Grafana实时监控(HystrixDashboard升级方案)
我们的网关采用了Hystrix来发送http请求,在分析HystrixDashboard的数据采集过程后决定自己来实现一套Hystrix指标监控系统。其实通过InfluxDB+Grafana监控服务器指标或Jvm指标等通用指标数据的教程有很多,这里主要是帮助大家如何通过InfluxDB的java客户端来上报自定义的指标数据,可以是文中的Hystrix的线程执行指标,也可以是各类业务指标。总之,最终目的就是希望通过可视化的界面,来快速掌握分析应用的运行状况,来进行实时监控乃至后续的优化。原创 2019-05-25 18:47:17 · 2721 阅读 · 2 评论 -
Sharding-jdbc设置defaultDatasource无效问题解决和源码分析思路
概要:sharding-jdbc中设置defaultDataSourcceName要配合setBindingTableGroups使用,否则默认数据源的配置无效。背景:使用sharding-jdbc进行分库分表的开发过程中,我们使用了3个数据源...在对sharding-jdbc源码进行debug分析后,发现只配置defaultDataSourcceName是不会生效的,必须要配置bindingTableGroups,将所有需要按默认规则路由的表配置进去,这里官方文档有点坑,并没有说明这两个配置...原创 2019-04-25 08:56:36 · 16043 阅读 · 9 评论 -
HystrixDashboard数据从何而来:HystrixMetrics指标采集源码解读
使用hystrix dashboard和turbine来查看hystrix指标数据...分析HystrixDashboard中的数据是怎么产生、流转最后展示到界面上的...每次创建一个HystrixCommand,其属性都会被保存至HystrixCommandMetrics的静态变量中,并在hystrix.stream的请求到来时,返回并展示到dashBoard......原创 2019-04-19 08:18:05 · 3611 阅读 · 0 评论 -
SpringCloud使用feign时的复杂参数传递
Feign传参注意 最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上的使用还是有一定的限制的,主要是要注意: 1.当参数比较复杂时,feign即使声明为get请求也会强行使用post请求 2.不支持@GetMapping类似注解声明请求,需使用@Re原创 2018-01-27 21:19:54 · 42883 阅读 · 11 评论 -
Nacos快速入门(1):启动Nacos Server
Nacos由阿里于2018年7月开启的一个新的开源项目官方介绍:Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。项目github...原创 2019-03-04 23:39:23 · 108567 阅读 · 5 评论 -
Nacos快速入门(2):整合Spring实现配置管理和服务发现
完整代码地址:https://github.com/mrKyleWang/nacos_demo一、spring应用接入Nacos启动Nacos Server,参见Nacos快速入门(1):启动Nacos Server项目中需要添加依赖&amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;com.alibaba.nacos&amp;am原创 2019-03-04 23:44:39 · 15501 阅读 · 8 评论 -
Nacos快速入门(3):整合SpringBoot实现配置管理和服务发现
Nacos整合示例完整代码地址:https://github.com/mrKyleWang/nacos_demoNacos快速入门(1):启动Nacos ServerNacos快速入门(2):整合SpringNacos快速入门(3):整合SpringBootNacos快速入门(3):整合SpringCloud(暂无)一、springboot应用接入Nacos启动Nacos Ser...原创 2019-03-04 23:49:40 · 17006 阅读 · 34 评论 -
Nacos快速入门(4):整合SpringCloud实现配置管理和服务发现
系列文章目录Nacos快速入门(1):启动Nacos ServerNacos快速入门(2):整合SpringNacos快速入门(3):整合SpringBootNacos快速入门(4):整合SpringCloudNacos整合示例完整代码地址:https://github.com/mrKyleWang/nacos_demo一、springcloud应用接入Nacos启动Nacos...原创 2019-03-14 09:55:46 · 15235 阅读 · 0 评论 -
springboot整合quartz配置多任务
看了另外一个篇在springboot中使用java类配置quartz的博客, 但是没有多任务的配置。 在这里写一个配置quartz多任务的demo, 使用两个任务, 使用SimpleTrigger和CronTrigger两种触发器, 最后一起注册到Scheduler中关于quartz 定时方面的配置请另外百度。maven依赖 dependency>原创 2018-01-18 21:51:43 · 14220 阅读 · 19 评论 -
Netty-主动关闭Server
最近在实现某个功能需求的时候使用到了Netty,我们的需求需要netty的server端能实现主动关闭,而之前一直没有深入了解过,只会实现简单的连接,看了一些资料并实验后找到关闭server的方法:1.主动关闭server如下面的代码所示,这里启动server时将ServerChannel的实例保存至静态属性,然后暴露一个closeServer()方法,直接调用ServerChanne...原创 2019-02-23 19:58:02 · 10385 阅读 · 4 评论 -
springboot整合cxf-jaxrs中json转换问题和简单解决方案
前言我在将项目用boot重构时, 关于cxf的使用出了一些问题, 主要在实体类和json转换这一方面。 在看了一些晚上的相关答案后, 了解到jaxb默认支持xml格式, 而实现对象转json是需要额外的转换器的,然后在stackoverflow上找到一个解决方法是声明一个bean,注入JsonProvider,但我发现这个可以解决服务端将对象转为json的问题,而客户端还是会...原创 2018-01-20 16:01:33 · 7466 阅读 · 5 评论 -
Sharding-jdbc分库分表入门实例
业务背景:由于公司的用户表中保存接近1亿行数据(单表),担心可能很快会单库的性能瓶颈,所以准备做水平分表分片方案设计:用户表主要以userid(long)为逻辑主键进行查询,因此准备以userid取模分为32张分表,分别存放于4个分库github完整示例代码springboot starter快速整合application.yml分片规则算法配置原创 2019-04-04 18:30:42 · 2300 阅读 · 0 评论