Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何接手并维护一个项目

如何接手并维护一个项目

原创
作者头像
Meng小羽
发布于 2024-02-24 12:38:08
发布于 2024-02-24 12:38:08
3010
举报
文章被收录于专栏:Debug客栈Debug客栈

在工作中,接手负责管理别人开发或者前人开发的项目是每个开发人员的工作任务之一,那么,如何快速并且高效的消化接手过来的项目呢,本文主要讲解一些方法与实践技巧,希望可以帮助你快速了解你接手的项目。

系统文档

若是有最开始的包括后续优化的相关技术文档或者系统文档,对于接手过来的项目无疑是最有助于开发人员的方式。但是大家会发现往往接手过来的项目是没有这一类的文档的,交接过来的系统若是对开发有极高追求的,一般都会有文档,并且 README.md 中会有项目介绍包括相关文档,但是...... 往往我们拿到手的系统是纯代码,README.md 可能都没有这个文件,这种往往是最痛苦的,不过也是最锻炼梳理系统这项技能的。

那么我们就需要从下面这几个点来慢慢消化系统。

系统权限

交接过来的系统,一定要开好对应的权限,这对你全面了解系统以及后续维护系统有着至关重要的的作用,若没有权限,当系统出现问题时,领导找到你问问题原因,而你却在向领导申请权限,世纪名场面。

以下是常见的系统权限:

  • Gitlab 仓库权限;
  • Deploy 部署系统权限;
  • Log 日志系统权限;
  • Data 数据库管理系统权限;
  • Alert 系统报警配置权限;
  • Crond 任务调度器权限;
  • Middleware 根据不同系统的中间件权限,包括不限于 Notify、RocketMQ、Redis 等;
  • Auth 依赖系统授权信息权限;
  • Test 测试平台的权限;
  • API API 调试平台的权限;
  • Sys 系统相关注册管理权限;

接手项目,开启权限是第一步也是必须要做的事情。

配置文件

通过配置文件可以看到一个系统的基本信息,比如说:

  • 系统环境配置信息、注册信息、协议相关信息;
  • 系统使用数据库配置信息;
  • 系统使用 Redis 等中间件配置信息;
  • 业务上使用的一些值定义;

库表设计

一般数据库表设计会存放在 dao 模块或者目录下,基本上是一表一文件定义,可以看到表定义的字段,并且可以看到对该表的一些“增删查改”动作。

若是底层系统设计,本身系统就是只提供给外部服务使用的,那么从数据库库表设计基本上就可以反推业务逻辑的设计,删除、更新、新增都是基本的业务逻辑动作,查询或者组合成事务的业务相对来说比较复杂,不过根据业务代码看着理解的话也比较简单一些。

缓存设计

缓存一般有两种,分别是:

  • 被动缓存:一般是用于高并发场景,用于缓解下游中间件或者接口的瞬时压力;
  • 主动缓存:这种是相对高级的缓存策略,用于分布式数据一致数据的返回;

分析刚接手的系统,从 cacheKey 就可以了解业务系统中为什么这样设计的:

代码语言:shell
AI代码解释
复制
product.info.pid.XXXX

上面这个例子可以看到记录的是一个产品 pid 为 XXXX 的缓存信息。

协议文件

若是接手过来的系统按照语义命名及划分路由的话,则通过 API 接口文档来看是一个很好的方式,因为通过 API 基本可以确定接手过来的服务有哪些业务,针对不同的业务又有哪些操作。

针对不同的语言、不同的协议,也有一些细微的差别:

Java Dubbo 协议

一般 Java Dubbo 协议都是对外提供 API 模块的 pom 依赖的,声明都是使用接口来实现的:

代码语言:java
AI代码解释
复制
// XXXX 业务模块
public interface XXXX {
    // 获取列表
    Result<DataA> getXXXList(Context ctx, XXRequest req);
    // 获取列表 基于 uid 
    Result<DataA> getXXXListByUid(Context ctx, XXRequest req);
    // 基于 uid 删除 XX 信息
    Result<Boolean> delXXInfoByUid(Context ctx, XXRequest req);
}

Go Thrift 协议

Go Thrift 是使用 IDL 语言定义的协议,我们会基于 IDL 声明的接口,定义好接口出入参生成的 SDK 文件,通过看 IDL 定义的接口,就可以了解到接手的项目提供了哪些功能了:

代码语言:thrift
AI代码解释
复制
struct XXOrderResponse {
    1:i64 orderId,
    2:string orderInfo;
}

struct XXOrderRequest {
    1:i64 orderId (go.tag = "json:\"order_id\""),
}

// 接口定义
service OrderService {
    // XX 订单
	XXOrderResponse XXOrderInfo(1:XXOrderRequest params)
}

Go HTTP 协议

目前公司使用居多的 HTTP 框架是 iris 还有一个自研的 migo 框架(基于 beego 框架开发),都有一个相似的特点,就是会把 router 单独定一个文件,即 router.go :

代码语言:go
AI代码解释
复制
// Init _
func Init(app *iris.Application) {

	app.Use(middlewares.RecoveryMiddle)
	app.Use(middlewares.PromeMiddle)
	app.Use(middlewares.LoggerMiddle())      // 小心打日志的配置
	app.Use(innermiddle.CrossOrigin)         // 是否使用跨域
	app.Use(middlewares.RateLimitMiddleWare) // 配置限流

	app.PartyFunc("/product", cproduct.Register)

	return
}

编程语言

从依赖方去挖掘系统,看系统依赖了哪些业务方,也可以看出系统依赖了哪些基础包,还可以看到依赖的包对应版本(有经验的人可以看出是否有 bug )。

Java Maven

目前 Java 主流的依赖方式就是使用 Maven POM 定义依赖并管理依赖:

代码语言:xml
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>product</artifactId>
        <groupId>cn.debuginn.blog</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>product-server</artifactId>

    <dependencies>
        <dependency>
            <groupId>cn.debuginn.blog</groupId>
            <artifactId>product-api</artifactId>
            <version>${product-api-version}</version>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>

Go Module

目前 Go 语言也是大一统到 go mod 管理版本依赖了,由于 Go 是源码依赖,使用 go mod tidy 之后就可以通过点击依赖仓库来看源码了:

代码语言:go
AI代码解释
复制
module github.com/debuginn/go-demo

go 1.20

require (
	github.com/dubbogo/gost v1.11.25 // indirect
	github.com/go-playground/validator/v10 v10.10.1
	github.com/go-redis/redis/v8 v8.11.0
	github.com/gobwas/ws v1.0.3 // indirect
)

流程图、泳道图

通过上述方式与方法,最后就可以根据业务代码,画出业务流程图及对应的泳道了,同时,也可以基于依赖关系,画出系统的架构图,梳理一个系统的最好方式就是有所沉淀,通过读代码把代码转化为文档的方式即可以对消化的系统有所输出,又可以提升自己的技术能力。

写在最后

最后,一个好的系统,是由系统设计文档、代码、注释和覆盖率尽可能全面的测试用例组成的,很多情况下大家由于不可抗拒的原因,最后只留下了运行的代码,这也是撰写本文的主要原因,希望对大家有所帮助,最后大家有什么好的方式和方法也可以在评论区分享出来,让我们一起变得更强。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
入门微服务架构设计:由下单场景实现服务注册、发现以及调用
这里推荐一篇Java 异常的文章:Java程序员必备:深入剖析Java异常体系的核心架构 文章列总结Java异常的几种分类、举例使用方法以及常见应用场景,总结分析优缺点、最后设计异常工具类的最佳实践
菜菜的后端私房菜
2024/11/14
770
打包部署微服务项目
随着 Spring Boot、Spring Cloud 的流行,越来越多的公司和企业开始使用微服务分布式架构,大家也都在学习相关知识;在自己做项目的时候,面对庞大的项目文件和繁杂的逻辑关系,有些同学就不知如何部署自己的项目了,下面我将介绍通用型的微服务项目部署方式。
wsuo
2021/06/17
1.9K0
打包部署微服务项目
Spring Security项目构建(一)
源码地址 Github 项目构建 [image.png] 依赖关系 [image.png] 代码结构 security:主模块 security-core:核心业务逻辑 security-browse
楠楠
2018/08/29
4110
最详细的 Spring Boot 多模块开发与排坑指南
创建一个 SpringBoot 项目非常的简单,简单到这里根本不用再提。你可以在使用 IDEA 新建项目时直接选择 Spring Initlalize 创建一个 Spring Boot 项目,也可以使用 Spring 官方提供的 Spring Boot 项目生成页面得到一个项目。
未读代码
2020/03/25
8.6K0
cloud Alibaba电商项目系列:架构演进,了解领域驱动设计,项目公共模块编写
优点,有入口鉴权,功能分布细化,性能卓越 缺点, 项目复杂难度,信息暴露,复杂链路等各种问题
冷环渊
2021/12/03
3710
cloud Alibaba电商项目系列:架构演进,了解领域驱动设计,项目公共模块编写
5分钟搭建git-maven-ssm项目实战(一)
一般来说crm模块包括(客户管理、销售管理、客户服务管理、市场营销管理、综合管理、客户自助查询、知识库管理、系统权限管理
用户5224393
2019/08/13
1.4K0
5分钟搭建git-maven-ssm项目实战(一)
项目管理构建工具——Maven(高阶篇)
Maven作为我们项目管理构建的常用工具,具备许多功能,在这篇文章中我们来仔细介绍
秋落雨微凉
2022/10/25
1.4K0
项目管理构建工具——Maven(高阶篇)
大数据技术之_24_电影推荐系统项目_08_项目总结及补充
一 数据加载服务1、目标2、步骤二 离线推荐服务2.1 基于统计性算法1、目标2、步骤2.2 基于隐语义模型(LFM)的协同过滤推荐算法(ALS)1、目标2、步骤2.3 基于 ElasticSearch 的内容推荐算法1、目标2、步骤2.4 基于内容的推荐服务--电影标签三 实时推荐服务3.1 推荐算法解析3.2 实时推荐算法的实现过程3.3 日志的预处理四 综合业务服务4.1 后台架构4.2 Spring 框架搭建4.3 API 接口规划五 用户可视化服务5.1 前端框架搭建5.2 创建与运行项目5.2.1 创建项目骨架5.2.2 添加项目依赖5.2.3 创建模块、组件与服务5.2.4 调试项目5.2.5 发布项目六 项目重构6.1 核心模型提取6.2 通过配置的方式来获取硬编码的值6.3 项目打包6.3.1 AngularJS 前端文件打包6.3.2 businessServer 下的 java web 项目的打包方式6.3.3 核心模型 项目的打包方式6.3.4 recommender 下的后端文件打包方式6.4 系统部署
黑泽君
2019/05/26
2.6K0
如何将一个 Dubbo 项目改造成一个 Service Mesh 项目?
本篇介绍如何将一个 Dubbo 项目改造成一个 SpringBoot + K8S + Istio 项目的全过程,实现了在不改变 Dubbo 项目整体代码结构的基础上,向 Service Mesh 云原生项目的蜕变。
axlyzhang
2020/05/31
4.2K0
如何将一个 Dubbo 项目改造成一个 Service Mesh 项目?
1-4 云商城项目工程搭建
  因为我们搭建的是微服务项目,所以整体的项目结构会非常的零散。虽然零散但是程序的复用性会非常高,所以首先在划分的时候我们可以将相关的业务服务放置在一个工程结构下。
用户4919348
2021/01/14
8090
1-4 云商城项目工程搭建
商城项目-项目搭建
idea大家可以在我的课前资料中找到。另外,使用帮助大家可以参考课前资料的《idea使用指南.md》
cwl_java
2020/02/11
1.2K0
Eueka注册中心学习!(什么是注册中心,注册中心是什么)
注册中心可以说是微服务架构中的“通讯录”,它记录了服务和服务地址的映射关系.在分布式架构中,服务会注册到这里,当服务需要调用其他服务的时候,就到这里找到服务的地址,进行调用;
默 语
2024/11/20
1350
Eueka注册中心学习!(什么是注册中心,注册中心是什么)
Maven项目管理
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。
用户9645905
2023/11/01
3140
Maven项目管理
乐优项目:项目搭建+统一通用异常处理(一)
后端系统采用前后端分离开发,而且整个后台管理系统就会使用vue.js框架搭建出单页应用(SPA)。
用户4396583
2024/07/29
1290
Maven管理多模块应用
穿越至目录: 从0开始,构建前后端分离应用 对于概念的一些理解 Maven的作用 管理模块之间的依赖:根据业务需求,系统会划分很多模块,这些模块彼此之间存在着依赖关系。比如系统管理模块依赖着文件上传模块,来实现用户头像上传的功能。maven通过配置模块之间的pom依赖 生命周期管理:在web应用中,我们常要进行编译、打包、测试这些环节。在maven的世界里,将这些过程定义为生命周期。maven将这些复杂的过程进行了封装,使用者只需要简单的用鼠标点几下就可以完成项目的构建工作 强大的插件:举一个很常用的插
用户2193479
2018/06/28
1.8K0
SpringCloudAlibaba入门系列(2) - 微服务环境搭建
maven:3.3.9 数据库:MySQL 5.7 持久层: SpingData Jpa 其他: SpringCloud Alibaba 技术栈
兜兜转转
2023/03/08
3160
SpringCloudAlibaba入门系列(2) - 微服务环境搭建
SpringBoot的旅游项目——day01(学习记录附赠源码)
    本项目使用的搭建方式是多模块的搭建方式。我们首先需要在Idea的工作空间中新建一个文件夹,用于存放父目录。
上分如喝水
2021/08/16
9500
SpringBoot的旅游项目——day01(学习记录附赠源码)
微服务环境搭建
在微服务架构中,最常见的场景就是微服务之间的相互调用。我们以电商系统中常见的用户下单为例来 演示微服务的调用:客户向订单微服务发起一个下单的请求,在进行保存订单之前需要调用商品微服务 查询商品的信息。
IT小马哥
2021/02/01
5340
微服务环境搭建
Spring Boot:使用Memcached缓存
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。Memcached基于内存的key-value存储,用来存储小块的任意数据,这些数据可以是数据库调用、API调用或者是页面渲染的结果。通过Memcached缓存数据库查询结果,可以有效地减少数据库访问次数,进而提高动态Web应用的速度。虽然Memcached的守护进程是用C写的,但是客户端可以用任何语言来编写,并通过Memcached协议与守护进程进行通信。
朝雨忆轻尘
2019/07/03
1.7K0
Spring Boot:使用Memcached缓存
Nacos-服务发现与配置管理v1.0
为适应企业的业务发展,提高软件研发的生产力,降低软件研发的成本,软件架构也作了升级和优化,将一个独立 的系统拆分成若干小的服务,每个小服务运行在不同的进程中,服务与服务之间采用RESTful、RPC等协议传输数据,每个服务所拥有的功能具有独立性强的特点,这样的设计就实现了单个服务的高内聚,服务与服务之间的低耦 合效果,这些小服务就是微服务,基于这种方法设计的系统架构即微服务架构。
张哥编程
2024/12/07
3600
相关推荐
入门微服务架构设计:由下单场景实现服务注册、发现以及调用
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档