【个人开源】Smart Discovery微服务治理框架扩展性设计

619 阅读4分钟

个人其他开源项目,欢迎Github点赞

Smart Discovery简介

概述

  Smart Discovery旨在对SpringCloud服务注册发现功能进行增强,提供一个可基于规则的服务注册发现、路由的智能微服务治理框架,基于此种灵活的规则配置可实现如服务注册校验、分组隔离、权重路由、主机路由、自定义标签路由、动态参数路由、灰度发布、黑白名单等业务场景。同时框架适配了主流的注册中心、配置中心,依托于配置中心的能力实现配置规则的动态下发。

  开发者只需引入此框架,并做少量规则配置即可享受此框架带来的功能,无代码入侵;另外开发者也可以基于框架提供的扩展机制实现自定义的业务逻辑。框架源码详见GitHub地址,更多的信息可以详见 使用文档

扩展性设计

实现原理

从上文可知,Smart Discovery基于统一的规则配置,实现对SpringCloud的服务注册、服务发现、服务路由等各个环节进行扩展增强,并采用Filter责任链模式进行过滤拦截,从而让Smart Discovery具备良好的扩展能力,开发者只需通过实现自定义的过滤器来快速订制业务逻辑。另外,框架默认采用simpleCondition条件规则语言,即一种简易、直观的条件规则表达式(详见条件规则详解章节),对此框架也支持自定义扩展条件规则语言。

扩展性设计.png

自定义扩展

为简化开发者自定义扩展实现,框架采用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上也点个赞哦),这是对我最大的鼓励!