有些场景下如icmp使用 JAVA 开发还是比较麻烦的,如果可以使用golang语言类库提供的能力那就比较方便,开发起来也比较轻松了。这里使用jdk19快要正式发布的foreign function代码实现,以prometheus blackbox exporter为例进行说明。
需求大概是这样,要做一个监控,主体或者是关键特性需要使用java实现,但 ping 功能希望使用blackbox exporter来实现,如果是独立运行也是可以,但为了考虑更好的管理,希望将exporter编译成动态链接库集成到JAVA中来使用,这样两者就充分融合了。
实现方式是这样
1、 git 下载
1、需要安装golangci-lint
2、 linux 下安装yum group install “Development Tools”,windows下安装cygwin64,构选developmenet包进行安装
3、进入目录运行make初始化生成文件
4、修改main.go文件,使其可以输出动态链接库
import “C”
// export DoMain
func DoMain() {
args := [1]string{“javaw.exe”}
os.Args = args[:]
main()
}
6、 编译生成动态链接库
go build -ldflags ‘-w -s’ -buildmode=c-shared -o blackbox.dll
7、使用jextacter辅助生成调用方法
首先下载
使用方法来创建类文件
jextract –source -l blackbox -t github.com.prometheus.blackboxexporter blackbox.h
8、使用JAVA调用
将jextact生成的文件放入项目中,使用下面的测试代码进行测试
package github.com.prometheus.blackboxexporter;
import static github.com.prometheus.blackboxexporter.blackbox_h.*;
import static org. junit .Assert.*;
import java.lang.foreign.MemorySession;
import org.junit.Test;
public class BlackboxTest {
@Test
public void testBlackbox() {
try (var session = MemorySession.openConfined()) {
DoMain();
}
}
}