spring API扫描插件
1. 简介
本项目是基于gamma的一个插件
本项目是用来扫描一个spring的项目中有多少个Api接口,然后收集
这个API接口的入参/出参信息统计后通过http发送给后端服务
项目地址:
1.1 使用场景
在微服务背景下 服务之间有大量的RPC,那么当下游服务接口更变后没有及时通知
到对应的上游服务,就会导致上游接口报错
那是否可以在CI流水线中采集已经打包好的业务JAR的接口,然后把采集到的信息都统一交给一个服务储存,如果发现有服务的接口发生了变更,将会自动通知对应上游服务
的负责人
那么基于上述场景,本插件的作用就是用于采集接口信息,然后把采集到的信息发送给对应的服务端。
2. 架构设计
本插件将会扫描对应项目里所有的class文件,然后查找对应的springMVC的接口注解
@RequestMapping / @GetMapping / @PostMapping … 等来判断这是不是一个接口
同时,也会去检查对应打了注解的方法的入参、返回值的数据结构状况,来生成一个唯一的hash值,用于标记对应接口是否变更过
这里可以正确解析对应的包装类Optional<User> 以及 List<User>这样的包装类,会去检查User对象的数据结构,而不是外包装类型
当接口入参、返回值 新增、删除、修改字段名称 对应的hash值才会改变,而调整接口字段顺序是不会更变hash值的
如:
public class User {
String name;
int age;
}
public class User {
int age;
String name;
}
上述改变将不会更变hash值
3. 快速使用
在/dist目录下有编译后的插件
或者clone仓库后执行
mvn clean package
后生成对应的插件
放入gamma中执行命令
java -jar gamma-bootstrap.jar source=你要扫描的jar路径
4. 参数配置
提供以下参数
endpoint.topology.host=收集结束后发送给的服务域名(必填)
ref=本次采集的项目分支(必填)
commitId=本次采集的项目的commitId(必填)
appName=应用名称(必填)
5.嵌入式执行
如果不想使用插件这么麻烦,那么可以使用gamma的嵌入执行模式来执行
需要先安装gamma-embed模块
@org.junit.Test
public void test() {
Map<String, String> config = new HashMap<>();
config.put("endpoint.topology.host","127.0.0.1:8080");
config.put("ref","master");
config.put("commitId","1234567");
config.put("appName","1234567");
config.put("scan.package","com.chy,com.chy2,com.example");
GammaContainer gammaContainer =
new GammaContainer("你要扫描的jar路径", config);
gammaContainer.start(new SpringApiScanProcession());
}
6. 接收端
当采集完成后将会发送请求 post ${endpoint.topology.host}/api/signature 到服务端
requestBody
以json的形式发送
@Data
@Builder
public class ProjectApiSignatureFrom {
String commitId;
String appName;
String ref;
List<ApiSignatureFrom> apiSignature;
}
这里 ApiSignatureFrom 中存放了所有接口的信息
@Data
@Builder
public class ApiSignatureFrom {
String methodType;
String url;
String signature;
}
这里的 signature就将是接口的签名了, 是一个 32位的hash值, 如果接口的入参/返回值改变这里将会改变
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)