骑士特权基础架构建设

  • 核心技术

        基于开源代码定制化我们自己的组件,完成服务,缓存以及数据库治理的功能,确保对业务代码尽可能的0侵入;

  1. 基于feign源代码定制开发,提供服务治理能力;
  2. 基于spring-data-redis源代码定制开发,提供缓存治理能力;
  3. 基于druid源代码定制开发,提供数据库治理能力;
  4. 基于goinception二次开发,DDL/DML审计平台;
  5. 基于redis-6.2.6二次开发,实现redis服务端慢查询实时全量抓取和预警;
  6. 基于xxl-job-2.0.2进行定制开发,实现了任务管理模块,同时,我们将其也进行了开源:任务调度系统
  • 背景

        项目启动初期,为了快速满足业务需求,往往忽视了技术架构方面的持续建设。当业务出现爆发式增长,这个时候的技术架构无法支撑业务的增长,经常性的会出现服务端宕机,这是创业项目的常态;这个时候,我们最先想到的是做系统重构,重构的成本是相当高的,而且推动起来也是非常困难的,对综合能力要求很高,比如技术本身,跨团队推动力和团队执行力;我曾经参与过1500w日活的电商平台重构,基于这几年的重构经验,也经历过业务快速膨胀,平稳再到萎缩的几个不同的阶段,不同的阶段应该使用怎样的架构也有一些积累。

        我们的老项目采用springcloud全家桶实现服务的治理,使用Apollo作为配置中心,使用xxl-job作为任务调度等等,在项目启动阶段,为了快速上线,倾向使用开源框架搭建系统,快速满足业务需求;这种框架,对于绝大部分程序员来说只会用,一旦出了问题是非常被动的;随着业务的发展,量级上到另一个层次之后,我们需要考虑系统的可维护性,数据的安全以及系统稳定性,开源系统很难去做一些定制化的开发满足每家公司个性化的需求;在某种程度上需要升级底层架构确保系统更加稳定,可维护性更强以及便于和我们内部流程和系统进行集成;举个简单的例子,我们需要将线上配置变更和公司内部审批工作流程以及告警系统结合在一起;服务出了问题,能否及时告警,快速定位和恢复等等;

        基于目前的情况以及发展阶段,我们决定自研基础平台Venus,它包括几大模块:服务治理,缓存治理,数据治理,配置管理,权限管理,任务调度和监控大屏;我们是想通过这套系统替换掉erueka,apollo,springboot-admin以及xxl-job等开源系统,对springclod全家桶进行瘦身,同时增加缓存治理,数据治理以及权限的统一管理的能力;

  • 解决方案

        服务治理,我们采用了一种轻量级的方式,基于现有springcloud的生态,对Feign Client做了定制化开发,结合我们自研的服务注册中心以及配置中心,同时配合阿里云的AHAS对服务化体系进行微改造提升服务稳定性以及后期的可维护性;当服务启动的时候,会向我们自研的服务注册中心进行注册,以下展示的是服务列表;

我们也可以查看到每个JVM进程环境变量;

以下是AHAS的流量监控和降级配置页面;

        老项目使用了Feign配合eureka做服务的注册发现以及调用,项目的前期都是拿来主义,能用就行;上面堆积了大量的业务代码,基础架构的升级希望对业务的影响达到最小化,我们在底层对Feign进行了功能增强,开发了相应的组件,只需要增加一个依赖包即可;类似于使用Feign的feign-httpclient/feign-okhttp等组件;服务启动的时候会自动向注册中心进行注册,维护心跳,定时下发可用的ip列表到客户端用于报文的路由,对异常节点进行自动摘流和告警等等;

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-marshttpclient</artifactId>
    <version>9.5.0</version>
</dependency>

在properties文件中配置

feign.httpclient.enabled=true

feign-core是没有任何改动的,所以在用户使用上是基本上无感知的;feign-marshttpclient组件保证报文的路由以及同配置注册中心保持数据同步/交互;在使用上唯一不一样的是,@FeignClient注解的url属性格式:schema://service-name/method;通过服务名进行服务调用;

@FeignClient(name = "message-center-statis-service" , url = "http://message-center-statis-service/service/monitor")
public interface FeignTestService {
	@RequestMapping(value = "/get_ips_by_service")
    public String testGet(@RequestParam("service") String service);
}

        配置管理再此之前,我们使用了apollo作为配置中心,目前,我们自研了配置管理模块,支持:

@Value

@CfgCenterBooleanValue

 @CfgCenterIntegerValue

 @CfgCenterDoubleValue

 @CfgCenterStringValue

@CfgCenterLongValue

使用方面,只需要构建一个配置类即可;  我们增加了权限的管控和审批环节,使得配置的生产变更的可控性更强;

 如果使用@Value注解,使用方式和apollo一致,在本地增加配置,读取顺序,本地保持和apollo一致,如果远程有配置就以远程的为准;

按照名字空间+服务名进行配置管理;

 配置审核,配置的版本管理,提供一键回滚到指定版本的功能;

配置变更的日志记录,便于追溯;

配置变更审核微信机器人;

         服务监控,当服务发生异常时,通过配置好的微信群和短信系统实现告警;目前能区分异常包括:心跳检测异常,数据库访问异常,缓存访问异常,接口调用异常和业务自定义异常;通过推送到微信群告警;只需要业务代码中实现下面的类即可;

// 步骤1: 加上@ServiceCheck注解,注解参数分别为服务名和服务描述,此注解已继承spring的@component,因此Bean可以直接被spring管理
@ServiceCheck(service = "${project.service}" , description = "${project.desc}")
// 步骤2: 实现ServiceMonitorChecker接口
public class MessageCenterApnsLogMonitor implements ServiceMonitorChecker {
     
    private static Logger logger = LoggerFactory.getLogger(MessageCenterApnsLogMonitor.class);
     
    @Autowired
    private MessageCenterConsumerApnsLogStatis messageCenterConsumerApnsLogStatis;
     
    @Autowired
    private MessageCenterConsumerPushApnsMapper messageCenterConsumerPushApnsMapper;
 
    //步骤3:实现接口里的check方法,返回对象为ServiceCheckResult, 对象里包括一个error code和一个错误详情描述,
    //error code在ServiceMonitorCheckerErrorCode没有定义的时候可以自定义int类型的数字返回。error code定义请参见附表;
    @Override
    public ServiceCheckResult check() {    
        ServiceCheckResult result = new ServiceCheckResult();
        try {
            messageCenterConsumerApnsLogStatis.keepAlive();
        } catch (Exception e) {
            logger.info("REDIS异常 {}" , e.getMessage());
             
            result.setErrorCode(ServiceMonitorCheckerErrorCode.SERVICE_MONITOR_ERR_CODE_REDIS_ERROR);
            result.setExtraInfo(e.getMessage());
             
            return result;
        }
         
        try {
            messageCenterConsumerPushApnsMapper.keepAlive();
        } catch (Exception e) {
            logger.info("数据库异常 {}" , e.getMessage());
             
            result.setErrorCode(ServiceMonitorCheckerErrorCode.SERVICE_MONITOR_ERR_CODE_DB_ERROR);
            result.setExtraInfo(e.getMessage());
             
            return result;
        }
         
        result.setErrorCode(ServiceMonitorCheckerErrorCode.SERVICE_MONITOR_ERR_CODE_SUCCESS);
         
        return result;
    }
}

在Venus上可以很方便的连接到某个服务或者某台机器的监控数据;

        线上压测,也会在此架构基础上实现线上导流压测,通过从我们自研的服务注册和配置中心动态下发分流方案给到调用端(Customized Feign Client),将流量导向几台或者1台服务器,通过压测单机后者某几台机器评估集群性能容量,当CPU或者target QPS达到,自动生成测试报告,为各种运营活动和促销活动提供容量评估的参考;

        缓存治理,我们的缓存,要求开发统一使用reds(主从或集群模式),我们针对spring-data-redis这个组件修改源代码做了定制化,开发了我们自己的venus-spring-data-redis;对于使用者来说,所有访问redis的连接配置以及链接池配置都将在Venus上面完成,客户端启动的时候会从Venus自动获取配置进行初始化连接;如果发现慢查询,大Key,Hot Key,都将触发告警,并投递到告警微信群,同时提供本地缓存进行降级,防止Redis的CPU负载过高;venus-spring-data-redis会定时触发到redis的心跳,发现异常也将触发告警。对于小型业务,我们往往是很多服务公用一套redis缓存,这个时候,我们也必须能够提供可视化的能力,将服务和redis进行可视化关联,单个redis实例进行逻辑分区管理;

缓存全局图谱;

缓存客户端维度的流量监控;

 缓存客户端配置

 

在组件使用方面,只需要使用新的JedisConnectionFactory创建连接工厂即可,其他和使用spring-data-redis一样,尽可能的对代码无侵入;

@Configuration
public class DynamicRedisTemplate {
	
	@Bean
	public RedisConnectionFactory redisConnectionFactory() {
		// 定制化连接工厂类,传入在Venus平台申请的Key,通过这个Key从Venus获取Redis的所有配置;
		return new VenusJedisConnectionFactory("d99041b344cb03e063c36f79c75bcb50");
	}
}

        任务管理,该模块对xxl-job的管理端做了重构,客户端维持不变,这样对业务的侵入是0,我们抓包研究了xxl-job的协议格式,对xxl-job的协议重新实现了,并且在管理端加强了权限控制;

常规的监控数据展示:

任务配置

执行器配置

日志

        权限管理,我们会对公司内部所有管理系统进行统一的权限申请,审批以及配置;权限包括,用户,菜单和角色的统一控制;

        数据安全,我们对数据库中的数据做了分级处理,处于安全性以及合规性考虑;

        SQL在线审计,自研SQL审计平台,帮助开发提前发现慢查询;基于goinception的DDL/DML审核模块;

数据访问,我们定制化开发了druid数据库连接池组件,经过我们调研团队中大部分项目使用的是druid1.1.6这个版本,我们基于这个版本做了定制化开发,所有数据库和连接池的配置从Venus获取,不再从本地获取,实现配置统一管理;

 同时,venus-druid连接池,定时上报连接池的状态数据,如果出现异常,将会推动微信群告警,将应用和数据库的连接关系可视化;

点击某台服务器,可以展示,该服务器连接池的状态数据;

venus-druid会在客户端抓取慢查询,并将慢查询上报到Venus和微信群;

如何使用venus-druid,只需要在代码中进行配置类的编写即可;

监控大屏幕,提供APP客户端调用接口监控,生产发布监控和服务端监控;当发生严重错误的时候,设备会发出告警的声音,同时也会推送微信告警群;

  • 相关代码

Customized feign: feign

Customized venus-spring-data-redis: venus-spring-data-redis-2.5.6

Customized venus-druid: venus-druid-1.1.6

Customized venus-redis: venus-redis-6.2.6

Configuration Center Client: venus-cfg-client

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值