Soul源码分析 ——值得借鉴的代码技巧
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源码分析 ——值得借鉴的代码技巧相关推荐
- Soul源码分析–soul-admin入门
Soul源码分析–soul-admin 运行 使用 原理介绍 总结 运行 上一篇介绍过 soul-admin 启动有两种数据库选择,一种是MySQL, 一种是内存H2数据库.如果本地有MySQL,建议 ...
- Soul 源码分析07 SOUL Admin 网关 Http长轮询 数据同步
SOUL Admin & 网关 Http长轮询 数据同步 书接上回, 使用Http长轮询, 数据同步, soul-admin/src/main/resources/application.ym ...
- soul 源码分析 —— 插件解析之monitor插件
说明 monitor插件是网关用来监控自身运行状态(JVM相关),请求的响应迟延,QPS.TPS等相关metrics. 设计图 使用 后台配置: 在 monitor 插件中新增以下配置 {" ...
- Soul 网关源码阅读(二)代码初步运行
Soul 源码阅读(二)代码初步运行 简介 基于上篇:Soul 源码阅读(一) 概览,这部分跑一下Soul网关的示例 过程记录 现在我们可以根据地图,稍微探索一下周边,摸一摸 ...
- SOFA 源码分析 —— 服务发布过程
前言 SOFA 包含了 RPC 框架,底层通信框架是 bolt ,基于 Netty 4,今天将通过 SOFA-RPC 源码中的例子,看看他是如何发布一个服务的. 示例代码 下面的代码在 com.ali ...
- Linux内核 eBPF基础:kprobe原理源码分析:源码分析
Linux内核 eBPF基础 kprobe原理源码分析:源码分析 荣涛 2021年5月11日 在 <Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用>中已经介绍了kp ...
- Fabric源码分析-共识模块
正好这些天要有一个需求要帮客户魔改Fabric-v0.6,把一些hyperchain的高级特性移植过去,借此机会把之前看过的源码在梳理一下. 下面就是对Fabric共识模块的源码分析和梳理,代码都是以 ...
- storm-kafka源码分析
storm-kafka源码分析 @(KAFKA)[kafka, 大数据, storm] storm-kafka源码分析 一概述 一代码结构 二orgapachestormkafka 三orgapach ...
- SRS4.0源码分析-RTMP入口
本文采用的 SRS 版本是 4.0-b8 , 下载地址:github 上篇文章 <SRS4.0源码分析-main> 讲解了 SRS main 函数的基本流程,但是可能有些朋友还是比较懵逼. ...
最新文章
- 00-基于Vue的博客项目展示
- react 面试题 高级_高级前端面试题目大全(一)
- 揭秘熊猫TV HEVC直播
- react hooks使用_何时使用React Suspense和React Hooks
- web项目java程序的作用_基础知识(javaWeb工程目录结构)及各文件夹的作用
- 本周新出开源计算机视觉代码汇总(含图像超分辨、视频目标分割、行人重识别、点云识别等)...
- TensorFlow学习笔记(一)——入门资源整理
- oracle实施伙伴,甲骨文推出Oracle合作伙伴网络专属计划
- C Programming Style 总结
- 【uva12345】Dynamic len
- elementui下载到本地
- 一封学生来信:突破大学的迷茫
- ubantu系统从命令行进入桌面
- java检测自身签名_使用签名检测PDF更改
- 中国农业银行笔试详解
- Golang-Go 开发环境准备(一)
- STM32L4+超低功耗单片机介绍,参考手册,培训教程,视频
- 唐诗宋词 v1.5 软件下载 诗词库更新时间20090426 唐诗宋词三百首 GCLsoft
- 小程序跳转微信支付分流程
- Xen安装部署和基本原理