MAC本地编译go源码记录

说明 近期在学习GO语言,想深入研读一下GO的源码,第一步就要是可以在本地正常的编译源代码,此文对MAC上go源的安装进行记录 下载go源码 git clone https://github.com/golang/go 选择go版本分支 本次使用go 1.8版本分支来进行编译,切换分支 git checkout release-branch.go1.8 本地编译 查看本地的go版本 go version go version go1.20.5 darwin/amd64 设置编译源码的go版本 export GOROOT_BOOTSTRAP=$GOROOT 设置go mod模式为auto 因为在go1.16后,go默认在任何路径下都开启gomod模式,待编译的go源码不需要使用gomod模式,设置其它模式为自动 export GO111MODULE=auto 编译 cd go/src ./make.bash 输出结果如下 Installed Go for darwin/amd64 in /Users/tomyli/github/go Installed commands in /Users/tomyli/github/go/bin 测试验证 修改go1.8的fmt包,增加一行打印内容,打印出来 tomyli /Users/tomyli/github/go/src/fmt/print.go func Println(a ...interface{}) (n int, err error) { println("tomyli") return Fprintln(os.Stdout, a...) } 重新编译 cd go/src ./make.bash 验证脚本 创建一个新编译的go的GOPATH mkdir /Users/tomyli/github/go/localhost 测试脚本保存到localhost文件夹 main.go内容如下 ...

2023-09-20 ·  (🌟Updated: 2023-09-20) · 1 min · 138 words · tomyli

如何使用Java JDK17版本OpenJ9 JVM

前言 心血来潮,看到JDK19都出来了,想着升级一下自己电脑上的JDK到JDK17 LTS版本+OpenJ9 JVM,在升级过程中遇到找不到安装资源的问题,记录一下解决过程 JDK17是Oracle的提供的长期支持版本,IBM J9是IBM优化的JVM版本,使用它可以节省JAVA服务使用的内存 使用adoptopenjdk/openjdk/安装 先前的adoptopenjdk11-openj9版本是从adoptOpenJdk源进行安装的,想着JDK17版本也从这个源进行安装,执行以下命令进行安装 brew install adoptopenjdk/openjdk/adoptopenjdk17-openj9 报错了,没有找到,为什么?明明JDK已经到19版本了,openjdk的17版本却没有更新? AdoptOpenJdk不维护了 查了半天的google,又上 AdoptOpenJDK 的brew源上看,找到了问题所在 根据官方brew源仓库的说明, AdoptOpenJdk 在2021-08-01 后不再更新了,所有版本都迁移到了Eclipse 基金会维护的JAVA生态顶级项目 Eclipse Adoptium Temurin中不包含OpenJ9 JVM Eclipse Adoptium维护的JDK版本,通过 temurin 命令进行安装 brew search temurin 没有看到带OpenJ9名称的版本,查询temurin官方博客中发现目前的 temurin 中暂时不包含OpenJ9版本,需要到 IBM 官网进行安装 使用IBM维护的JDK 最后从IBM的网站上找到了OpenJ9,IBM的JDK版本在brew中使用 semeru 命令 brew install semeru-jdk17-open 安装成功. 终于可以使用 J9版本的JDK17了 REF https://medium.com/@sdkman_/adoptopenjdk-is-dead-long-live-eclipse-adoptium-4f2677ca935a

2022-12-14 ·  (🌟Updated: 2022-12-14) · 1 min · 49 words · tomyli

Spring的RedisTemplate如何与Lettuce进行交互的

问题 SpringWebFlux项目,使用的Redis客户端是Lettuce(基于异步),在Spring中封装了两种操作Redis的模板 RedisTemplate 与 ReactiveRedisTemplate ,正常情况下,异步编程要使用 ReactiveRedisTemplate ,那么可以在项目中使用 RedisTemplate 进行redis的操作吗?为什么? 答案 可以使用 RedisTemplate 在异步代码中进行操作 @Autowried private StringRedisTemplate redisTemplate; String value = redisTemplate.opsForValue().get(key); 追根溯源 先来明确一下应用与Redis的交互流程 Redis交互流程 获取连接 执行命令 返回结果 源码追踪 String value = redisTemplate.opsForValue().get(key); 以下以redis的get命令为例进行解析,get方法是通过 RedisTemplate 的 ValueOperations 属性进行处理的,因为 ValueOperations 是一个接口,要从其实现类 DefaultValueOperations 的get方法进行解析,直接上图 Figure 1: 整体流程图 关键点解析 第1-5步只是为了获取Redis连接 getConnection是为了获取具体的底层redis命令,项目使用Lettuce且为String操作,此处获取的连接为 LettuceStringCommands 第6步是命令执行触发点 它调用了执行DefaultValueOperations.execute(ValueDeserializingRedisCallback)方法调用时方法参数ValueDeserializingRedisCallback的实现方法inRedis,由此转入到真正的命令执行阶段 第9步获取API LettuceConnection获取的是通过调用StatefulConnection.async()方法获取的异步API 第12步进行返回处理 LettuceConnection的doInvoke方法进行了LettuceInvoker的返回处理,在里面看到的是调用了feture.get()方法使用等待的方式来实现了异步转同步的调用 获取连接阶段与执行命令阶段图示 更近一步,可以把 获取连接阶段 与 执行命令阶段 分开来,看图更加清晰 ...

2022-06-01 ·  (🌟Updated: 2022-06-06) · 1 min · 70 words · tomyli

Springwebflux源码学习-服务启动流程

学习目标 理解WebFlux核心组件HttpHandler、WebHandler的创建过程 理解DispatcherHandler如何映射请求url及参数的过程 理解Netty服务的主要启动节点 此次学习的Spring boot版本为2.6.6,对应的Spring webflux版本为5.3.18 入口 Springboot工程入口方法为 SpringApplication.run() ,从此方法开始进行分析。 public static void main(String[] args) { SpringApplication.run(Main.class, args); } 决定启动的web应用类型 整个服务的web应用类型是在构造 SpringApplication 类时进行确定的,具体代码如下: this.webApplicationType = WebApplicationType.deduceFromClasspath(); 判断应用类型的逻辑 org.springframework.web.reactive.DispatcherHandler存在 org.springframework.web.servlet.DispatcherServlet不存在 org.glassfish.jersey.servlet.ServletContainer不存在 即确认webApplicationType为 Reactive if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null) && !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) { return WebApplicationType.REACTIVE; } 创建具体的ApplicationContext 根据webApplicationType(Reactive)确定创建的ApplicationContext为AnnotationConfigReactiveWebServerApplicationContext,此Context支持 @Component 和 JSR-330规范中 @Inject 形式的依赖注解 SpringAplication.createApplicationContext() switch (webApplicationType) { case SERVLET: return new AnnotationConfigServletWebServerApplicationContext(); case REACTIVE: return new AnnotationConfigReactiveWebServerApplicationContext(); default: return new AnnotationConfigApplicationContext(); } 最主要的ApplicationContext.refresh()方法 refresh的Refresh阶段 刷新操作是在 AbstractApplicationContext 类的refresh方法中进行,在调用invokeBeanFactoryPostProcessors方法时会有对controller注解的扫描与处理 ...

2022-05-24 ·  (🌟Updated: 2022-05-30) · 2 min · 351 words · tomyli