个人其他开源项目,欢迎Github点赞
- Dataroad:基于Flink的分布式离线/实时数据ETL工具,Github地址
- Smart Discovery:一款基于SpringCloud Discovery深度扩展的微服务治理框架,Github地址
Smart Discovery简介
概述
Smart Discovery旨在对SpringCloud服务注册发现功能进行增强,提供一个可基于规则的服务注册发现、路由的智能微服务治理框架,基于此种灵活的规则配置可实现如服务注册校验、分组隔离、权重路由、主机路由、自定义标签路由、动态参数路由、灰度发布、黑白名单等业务场景。同时框架适配了主流的注册中心、配置中心,依托于配置中心的能力实现配置规则的动态下发。
开发者只需引入此框架,并做少量规则配置即可享受此框架带来的功能,无代码入侵;另外开发者也可以基于框架提供的扩展机制实现自定义的业务逻辑。框架源码详见GitHub地址,更多的信息可以详见 使用文档。
扩展性设计
实现原理
从上文可知,Smart Discovery基于统一的规则配置,实现对SpringCloud的服务注册、服务发现、服务路由等各个环节进行扩展增强,并采用Filter责任链模式进行过滤拦截,从而让Smart Discovery具备良好的扩展能力,开发者只需通过实现自定义的过滤器来快速订制业务逻辑。另外,框架默认采用simpleCondition条件规则语言,即一种简易、直观的条件规则表达式(详见条件规则详解章节),对此框架也支持自定义扩展条件规则语言。
自定义扩展
为简化开发者自定义扩展实现,框架采用Spring Bean方式进行扩展,即开发者只需实现相应的接口,并发布成Spring Bean即可。
服务注册扩展
实现RegisterConditionPredicate接口,并通过apply方法来实现自定义服务注册校验逻辑。同时也可以通过重写getOrder()方法来设定该接口执行的优先级。
@Component
public class CustomRegisterConditionPredicate implements RegisterConditionPredicate {
/**
* 服务注册校验
* @param context 过滤执行上下文,包含 {@link FilterableRegistration}、{@link RuleCacher}、{@link DiscoveryProperties}
* @param server 需要校验的Server
* @return 是否合法
*/
@Override
public boolean apply(FilterContext context, Server server) {
//获取配置规则
List<RegisterRule> registerRules = getConfigRules(context);
return registerRules.stream().allMatch(registerRule->{
// TODO: 实现registerRule规则校验逻辑
return true;
});
}
/**
* 优先级,默认0
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
服务发现扩展
实现RouterConditionPredicate接口,并通过apply方法来实现自定义服务匹配逻辑,从而过滤满足条件的服务方列表。同时也可以通过重写getOrder()方法来设定该接口执行的优先级。
@Component
public class CustomRouterConditionPredicate implements RouterConditionPredicate {
/**
* 判断是否匹配,从而过滤满足条件的服务列表
* @param context 过滤执行上下文,包含 {@link FilterableRegistration}、{@link RuleCacher}、{@link DiscoveryProperties}
* @param server 服务提供方Server
* @return 是否匹配
*/
@Override
public boolean apply(FilterContext context, Server server) {
//获取配置规则
List<RouterRule> routerRules = getConfigRules(context);
return routerRules.stream().allMatch(routerRule->{
// TODO: 实现routerRule规则校验逻辑
return true;
});
}
/**
* 优先级,默认0
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
服务路由扩展
实现DiscoveryConditionFilter接口,并通过doFilter方法来过滤满足条件的服务方列表。同时也可以通过重写getOrder()方法来设定该接口执行的优先级。
@Component
public class CustomDiscoveryConditionFilter implements DiscoveryConditionFilter {
/**
* 过滤服务提供方列表
* @param context 过滤执行上下文,包含 {@link FilterableRegistration}、{@link RuleCacher}、{@link DiscoveryProperties}
* @param servers 服务提供方列表集合
* @return 返回筛选后的服务列表
*/
@Override
public Optional<List<Server>> doFilter(FilterContext context, List<? extends Server> servers) {
List<RouterRule> discoveryRule = getConfigRules(context);
// TODO: 根据规则进行servers列表进行过滤
List filterRouters = servers;
return Optional.of(filterRouters);
}
/**
* 优先级,默认0
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
自定义条件规则
框架默认采用simpleCondition条件规则语言,即一种简易、直观的条件规则表达式(详见条件规则详解章节),对此框架也支持自定义扩展条件规则语言。如下示例演示如何实现自定义groovyCondition条件规则语言。
- 通过实现IConditionFactory接口,并通过如下方法实现自定义的条件规则语言,例如:
@Component
public class CustomConditionFactory implements IConditionFactory {
/**
* 支持的条件表达式语言,见规则配置的language属性,框架默认值为simpleCondition
* @return
*/
@Override
public String support() {
return "groovyCondition";
}
/**
* 实现自定义的IRouter条件路由实现:GroovyConditionRouter
* @param routerEntity
* @return
*/
@Override
public IRouter getRouter(RouterRule routerEntity) {
return new GroovyConditionRouter();
}
/**
* 实现自定义的IMatcher条件匹配实现:GroovyConditionMatcher
* @param baseRule
* @return
*/
@Override
public IMatcher getMatcher(BaseRule baseRule) {
return new GroovyConditionMatcher();
}
}
-
groovyCondition规则配置
如下以服务注册为例,通过指定language语言为groovyCondition,配置如下:
"registers":[ { "conditions": "host=192.168.* & application =^[0-9a-zA-Z-]*$", "enabled" :true, "language":"groovyCondition" } ]
写在最后
Smart Discovery是在总结工作项目中使用SpringCloud遇到的诉求,利用工作之外的业余时间编写的,难免会有些不完善的地方欢迎指正。另外,Smart Discovery框架如果对你有帮助的话也请点个赞(GitHub上也点个赞哦),这是对我最大的鼓励!