想深入学习一个字节码框架,听说了javassit、asm、ByteBuddy、cglib啥的,小傅哥帮忙大概介绍下,想入手ByteBuddy咋样。 框架介绍: 1. ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 2. Javassist 是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 3. Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助。除了 Java 类库附带的代码生成实用程序外,Byte Buddy 还允许创建任意类,并且不限于实现用于创建运行时代理的接口。此外,Byte Buddy 提供了一种方便的 API,可以使用 Java 代理或在构建过程中手动更改类。2015年10月,Byte Buddy被 Oracle 授予了 Duke’s Choice大奖。该奖项对Byte Buddy的“ Java技术方面的巨大创新 ”表示赞赏。我们为获得此奖项感到非常荣幸,并感谢所有帮助Byte Buddy取得成功的用户以及其他所有人。我们真的很感激! 使用总结: 1. ASM 纯字节码操作,可以结合 IDEA 插件:ASM Bytecode Outline,进行使用。它能把你的普通 Java 代码转换为使用 ASM 操作时,应该做如何的处理。但 ASM 是使用上最复杂也是功能最强的框架,很多其他框架Cglib、Javassist、Byte-buddy 都是基于 ASM 开发的。 2. Javaassit 市面上很多基于 javaagent 实现的非入侵的全链路监控都是使用的此框架完成,因为它的性能稳定,操作简单,功能丰富,既可以使用提供的 API 也可以操作字节码,所以使用起来会更加方便,遇到问题也可以很快的找到解决方案。 3. Byte Buddy 我是非常喜欢这个框架,因为他可以让对字节码的操作简化为像写普通的程序代码一样,非常容易完成一些需求逻辑的实现,并且它还是一个获奖项目! 最后说明: 其实你可以把几款字节码插桩组件都了解下,完成同一个复杂场景的功能,看看各自的实现是否能满足你的需要,之后选取那个最合适你的。 --- 小傅哥你好,我想问一下组件类以聚合工程方式引入还是以自定义start方式引入更好呢,个人感觉以jar包方式总改版本号好麻烦啊 1. 通常我们会把非业务逻辑的共性通用问题,抽取成独立的服务开发成各个领域的技术模块,这类的通常会采用中间件的方式开发。如果是Spring直接开发就行了,SpringBoot 则包装成 Starter。 2. 如果是一些项目中用到的需求逻辑,不具备共性问题的提取,本身就是属于项目的一部分,直接以项目模块 Module 的方式聚合即可,这样引入起来也方便,更符合开发使用。 --- 小傅哥,程序员应该有一个副业嘛? 时常焦虑,看到一些优秀的程序员 去做小程序,外卖引流,知乎好物 部分做的好的收益都不错,自己本身没有稳定收入副业。 所以被弄得很焦虑。想向傅哥请教一下 如何去分配这个时间,对抗焦虑 提个背景:上大学的时候,很多同学放假了喜欢去做一些兼职、发发传单、洗洗盘子、当当家教,但其实我并不会支持去做这些,因为所有的此类事情与你的自身长期价值积累并不符,只能带来一点社会体验和分支经历。如果你能把这个时间放在属于你未来想做的事上,积累此类知识、经验、阅历,那么将来会给你带来更大的价值,所以我更推荐做长期有价值的事。 关于副业:其实我一直折腾此类事情,包括之前说的接私活、当网课老师、给人家做网站、还有猪八戒网的需求,折腾过后感觉这类内容的副业,需要你有一个稳定且并不小的时间投入,能赚到一点钱,但不太可能长久,因为毕竟目前你仍然需要以工作为主,在一个能满足你成长的土壤中,不断的加强自己的能力。比如你在职场的职位、收入、人脉,这些可能更是你现阶段的目标,不同的人在不同的阶段有不同的选择,但目前对你来说,搞副业,最好只当练手,提升额外的能力,先不要把赚钱看的太重,并从这些折腾的过程中,找到符合自己想做的事情。 拒绝焦虑:向阳而生、逐光而行,减少没必要的内心焦虑,你做的任何一件事将来都会汇聚在一起,慢慢铺自己的地基,不要着急于快。在时间分配上,也不要想着什么都做,人的精力也是有限的,不要给自己压榨的太狠,适当的放松非常有必要。千万记得要慢下来、慢下来、慢下来! --- 用了 spring security ,如果有权限的动态刷新,不想引入缓存这类东西,也不用主动推送,有没有什么好的办法解决已登陆用户的权限修改? 首先:你的场景是有什么限定吗,权限使用过程中的校验可以直接读库不,因为我感觉你这个体量并不大,如果可以读库验证,直接修改库就可以了。 通常:一个权限的变更,需要走审批流程并要求用户退出登录,验证身份,才可以使用新的权限职责,避免因为权限范围扩大,导致之前账号借用等操作风险的发生(不过这个依赖于不同场景的风险级别而决定设计)。 --- 如何通过javaagent方式实现http服务之间的header信息传递?Hystrix线程隔离策略或者多线程下如何实现呢? 1. 基于字节码框架(ASM、Byte-buddy、javassit)插桩和 Javaagent 能力实现的非入侵全链路监控系统,具备的特质包括: 1.1 低侵入性:监控系统应尽可能减少对业务系统的侵入,保持对使用方的透明性,减少开发人员的负担,降低接入门槛和难度。 1.2 低性能影响:由于全链路监控系统需要对各种应用中间件进行日志数据采集,大多都需要在业务系统内进行“埋点”或放置agent,一般都是在核心业务流程。因此应尽可能降低对业务系统造成的性能影响,一般来说,对CPU的耗用低于1%~2%可以作为一个参考阈值。 1.3 灵活全面的接入策略:为了尽可能降低接入成本,应该提供灵活的监控配置策略包括配置在服务器端方便升级,让业务方决定是否接入,以及收集数据的范围和粒度,并提供对应的技术方案保障监控策略生效。 1.4 时效性:实时有效的监控数据展示功能,帮助相关人员理解系统行为,为流程、架构、代码优化,以及扩容缩容、服务限流降级提供正确客观的数据参考。 2. 所有基于此类技术实现的监控系统,都需要给一次调用生成唯一ID,并在 http3x、http4x 中使用 setRequestHeader 方式进行传递。另外在 RPC 框架中如 Dubbo 也会有透传信息的字段,给予监控系统使用。 3. 关于全链路监控的学习,可以参考以下内容: 3.1 pinpoint:https://github.com/pinpoint-apm/pinpoint 3.2 bee-apm:https://github.com/itstack-org/bee-apm --- 傅哥 您好 想问一下MESA管程模型设计成两个队列的用意是什么 如果只有一个入口队列不行吗?这个模型套在AQS上好像也一样。AQS也是两个队列 同步队列还是可以理解的 但是AQS多设计一个等待队列的意义是什么也不太懂 AQS: * +------+ prev +-----+ +-----+ * head | | <---- | | <---- | | tail * +------+ +-----+ +-----+ 1. AbstractQueuedSynchronizer 从名字上就可看出本质是一个队列(Queue),其内部维护着 FIFO 的双向队列,也就是变体 CLH 队列的实现。 2. 所有的 Lock 都是基于 AQS 来实现了。AQS 和 Condition 各自维护了不同的队列,在使用 lock 和 conditio n的时候,其实就是两个队列的互相移动。那么你说的两个队列,只的是 Condition 队列吗? 管程(新了解内容,以前没注意过): 1. 管程就是指管理共享变量,以及对共享变量的相关操作。具体到 Java 语言中,管程就是管理类的成员变量和方法,让这个类是线程安全的。管程的发展史中,先后出现过三种管程模型,Hasen 模型、Hoare 模型和 MESA 模型,Java 使用的是 MESA 模型。 2. 使用管程模型主要是解决并发编程中的两个核心问题,互斥和同步。互斥是指同一时刻只允许一个线程访问共享资源,同步则是指线程之间如何通信、写作。 3. 解决互斥:将共享变量及对共享变量的操作统一封装起来 4. 解决同步:管程模型与上厕所排队的流程类似,管程入口处有一个等待队列。当多个线程试图进入管程内部的时候,只允许一个线程进入,其他线程在等待队列中等待。就和上厕所的时候排队一样。 综上:一般此类实现除了消费队列,还需有等待队列,以便于实现 Lock 相关内容。推荐阅读:《Java并发编程实践》 不确定以上是否为你需要的,可以回复讨论。 --- 微服务应用之间调用接口,如何控制权限? 1. 通过在微服务 RPC 接口或者网关层接口,配置权限校验组件,这类组件一般是自研的。通过校验组件设置接口调用权限码,调用时需要传一个固定的分配值。 2. 指定服务器名称、服务器IP,进行调用,非此信息以外的服务不能被链接调用。 3. 通过开发接口间非对称加密传输安全校验的,一般用在双方为安全级别较高的接口调用上。 4. 接口自由度较高的申请获取字段查询,申请时候会分配一个有效签约期的授权码,拿到授权码后,可以调用指定接口。 --- 小傅哥,这是我按你昨天说的整理的目前项目的技术栈和想要学的技术栈。期待你的建议。 从目前你的技术使用上来看,其实广度是有的,只是缺少一些深度的学习和使用。建议: 第一阶段:学习下数据结构、算法逻辑(仅Jdk自身的即可,HashMap、ArrayList、AQS等来夯实java能力)、设计模式,这些技术是后续的学习其他技术的基础。 第二阶段:学习 MyBatis 源码,至少要能搞懂“为什么,不写具体的DAO实现类,就能通过配置文件或者注解执行对数据库的增删改查操作”,这个知识会让你把Spring常用接口和类串联起来,也可以把代理、反射、解析xml、连接池使用上。 第三阶段:学习 Spring 源码,学习完成后尝试结合 Spring 写一些中间件,比如数据库路由组件、ES查询引擎组件,这些在我写的《SpringBoot中间件设计和开发》中都有例子。 第四阶段:补充对 MQ、SpringCloud、ES 等框架类的深入学习,要学习它的设计架构、核心源码、技术目的、使用场景。 第五阶段:完成较难度项目的开发,比如实现一个分布式架构下的活动抽奖系统,如何设计其中的秒杀、抽奖算法、奖品发放,这个项目可以模拟小程序中一些抽奖的设计去实现。 --- 设计一个系统,应该要考虑/着重要关注的点在那些?以及设计一个系统的流程顺序应该是怎么样的? 比如我需要设计一个消息中心/通知中心这样的东西 谢谢啦 除了通用的设计规范:高可用、高并发、易扩展外,还会根据具体的业务系统场景做具体的设计,比如你说的消息通知中心; 1. 你的系统要满足多少用户访问,面向的群体是什么样,通知触达消息、通知手机push、是否需要发送短信,是否和一些外部的触达系统对接等等 2. 这个系统需要用到哪些技术栈,整体的技术架构是什么样,这些技术点团队里是否都有过使用经验,对于新技术是否有过技术调研和评审 3. 在系统的流程设计上,一般包括:产品PRD评审、架构整体设计、研发技术设计、研发技术评审、进入开发阶段、日会进度风险汇报、研发完成提测、提测报告(含文档和单元测试等)、测试通过、研发通知上线。 4. 如果是电商系统,还会考虑下单、支付、发货流程,中间还会有是否有秒杀场景、系统设计中是否有分布式锁的优化等等,所以在设计的大框架之外,还有因为不同项目的具体设计情况,这部分也是一种经验的总结。 --- 大佬你好,话说分库分表排序怎么处理呢?? 一般是以用户维度的分库分表,所以: 1. 通常对个人信息的排序直接从库里去就可以,不涉及夸库。 2. 如果排序数据不多,一般也可以加入到redis中。 3. 如果是夸库涉及到排序,需要把分库分表数据通过数据库 binlog 日志,使用 otter 工具,把数据同步到ES,在从ES查询使用。 --- 1. Class,关键字 extends 在这里不只是继承的含义,也包括了对接口的实现。所以可以传入一个实现 ICacheAdapter 接口的具体对象,用于实例化。 2. 可以修改为 Class cacheClazz,因为 T 表示的类型就是 CacheService 的类型。 3. 此场景多用于解决所有项目工程中的共性问题,而开发的一类中间件方案。 欢迎多提问,哈哈哈。下次提问可以选上面的提问给我,这样避免我漏掉。 --- 你好小傅哥,对于工作量量化你有过什么经历或者经验吗 确实有不少的项目在开发过程中需要被量化,因为量化后时间基本也就能确定一个项目开发的排期。那么为了能更加准确的量化这个时间,通常我们会把项目拆分各个模块,再把模块分配给个人,每一个模块的开发时间由个人提供,之后再对出所有模块的联调时间,以及完成后的一个提测时间。最终就可以把整个工作量的一个排期输出出来了,但通常也会在这个时间节奏上留出一个buffer便于出现紧急问题时,还来得及调整。另外,对于这样的量化的排期的项目,要每天过日会统计开发进度、遇到的风险事项、外部协调推动、环境部署等各种问题的汇总和解决进度,这样才能更好的把控开发进度和一个上线时间。