文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Native 可以正式使用了么?

2024-12-03 05:30

关注

一、前言

hello 大家好,我是如梦技术(春哥 L.cm),大家可能在很多开源项目里看到过我的身影。今天我带领大家实战一下spring-native。内容偏硬核,建议大家坐稳扶好(关注、收藏)。

对 Graalvm 和 Spring native 我们一直都有关注,并且已经发表过多篇公众号文章。对于 demo 级别的使用这里不做过多介绍,感兴趣的可以查看冷神(pig 冷冷)之前的文章 Spring Native 入门实战。

二、spring native

2.1 graalvm native image 配置生成

在spring native项目(mica-native-test)编译之后会生成下面的这些 graalvm native image 配置。

可以对动态代理、反射、资源文件和序列化进行配置。

2.2 spring native hints

spring native开放了很多的hints,用于对native image不支持的动态代理、反射、资源文件等进行配置。主要的hints如下图:

这些 hits 会将我们自定义的配置生成到proxy-config.json、reflect-config.json、resource-config.json、serialization-config.json中。

三、mica 的适配

本节文章拿mica的部分组件作为示例,来介绍spring native hints的使用。

3.1 mica-ip2region

mica-ip2region中涉及到一个 ip 地址信息的ip2region.db文件,所以我们需要自定义资源文件的配置。

首先给mica-ip2region添加spring-native依赖。

  1.  
  2.     org.springframework.experimental 
  3.     spring-native 
  4.     ${spring-native.version} 
  5.     provided 
  6.  

 

然后在Ip2regionConfiguration代码中添加NativeHint注解配置ip2region.db资源文件。

  1. @Configuration(proxyBeanMethods = false
  2. @EnableConfigurationProperties(Ip2regionProperties.class) 
  3. @NativeHint(resources = @ResourceHint(patterns = "^ip2region/ip2region.db")) 
  4. public class Ip2regionConfiguration { 
  5.    @Bean 
  6.    public Ip2regionSearcher ip2regionSearcher(ResourceLoader resourceLoader, 
  7.                                     Ip2regionProperties properties) { 
  8.       return new Ip2regionSearcherImpl(resourceLoader, properties); 
  9.    } 

再次编译spring native项目(mica-native-test)我们可以看见ip2region.db文件已经添加进resource-config.json。

最后运行项目:

测试mica-ip2region(完美):

3.2 mica-captcha

mica-captcha主要是几个字体文件需要添加下面的配置,具体过程同上这里不做过多描述。

  1. @NativeHint(resources = @ResourceHint(patterns = "^fonts/.*.ttf")) 

注意:由于验证码涉及到字体和 awt 会涉及到下面2个问题。

  1. yum install fontconfig -y && fc-cache --force 

更多详见:https://github.com/oracle/graal/issues/817

具体详见:https://github.com/oracle/graal/issues/2842

3.3 mica-caffeine

由于caffeine中使用了不少的unsafe,所以添加了 mica-caffeine 依赖之后,mica-native-test能启动成功都折腾了我很长时间。各种报错,不过都有提示,我们可以按照提示添加Hints,如下图:

image.png

在添加下面这么多Hints之后终于可以启动成功了!!!

  1. @NativeHint(types = { 
  2.    @TypeHint(types = CaffeineAutoCacheManager.class, access = AccessBits.ALL), 
  3.    @TypeHint(types = CaffeineCacheManager.class, access = AccessBits.ALL), 
  4.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.UnsafeAccess"
  5.       fields = @FieldHint(name = "UNSAFE", allowUnsafeAccess = true), 
  6.       access = AccessBits.PUBLIC_METHODS 
  7.    ), 
  8.    @TypeHint(types = Thread.class, access = AccessBits.DECLARED_FIELDS), 
  9.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.PS"
  10.       fields = { 
  11.          @FieldHint(name = "key", allowUnsafeAccess = true), 
  12.          @FieldHint(name = "value", allowUnsafeAccess = true
  13.       }, 
  14.       access = AccessBits.DECLARED_CONSTRUCTORS 
  15.    ), 
  16.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.PSA"
  17.       fields = @FieldHint(name = "accessTime", allowUnsafeAccess = true), 
  18.       access = AccessBits.DECLARED_CONSTRUCTORS 
  19.    ), 
  20.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.PSW"
  21.       fields = @FieldHint(name = "writeTime", allowUnsafeAccess = true), 
  22.       access = AccessBits.DECLARED_CONSTRUCTORS 
  23.    ), 
  24.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.StripedBuffer"
  25.       fields = {@FieldHint(name = "tableBusy", allowUnsafeAccess = true)}, 
  26.       access = AccessBits.ALL 
  27.    ), 
  28.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.PSWMS", access = AccessBits.DECLARED_CONSTRUCTORS), 
  29.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.SSA", access = AccessBits.ALL), 
  30.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.SSLA", access = AccessBits.DECLARED_CONSTRUCTORS), 
  31.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.SSLMSW", access = AccessBits.DECLARED_CONSTRUCTORS), 
  32.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.SSMSW", access = AccessBits.DECLARED_CONSTRUCTORS), 
  33.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.BoundedBuffer", access = AccessBits.ALL), 
  34.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.BoundedBuffer$RingBuffer", access = AccessBits.ALL), 
  35.    @TypeHint(typeNames = "com.github.benmanes.caffeine.cache.BLCHeader$DrainStatusRef"
  36.       fields = @FieldHint(name = "drainStatus", allowUnsafeAccess = true), 
  37.       access = AccessBits.ALL 
  38.    ) 
  39. }) 

喜大普奔,可以了???真的吗???caffeinecache 读取缓存又开始报异常了!!!

至此再也不想折腾了,周末的上午全在折腾这玩意了。

四、总结

 

spring-native目前还是处于孵化阶段,如果是未使用第三方组件简单的项目大家可以试试,稍大型建议大家还是再等等。我们也会持续关注并输出相关文章。

【责任编辑:武晓燕 TEL:(010)68476606】

 

来源: JAVA架构日记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯