Soul源码分析 —— 可以复用的代码技巧

    • 对bean的操作
    • 设计模式的使用
    • 线程池
      • 线程池线程数
      • 拒绝策略
    • SPI 加载工厂
      • java spi应用
      • 自己实现spi
    • Soul-common模块里所有工具代码
  • 未完待续

对bean的操作

更灵活的生成bean和排序

@ConditionalOnProperty(name = "soul.cross.enabled", havingValue = "true")@Order(-100)@ConditionalOnMissingBean(value = SoulResult.class, search = SearchStrategy.ALL)@ConditionalOnClass(AlibabaDubboPlugin.class)

用Util类获取bean

    @Beanpublic ApplicationContextAware applicationContextAware() {return new SoulApplicationContextAware();}/*** The type Soul application context aware.*/public static class SoulApplicationContextAware implements ApplicationContextAware {@Overridepublic void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {SpringBeanUtils.getInstance().setCfgContext((ConfigurableApplicationContext) applicationContext);             }}
public final class SpringBeanUtils {private static final SpringBeanUtils INSTANCE = new SpringBeanUtils();private ConfigurableApplicationContext cfgContext;private SpringBeanUtils() {}public static SpringBeanUtils getInstance() {return INSTANCE;}public <T> T getBean(final Class<T> type) {return cfgContext.getBean(type);}public void setCfgContext(final ConfigurableApplicationContext cfgContext) {this.cfgContext = cfgContext;}
}

设计模式的使用

单例懒汉模式

public final class MetricsTrackerHandler {public static MetricsTrackerHandler getInstance() {return MetricsTrackerHandlerHolder.INSTANCE;}private static class MetricsTrackerHandlerHolder {private static final MetricsTrackerHandler INSTANCE = new MetricsTrackerHandler();}
}

模版模式和职责链模式

public abstract class AbstractSoulPlugin implements SoulPlugin {protected abstract Mono<Void> doExecute(ServerWebExchange exchange, SoulPluginChain chain, SelectorData selector, RuleData rule);@Overridepublic Mono<Void> execute(final ServerWebExchange exchange, final SoulPluginChain chain) {//省略代码if (Condition) {//必须执行的代码return doExecute(exchange, chain, selectorData, rule);}return execute(exchange)}public class DividePlugin extends AbstractSoulPlugin {protected Mono<Void> doExecute(final ServerWebExchange exchange, final Soul      PluginChain chain, final SelectorData selector, final RuleData rule) {//省略代码return chain.execute(exchange);}
}

线程池

线程池线程数

int threads = Integer.parseInt(System.getProperty("soul.work.threads", "" + Math.max((Runtime.getRuntime().availableProcessors() << 1) + 1, 16)));

拒绝策略

当所有线程都在工作并且队列已满,常见的策略有 (Reject, Caller-Runs, Discard, Discard-Oldest), 这里看到新思路,就是阻塞caller thread.

private static class CallerWaitPolicy implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(final Runnable r, final ThreadPoolExecutor executor) {try {log.warn("queue is full, trigger caller thread : {} wait", Thread.currentThread().getName());executor.getQueue().put(r);} catch (InterruptedException ex) {log.error("InterruptedException, discard {}", r);}}}

SPI 加载工厂

java spi应用

public class SpiLoadFactory {public static <S> S loadFirst(final Class<S> clazz) {final ServiceLoader<S> loader = loadAll(clazz);final Iterator<S> iterator = loader.iterator();if (!iterator.hasNext()) {throw new IllegalStateException(String.format("No implementation defined in /META-INF/services/%s, please check whether the file exists and has the right implementation class!",clazz.getName()));}return iterator.next();} public static <S> ServiceLoader<S> loadAll(final Class<S> clazz) {return ServiceLoader.load(clazz);}
}

自己实现spi

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SPI {String value() default "";
}
@Join
public class SpiExtensionFactory implements ExtensionFactory {@Overridepublic <T> T getExtension(final String key, final Class<T> clazz) {if (clazz.isInterface() && clazz.isAnnotationPresent(SPI.class)) {ExtensionLoader<T> extensionLoader = ExtensionLoader.getExtensionLoader(clazz);return extensionLoader.getDefaultJoin();}return null;}
}
public final class ExtensionLoader<T> {private static final String SOUL_DIRECTORY = "META-INF/soul/";public static <T> ExtensionLoader<T> getExtensionLoader(final Class<T> clazz) {//omited}public T getJoin(final String name) {//omited}private T createExtension(final String name) {//omited}
}
public class LoadBalanceUtils {public static DivideUpstream selector(final List<DivideUpstream> upstreamList, final String algorithm, final String ip) {LoadBalance loadBalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getJoin(algorithm);return loadBalance.select(upstreamList, ip);}}

Soul-common模块里所有工具代码

未完待续

Soul源码分析 ——值得借鉴的代码技巧相关推荐

  1. Soul源码分析–soul-admin入门

    Soul源码分析–soul-admin 运行 使用 原理介绍 总结 运行 上一篇介绍过 soul-admin 启动有两种数据库选择,一种是MySQL, 一种是内存H2数据库.如果本地有MySQL,建议 ...

  2. Soul 源码分析07 SOUL Admin 网关 Http长轮询 数据同步

    SOUL Admin & 网关 Http长轮询 数据同步 书接上回, 使用Http长轮询, 数据同步, soul-admin/src/main/resources/application.ym ...

  3. soul 源码分析 —— 插件解析之monitor插件

    说明 monitor插件是网关用来监控自身运行状态(JVM相关),请求的响应迟延,QPS.TPS等相关metrics. 设计图 使用 后台配置: 在 monitor 插件中新增以下配置 {" ...

  4. Soul 网关源码阅读(二)代码初步运行

    Soul 源码阅读(二)代码初步运行 简介     基于上篇:Soul 源码阅读(一) 概览,这部分跑一下Soul网关的示例 过程记录     现在我们可以根据地图,稍微探索一下周边,摸一摸      ...

  5. SOFA 源码分析 —— 服务发布过程

    前言 SOFA 包含了 RPC 框架,底层通信框架是 bolt ,基于 Netty 4,今天将通过 SOFA-RPC 源码中的例子,看看他是如何发布一个服务的. 示例代码 下面的代码在 com.ali ...

  6. Linux内核 eBPF基础:kprobe原理源码分析:源码分析

    Linux内核 eBPF基础 kprobe原理源码分析:源码分析 荣涛 2021年5月11日 在 <Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用>中已经介绍了kp ...

  7. Fabric源码分析-共识模块

    正好这些天要有一个需求要帮客户魔改Fabric-v0.6,把一些hyperchain的高级特性移植过去,借此机会把之前看过的源码在梳理一下. 下面就是对Fabric共识模块的源码分析和梳理,代码都是以 ...

  8. storm-kafka源码分析

    storm-kafka源码分析 @(KAFKA)[kafka, 大数据, storm] storm-kafka源码分析 一概述 一代码结构 二orgapachestormkafka 三orgapach ...

  9. SRS4.0源码分析-RTMP入口

    本文采用的 SRS 版本是 4.0-b8 , 下载地址:github 上篇文章 <SRS4.0源码分析-main> 讲解了 SRS main 函数的基本流程,但是可能有些朋友还是比较懵逼. ...

最新文章

  1. 00-基于Vue的博客项目展示
  2. react 面试题 高级_高级前端面试题目大全(一)
  3. 揭秘熊猫TV HEVC直播
  4. react hooks使用_何时使用React Suspense和React Hooks
  5. web项目java程序的作用_基础知识(javaWeb工程目录结构)及各文件夹的作用
  6. 本周新出开源计算机视觉代码汇总(含图像超分辨、视频目标分割、行人重识别、点云识别等)...
  7. TensorFlow学习笔记(一)——入门资源整理
  8. oracle实施伙伴,甲骨文推出Oracle合作伙伴网络专属计划
  9. C Programming Style 总结
  10. 【uva12345】Dynamic len
  11. elementui下载到本地
  12. 一封学生来信:突破大学的迷茫
  13. ubantu系统从命令行进入桌面
  14. java检测自身签名_使用签名检测PDF更改
  15. 中国农业银行笔试详解
  16. Golang-Go 开发环境准备(一)
  17. STM32L4+超低功耗单片机介绍,参考手册,培训教程,视频
  18. 唐诗宋词 v1.5 软件下载 诗词库更新时间20090426 唐诗宋词三百首 GCLsoft
  19. 小程序跳转微信支付分流程
  20. Xen安装部署和基本原理

热门文章

  1. YTU OJ 1329: 手机尾号评分
  2. zookeeper之watcher
  3. 早上空腹喝酸奶好吗?
  4. 百度AI攻略:新闻摘要
  5. 做产品路线图规划用什么工具?
  6. 团队项目搜查令更新二
  7. SEO静态页面生成系统
  8. 如何做好SEM竞价营销
  9. 计算机基础教程 试题,《计算机基础教程》考试试题及答案
  10. 大型能源装备制造企业数字化转型实践----工业软件讲坛第八次讲座