首页 文章 精选 留言 我的

精选列表

搜索[运行平台],共10000篇文章
优秀的个人博客,低调大师

Sermant运行流程学习笔记,速来抄作业

本文分享自华为云社区《Sermant 的整体流程学习梳理》,作者:用友汽车信息科技(上海)有限公司刘亚洲 Java研发工程师。 一、sermant架构 Sermant整体架构包括Sermant Agent、Sermant Backend、Sermant Injector、动态配置中心等组件。其中Sermant Agent是提供字节码增强基础能力及各类服务治理能力的核心组件,Sermant Backend、Sermant Injector、动态配置中心为Sermant提供其他能力的配套组件。 二、java agent和bytebuddy组合使用场景 比较典型的就是skywalking、sermant、arthas、mockito。如果说java agent开了一扇门,那么bytebuddy在开的这扇门中打开了一片新的天地。 三、Sermant的入口 前面我们说AgentLauncher是java agent的入口,为什么这么说呢? <manifestEntries> <Premain-Class>com.huaweicloud.sermant.premain.AgentLauncher</Premain-Class> <Agent-Class>com.huaweicloud.sermant.premain.AgentLauncher</Agent-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> </manifestEntries> 答案可以从pom.xml中找到答案,这里可以看到基于Premain-Class和Agent-Class的两个类都指向了AgentLauncher这个类。因此我们可以非常确认的肯定它就是javaagent入口类。类似于java程序有一个main的执行入口,而java agent有一个自己的入口类premain。 因此可以看到它的入口执行main: /** * premain * * @param agentArgs premain启动时携带的参数 * @param instrumentation 本次启动使用的instrumentation */ public static void premain(String agentArgs, Instrumentation instrumentation) { launchAgent(agentArgs, instrumentation, false); } /** * agentmain * * @param agentArgs agentmain启动时携带的参数 * @param instrumentation 本次启动使用的instrumentation */ public static void agentmain(String agentArgs, Instrumentation instrumentation) { launchAgent(agentArgs, instrumentation, true); } 基于premain模式的和基于agent模式,区别在于是否为isDynamic。从这里我们可以看到这里提出了两个类值得我们去关注:AgentCoreEntrance、CommandProcessor,也即sermant这个项目的两个重点类。 更多需要了解的,可以参考byte-buddy这个开源项目。 四、入口方法执行的全流程 五、spi的加载过程 启动核心服务的过程是spi的加载过程,此时会初始化所有的服务。也即我们看到的所有服务会在此时会做一个启动的操作,同时还会启动事件: service.start(); collectServiceStartEvent(startServiceArray.toString()); 其实这个两个方法也做了很多事情。 启动服务做的事情: collectServiceStartEvent则调用netty客户端向netty服务端发送数据。到服务端后,服务端进行数据处理,其收集的信息提供给backend模块方便后台展示查看。 六、以标签路由为例PluginService中扩展插件初始化 除此之外,还有一批实现了BaseService接口的,也即PluginService扩展插件服务基类,以标签路由为例,可以看你的其初始化的整个过程。 七、install的过程 同时我们可以看到install对应的process方法也是执行它的方法: public ResettableClassFileTransformer install(Instrumentation instrumentation) { AgentBuilder builder = new Default().disableClassFormatChanges(); // 遍历actions for (BuilderAction action : actions) { builder = action.process(builder); } // 执行安装操作,此时交给bytebuddy return builder.installOn(instrumentation); } 从入参中的Instrumentation,我们往回看:ByteEnhanceManager.init(instrumentation) 这个方法里面定义了action的顺序。 public static void init(Instrumentation instrumentation) { instrumentationCache = instrumentation; builder = BufferedAgentBuilder.build(); // 初始化完成后,新增Action用于添加框架直接引入的字节码增强 enhanceForFramework(); } 执行下面的过程: 我们根据上面的添加顺序,来看初始化插件的顺序: public static void enhanceDynamicPlugin(Plugin plugin) { if (!plugin.isDynamic()) { return; } // 获取描述信息 List<PluginDescription> plugins = PluginCollector.getDescriptions(plugin); // 添加插件,然后执行安装操作 ResettableClassFileTransformer resettableClassFileTransformer = BufferedAgentBuilder.build() .addPlugins(plugins).install(instrumentationCache); plugin.setClassFileTransformer(resettableClassFileTransformer); } 从引用上看,PluginSystemEntrance.initialize(isDynamic)中引用了这个方法。 可以看到这里的添加插件,可以理解为自定义的插件。 从sermant官网,我们可以知道:定义自定义插件,需要实现PluginDeclarer这个接口。也即从这里可以看到也即自定义的插件: /** * 从插件收集器中获取所有插件声明器 * * @param classLoader 类加载器 * @return 插件声明器集 */ private static List<? extends PluginDeclarer> getDeclarers(ClassLoader classLoader) { final List<PluginDeclarer> declares = new ArrayList<>(); for (PluginDeclarer declarer : loadDeclarers(classLoader)) { if (declarer.isEnabled()) { declares.add(declarer); } } return declares; } 有了插件,就可以进行安装操作。 按照这个顺序,可以看到对应的action.process(builder)里面也执行了对应的构建方法。完成构建后,执行installOn方法。 完成安装工作后,根据安装前spi的增强实现,然后执行下游服务拦截增强,从而实现精准筛选工作。 八、以标签路由下游拦截处理为例 可以看到标签路由对应的几个代表性的Declarer: NopInstanceFilterDeclarer、LoadBalancerDeclarer、BaseLoadBalancerDeclarer、ServiceInstanceListSupplierDeclarer等。 对应的拦截器Interceptor: NopInstanceFilterInterceptor、LoadBalancerInterceptor、BaseLoadBalancerInterceptor、ServiceInstanceListSupplierInterceptor。 两者相互照应。 LaneServiceImpl和LoadBalancerServiceImpl是基于sermant框架的插件服务spi做的实现。 LaneServiceImpl和RouteRequestTagHandler是和路由能力相关的,LaneServiceImpl和LaneRequestTagHandler是和染色能力相关的。 RouteRequestTagHandler用来拦截并存储调用过程中的标签,FlowRouteHandler和TagRouteHandler是在路由选择下游实例时做的筛选过程。 下游拦截方法会经过BaseLoadBalancerInterceptor到loadBalancerService.getTargetInstances(serviceId, instances, requestData),最终到 HandlerChainEntry.INSTANCE.process(targetName, instances, requestData),基于责任链模式执行处理。目前主要有两种方式:FlowRouteHandler和TagRouteHandler。 这里面只是简单的介绍了整体的流程,具体细节的内容,还需要自己多实践。同时sermant大量使用了java agent的内容。 由于本人的局限性,有不妥的地方,还望批评指正! 参考: sermant官网: https://sermant.io/zh/ sermant开源地址:https://github.com/huaweicloud/Sermant byte-buddy开源地址:https://github.com/raphw/byte-buddy 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

Telegram 演示运行于 visionOS 的原生应用

Telegram 创始人帕维尔-杜罗夫 (Pavel Durov) 今天展示了 Telegram 即将推出的 visionOS 应用程序的简短一瞥,这是我们目前看到的首批第三方 visionOS 应用程序概念之一。 在 Telegram 上提供的视频中,Telegram 应用采用了半透明设计,与周围区域融为一体,这也是苹果为 visionOS 所采用的设计语言。 该应用的侧边栏列出了用户正在进行的所有可用对话。播放的视频会从界面中跳出,变得更加身临其境,而 emoji 字符则会占据显示屏,并在分享时以独特的方式呈现出动画效果。用户可以使用虚拟键盘或通过 Siri 听写来发送信息。 与主页界面上的所有 visionOS 图标一样,Telegram 图标在被视觉选中时会以动画的形式弹出,动画可作为应用程序被突出显示的视觉提示。由于 Vision Pro 头显使用眼睛和手势导航,因此手指轻点即可启动应用。 苹果预计将于 2024 年初推出 Vision Pro,也就是四月份或之前。随着首发日期的临近,我们很快就会看到许多其他第三方应用程序的 VisionOS 体验。 演示视频可用Telegram观看:https://t.me/durov/239 延伸阅读 苹果宣布最新操作系统:visionOS Vision Pro 新专利:可模拟生成气味

优秀的个人博客,低调大师

Nitrux Linux 2.8 发布,支持运行 Android APP

Nitrux Linux 2.8 已正式发布。 Nitrux 是一个基于 Debian 的 Linux 桌面发行版。它使用 Calamares 安装程序,包括建立在 KDE Plasma 5 桌面环境上的 NX 桌面和 MauiKit 应用程序。Nitrux 也不使用 systemd 作为它的启动系统;相反,它使用 OpenRC。 Nitrux 2.8 由 Liquorix 的 Linux 6.2 内核系列提供支持,默认启用 zswap,附带最新的 KDE Plasma 5.27.4 LTS 桌面环境,随附 KDE Frameworks 5.105 和 KDE Gear 23.04 软件套件。 Nitrux 2.8 的主要功能是默认包含 WayDroid,这是一种基于容器的方法,可以在常规 GNU/Linux 系统上启动完整的 Android 系统。这意味着用户现在可以在搭载 Nitrux 的计算机上安装和使用 Android 应用程序。 此版本还添加了 Maliit 键盘,支持 NFS 共享、平板电脑和带触摸屏的二合一设备、支持阿拉伯语和孟加拉语以及更新的 OpenRC 和 ZSH配置。 Nitrux 2.8 还包括用于管理 Linux 本机文件系统加密的 fscrypt userland 工具,并支持 F2FS 文件系统,现在默认用于 /home 和 /var/lib 分区,而不是 XFS,XFS 仍然是用于 /root 分区。 除此之外,新的 Nitrux 版本还有如下优化: 使用自定义文件调整 Sysctl 设置并添加预链接以略微提高性能 通过提供自定义文件增加打开文件或文件描述符 (FD) 的最大数量 添加 Mozc(使用 Fcitx5 ) 更新Mesa图形堆栈至23.2-git版本 更新AMD Vulkan驱动至2023.Q2.1版本 更新 dmcrypt-openrc 包 更新公告:https://nxos.org/changelog/release-announcement-nitrux-2-8-0/

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册