在 Dubbo 的核心领域模型中:
Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。
Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠拢,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
Invocation 是会话域,它持有调用过程中的变量,比如方法名,参数等

三个核心中心化组件


1 |
|
1 |
|
1 |
|
@ModelAttribute
- 修改 Model 参数
@ExceptionHandler
- 处理全局异常
@InitBinder
- 全局参数的绑定
定义了 核心类 ProblemHandling
, 该接口继承了定好的各种异常类型的ExceptionHandler 默认实现
public interface ProblemHandling extends
GeneralAdviceTrait,
HttpAdviceTrait,
IOAdviceTrait,
RoutingAdviceTrait,
SecurityAdviceTrait,
ValidationAdviceTrait {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
* ```java
public interface ProblemAdviceTrait extends AdviceTrait {
@API(status = INTERNAL)
@ExceptionHandler
default ResponseEntity<Problem> handleProblem(
final ThrowableProblem problem,
final NativeWebRequest request) {
return create(problem, request);
}
}
动态可观测线程池框架
Hippo-4J 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。
⚡️ 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等;
…
通过 Spring 的事件机制
NacosRefresherHandler (AbstractCoreThreadPoolDynamicRefresh
) 使用 Spring Bean 生命周期的钩子方法 afterPropertiesSet 添加 nacos(configServer
) 配置 Nacos 变更的监听器 -> Web容器线程池(TomcatWebThreadPoolHandler)/ThreadPoolExecutor 参数变更 发布事件 Hippo4jCoreDynamicRefreshEvent
, 由监听器 WebExecutorListener
/ExecutorsListener
监听事件,获取 Spring BeanFactory 中对应线程池实例 修改参数
DynamicThreadPoolPostProcessor
, postProcessAfterInitialization 生命周期方法向全局线程池管理工具 GlobalThreadPoolManage
和全局线程池核心参数配置 GlobalCoreThreadPoolManage
注册 对应的线程池 和 线程池参数,后续修改参数直接通过 poolId 拿取对应实例进行修改参数DynamicThreadPoolCoreAutoConfiguration
, @ConditionalOnBean(MarkerConfiguration.Marker.class)
通过 ConditionalOnBean 主键实现开关式引入Hippo4j,@EnableDynamicThreadPool 通过 @Import({BeforeCheckConfiguration.class, MarkerConfiguration.class})
导入 MarkerConfiguration 开关标志类ConfigParserHandler
-> ConfigParser
1 |
|
SPI
扩展机制来提供 ConfigParser
的实现1 |
|
Builder
大家对 DDD 应该都不陌生了,或多或少都听说过一点,我这里记录一些平常了解学习到关于 DDD 优秀的设计思想
简单说,就是应用不要直接依赖外域的信息,要把外域的信息转换成自己领域上下文(Context)的实体再去使用,从而实现本域和外部依赖的解耦。
平常我们在代码 Coding 运用的一些设计模式,类似 门面模式 都跟防腐层的思想很像
之前我们项目中在权限设计这块也借鉴了防腐层的思想,公司权限系统定义了三个模型:Group、Role、Function,系统在设计按钮功能权限,最初想的直接跟 Role 关联,类似 Save 按钮 开发,测试能够操作,接口设计上 校验 Dev-Role 和 Test-Role 。这样设计有个缺点便是 Save 按钮的权限一旦变更,就需要修改代码,如果我们使用 Function 承担我们系统这个功能的防腐层,则改动就很轻量。上面那个例子,我们定义一个 Save_Function ,它关联了 Dev-Role Test -Role 角色,变更成 TPM - Role ,我们只需要在公司权限管理系统修改 Function 关联关系就可以。
是一种设计模式。DDD 中经常被用于分离领域模型命令修改功能与查询功能。
在这一基础是上分析微服务的拆分,目前大型分布式系统,存在业务复杂、数据结构复杂。在富查询面前既要满足服务之间的隔离,又要满足查询功能的全面。为了不污染 DDD 模型保持其干净,
所以单独出来做查询服务。
1 |
|