起始原因 是 我们公司 分布式事务 使用的是 seate 分布式事务框架,现在只在一些小部分使用,因为考虑到seate 对性能 TCP的影响,对事务这块没有更多的选择。我就在想 是不是做一个 微服务 编排框架 来解决这个问题。这里就
微服务编排框架 开发背景
@Component
public class AProcessorDemo extends RollbackProcessor {
@Override
protected void processInternal(ProcessContext context) {
System.out.println("a RollBackProcessor " + context.get("id"));
}
@Override
protected void rollback(ProcessContext context) {
System.out.println("a rollback RollBackProcessor " + context.get("id"));
}
}
@Component
public class AProcessorDemo {
@Processor(name="a")
protected void processInternal(ProcessContext context) {
System.out.println("a RollBackProcessor " + context.get("id"));
}
@ProcessoRrollback(name="a")
protected void rollback(ProcessContext context) {
System.out.println("a rollback RollBackProcessor " + context.get("id"));
}
}
代码实现上都可以实现,
选择接口方式 缺点
选择 注解方式
我感觉还是先按照 接口方式写,之前代码不动,只是新的业务才这么写,让结构清晰,增强抽象的能力。 之后可以用mapStruct 方式优化
张小龙说的为客户/用户考虑, 到我们这 就是为了开发人员考虑。这样能节省 业务开发的改动量
有@FeignClient(name = "provider"),其实不就是 根据注解添加代理么?和我们一样的功能,是不是可以借鉴下,其实还是反射 拿值 做响应的对应
上生产,通过阿里云监控平台看,8g内存的机器 tps 到200 就会显示卡在这个BeanUtils 方法上
替换 BeanUtils 复制属性的新组件,用 生成代理类,set方法赋值 来替换了反射的方式 提升性能,减小内存的使用。这种 也是可以的
我们平时学习 学一个技术,其实了解其原理是为了 自己写组件的时候 ,能用上他们的思路和技术 来达到我们的目的。 我个人不是很排斥学习 八股文,可以学到很多的思路 是我们能用上的 。但是面试官 别光考八股文
feign 可能是前面第一版会用,等后面的mapStruct demo写完了 我就升级下版本,让测试同学帮忙测试下,然后换jar 版本呗
说实话 其实我对这种换jar包的方式 还是比较方案的,之前我都是这么干,但是涉及到改动的地方太多,我现在会从K8s 下手,直接挂 agent,不影响业务系统
两个都分析下吧
主要看 FeignClientsRegistrar registerFeignClients 方法中
BeanDefinition candidateComponent = (BeanDefinition)var21.next();
if (candidateComponent instanceof AnnotatedBeanDefinition) {
AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition)candidateComponent;
AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");
Map attributes = annotationMetadata.getAnnotationAttributes(FeignClient.class.getCanonicalName());
String name = this.getClientName(attributes);
//注册client 配置到spring 容器
this.registerClientConfiguration(registry, name, attributes.get("configuration"));
//注册动态代理类到 spring 容器
this.registerFeignClient(registry, annotationMetadata, attributes);
}
先实现一个 简易的微服务 编排框架 然后 mapStruct 组件画图,然后写一个demo 升级版本 兼容接口 和 注解 两种方式