快捷搜索:
您的位置:bv1946伟德入口 > 互联网 > 怎样快速熟悉业务和项目,boot就够了吗

怎样快速熟悉业务和项目,boot就够了吗

2019-11-06 09:19

但很可惜,我没有碰到这样的人,在加入新公司后,带我的人几乎没花时间给我讲项目,也没给我安排可以熟悉项目的任务。

设计

常用对象 service 方法
// 使用对象方法根据主键查询
Xxx xxx = xxxService.selectByPrimaryKey(id);

// 使用对象方法根据 criteria 查询
List<Xxx> list = xxxService.selectByExample(example);

// 方法一:使用对象方法根据 criteria 分页查询(推荐)
PageModel<Xxx> pageModel = xxxService.selectByExampleForOffsetPage(example, offset, limit);
// 方法二:使用对象方法根据criteria分页查询
PageModel<Xxx> pageModel = xxxService.selectByExampleForStartPage(example, pageNum, pageSize);

// 使用对象方法添加
int res = xxxService.insert(record);
int res = xxxService.insertSelective(record);

// 使用对象方法根据主键修改
int res = xxxService.updateByPrimaryKey(record);
int res = xxxService.updateByPrimaryKeySelective(record);

// 使用对象方法根据 criteria 修改
int res = xxxService.updateByExample(record, example);
int res = xxxService.updateByExampleSelective(record, example);

// 使用对象方法根据主键删除
int res = xxxService.deleteByPrimaryKey(productCode);

// 使用对象方法删除根据 criteria 删除
int res = xxxService.deleteByExample(example);

更多方法使用请参考项目中的示例代码

这里关于整理项目部署的机器还有个小插曲,跟大家分享一下。

开发

自定义文件下载后台方法
@RequestMapping("/download")
public ResponseEntity<byte[]> download(String fileName) {
    // 调用父类文件下载方法
    return this.fileDownLoad(fileName);
}

我们梳理了大后方,那接下来就是把最前端和别人交互的部分搞清楚,这样掐头去尾,整个项目就解剖的差不多了。

只需要有一套BASE微服务,BASE微服务生成业务系统微服务实例,供各个业务系统调用;业务系统不直接调用BASE,只能调用微服务INSTANCE。

分页查询后台代码
// 使用对象 service 分页查询数据
@RequestMapping("/list")
@ResponseBody
public PageModel<Xxx> list(int offset, int limit) {
    XxxExample example = new XxxExample();
   PageModel<Xxx> pageModel = xxxService.selectByExampleForOffsetPage(example, offset, limit);
   return pageModel;
}

// 使用 delegateService 自定义 sqlMap 分页查询数据
@RequestMapping("/list")
@ResponseBody
public PageModel<Xxx> list(int offset, int limit) {
    String statement = "com.yan.dao.mapper.xxx.XxxCustomMapper.getXxx";
    PageModel<Xxx> pageModel = delegateService.selectPagination(statement, offset, limit);
   return pageModel;
}

虽然之后的步骤依然需要你深入其中,事无巨细地了解具体内容,但此时,你通过前面的努力,已经可以站在一定的高度看每一个项目了,虽然你细节上还是不了解,但这是完全不同的。

图片 1

1.服务端技术(Server)

名称 版本号 网址
Spring Framework 4.3.13.RELEASE http://projects.spring.io/spring-framework/
Shiro 1.4.0 http://shiro.apache.org
AspectJ 1.8.13 http://www.eclipse.org/aspectj/
MyBatis 3.4.5 http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis Generator 1.3.5 http://www.mybatis.org/generator/index.html
PageHelper 5.1.2 http://git.oschina.net/free/Mybatis_PageHelper
Dubbo 2.6.0 http://dubbo.io
Solr 7.1.0 https://lucene.apache.org/solr/
ActiveMQ 5.15.2 http://activemq.apache.org
Druid 1.1.5 https://github.com/alibaba/druid
Jackson 2.9.2 https://github.com/FasterXML/jackson
Dom4j 1.6.1 http://www.dom4j.org
Ehcache 2.6.11 http://www.ehcache.org/
Logback 1.2.3 https://logback.qos.ch
Maven 3.3.9 http://maven.apache.org/
Zookeeper 3.4.11 https://www.apache.org/dyn/closer.cgi/zookeeper/

这里说的必要条件不是“项目面对的客户是谁”、“项目用的框架是什么”这种,而是真真正正的必要条件,就好比用几条数学公理能推出整个数学体系一样。这里我总结的真正的必要条件只有两点:

服务注册发现.png

九、许可证(License)

MIT License

好了,这时候每个项目你已经大致了解,最起码调用的效果,数据库所能提供的服务,你是清楚的。至此,就要重新整理下项目之间的关系了。

1.开发推代码并同时记录自己提交了哪些文件;

项目已提托管至Github,请前往https://github.com/micyo202/yan查看源码

图片 2

logo

该项目是一整套整合 Dubbo Zookeeper SpringMVC Spring MyBatis 支持分布式的高效率便捷开发RPC框架,使开发人员更专注于业务,达到面向业务开发。

项目使用 Maven 构建,便于项目管理,可支持 Oracle、MySql 等主流数据库。

项目模块化分层明确,代码规范,便于后期维护等工作。

前端展示界面采用基于 Boostrap 实现的响应式布局,并集成了一系列的动画效果插件,整体界面简洁、美观大方并可优雅的与后台完成交互操作。

项目目标是为中小型企业打造全方位的J2EE企业级开发解决方案,提高工作效率。

该项目是yan-demo单节点项目的升级版,支持分布式,持续更新中,敬请期待...

责任编辑:

  • 接口规范
获取service对象
// 获取delegateService对象
@Autowired
private DelegateService delegateService;

// 获取泛型Service对象
@Autowired
private XxxService xxxService;

如果说站在整个业务的本质上看,业务无非就是一堆代码运行在一堆机器上;那么站在单个项目来看,一个项目无非就是对数据库的增删改查操作而已;或者从使用者的角度看,一个项目就是输入一些参数得到一些返回结果而已。

部署

文件上传
@RequestMapping("/upload")
public String upload(HttpServletRequest request) {
    // 调用父类的上传方法,在jsp中必须指定form为enctype="multipart/form-data"
    List<String> fileNames = this.fileUpLoad(request);
    return "success";
}

所谓项目,其实就是一堆代码放在了一堆机器上而已,所以这些就足够了。

松耦合表示我们模块之间不直接依赖,无状态,可以单独地为外界提供服务;

六、常用方法(Methods)

当然,为了更加节约时间,最好还要有wiki、jenkins、页面访问路径、数据库地址。

这是运维的问题,让运维去解决,运维使用工具,实际也不算困难,反正执行的都是脚本,不需要手工操作。

Yan 项目简介(Instruction)

  • 找核心项目:这里首先要选择一个核心项目去看,众多项目中一定有一个是核心项目,就先从这个开始看起。
  • 筛选核心数据表:如果数据库的表比较少,那我们拿工具导出来表结构,一个个看就行了,这个不难。但如果数据库表特别多,我们首先要将表名全部导出,筛选出那些核心的表。这里导出表名、筛选表以及后面的分析表字段,不妨给自己做个工具,我在遇到一些很麻烦的或者感觉以后还可以通用的事情时,就会做成一个小工具,放在一个我给自己起名为javamate的程序中,这些小工具逐渐积累起来你会发现今后有意想不到的方便。
  • 判断哪些是核心表:不要着急,我们首先排除掉一些没用的。拿我在公司分析的系统来说,一共150多个表,其中有好多copy结尾的是备份,flow结尾的是流水,rel结尾的是中间关联表,statistics结尾的是数据统计表,log结尾的是日志表,config结尾的是配置表,等等。排除掉这些对核心业务理解无影响的表之后,所剩的也就20来张表,再根据它们的名字,可以看出好多表是属于一类的,比如order表就有各种order,按类别再分出来也就四五类,再分析起来就不难了。当然如果是更大的体系结构,那就要再不断做拆解。
  • 找出表之间的关系:在具体分析这些核心表字段之前,还要做一件事就是找出表中间的关系。如果表b中有个字段,比如叫a.id,那么b和a就是一对多的关系;如果两个表有rel中间表,那二者就是多对多的关系,起码从逻辑上讲是这样的。这个分析过程我也是做了个小工具,通过程序来判断的。
  • 最后说明
分页查询前台代码
<table id="table"><table>

$('#table').bsTable({
        url: '${pageContext.request.contextPath}/xxx/list',
        idField: 'id',
        columns: [
            {field: 'state', checkbox: true},
            {field: 'id', title: 'id', align: 'center'},
            ...
            ]
    });

来源:www.cnblogs.com/flashsun/p/9450066.html

随着公司一年多的成长,我们已经开发了数十个项目了,后台有JAVA的有PHP的,为了更好地提升开发与管理效率,各技术大牛小牛们时常进行激烈的PK,碰撞出了许许多多爱的火花,比如其中之一:微服务实践

获取日志日志记录Logger对象
// 方法一:使用注解获取
@LogInject
private static Logger log;

// 方法二:使用工厂方法获取
private static Logger log = LoggerFactory.getLogger(XxxController.class);

就这样的一个多月时间里,我慢慢靠自己的力量熟悉了大概十个项目,并在过程中总结了一些方法,借此机会记录一下,分享给大家。

我们采用工具flyway,可以对数据库脚本进行版本控制。

一、项目开发环境&工具(Environment&Tools)

  • MacOS Sierra / Windows 7
  • MySql 5.7
  • JDK 1.8
  • CentOS 7
  • IntelliJ IDEA 2017.2.5 / Eclipse 4.6.1
  • Navicat Premium 11.1.12
  • Maven 3.3.9
  • Jetty 9.4.6.v20170531 / Tomcat 9.0.1

页面访问路径——前端项目——后台服务——数据库地址

背景

文件下载(在jsp页面使用通用的下载方法,使用restful风格)
<a href="${pageContext.request.contextPath}/文件名称/download">文件下载</a>

长此以往,你一定会在某个项目中脱颖而出,让大家认识到你的全局视野,这也是走出老是写增删改查代码怪圈的一个途径。慢慢会有人意识到,你对项目的理解总能站在全局的视野,很多需要跨项目去做的业务,也会自然而然想到你,慢慢地,你会接触到更为核心的东西,成为架构师,或者去转向产品,转向管理。

3.投到测试环境让测试公司测试;

创建一个继承与BaseController的控制器
@Controller
public class XxxController extends BaseController {
    ...
}

由于这部分的信息没人会一个一个地告诉你,就算有也不可能说的特别全。所以我是借助jenkins来整理的。项目部署都需要用到jenkins,只要查看jenkins配置的命令,就可以把部署环境一一整理出来,这个我认为是最全而且最新的。

  • 数据库

二、技术选型(Technology)

这部分如果有老员工愿意和你说说,那最好还是了解一下。如果没有也没关系,先跳过这段,以后慢慢了解也是可以的。

  • 消息队列

三、项目结构(Construction)

yan -- 根目录
├── yan-api -- 接口模块(提供核心接口方法)
|    ├── main -- 主模块路径
|    |    ├── java -- java类路径
|    |    |    ├── com.yan.api -- 核心接口包
|    |    |    |    ├── jms -- 消息服务接口
|    |    |    |    ├── persistence -- 持久化接口
├── yan-common -- 公共模块
|    ├── main -- 主模块路径
|    |    ├── java -- java类路径
|    |    |    ├── com.yan.common -- 公共类包
|    |    |    |    ├── annotation -- 注解类
|    |    |    |    ├── aspect -- 切面类
|    |    |    |    ├── constant -- 常量定义类
|    |    |    |    ├── model -- 通用模型
|    |    |    |    ├── service -- 泛型对象服务
|    |    |    |    ├── spring -- spring扩展类
|    |    |    |    ├── support -- 基础支持类
├── yan-core -- 核心模块(提供核心方法)
|    ├── main -- 主模块路径
|    |    ├── java -- java类路径
|    |    |    ├── com.yan.core -- 核心类包
|    |    |    |    ├── annotation -- 注解类
|    |    |    |    ├── aspect -- 切面类
|    |    |    |    ├── controller -- 控制器
|    |    |    |    ├── injector -- 注入类
|    |    |    |    ├── listener -- 消息消费者监听器
|    |    |    |    ├── shiro -- 安全认证类
├── yan-dao -- 数据库访问模块(该模块主要通过 mbg 插件生成相应的模型及接口映射)
|    ├── main -- 主模块路径
|    |    ├── java -- java类路径
|    |    |    ├── com.yan.dao -- dao层包
|    |    |    |    ├── mapper -- 接口映射类
|    |    |    |    ├── model -- 数据库模型类
|    |    ├── resources -- 资源配置路径
|    |    |    ├── database -- 数据库sql文件
|    |    |    ├── mybatis -- sqlMap映射文件
|    |    |    ├── properties -- 配置文件
├── yan-plugins -- 插件模块(自定义插件)
|    ├── main -- 主模块路径
|    |    ├── java -- java类路径
|    |    |    ├── com.yan.plugins -- 插件包
|    |    |    |    ├── mybatis.generator -- mbg插件类(包含注释插件、序列化插件)
├── yan-service -- 服务模块(核心接口方法实现)
|    ├── main -- 主模块路径
|    |    ├── java -- java类路径
|    |    |    ├── com.yan.service -- 服务包
|    |    |    |    ├── jms -- 消息服务接口实现类
|    |    |    |    ├── persistence -- 持久化接口实现类
├── yan-web -- web模块
|    ├── main -- 主模块路径
|    |    ├── java -- java类路径
|    |    |    ├── com.yan.web.controller -- 业务处理控制器包
|    |    ├── resources -- 资源配置路径
|    |    |    ├── properties -- 项目配置文件
|    |    |    ├── spring -- spring的配置文件
|    |    ├── webapp -- web应用根路径
|    |    |    ├── common -- 公共路径
|    |    |    ├── resources -- 静态资源路径
|    |    |    ├── views -- 视图路径

所以接下来我们要做两件事:一个是整理数据库表,一个是整理Controller层的所有接口。

设计理念

近期更新内容

  • beta 1.0.0:项目整体改造,升级为RPC架构。(注:若想查看非RPC版请移步至https://gitee.com/micyo202/yan)
  • beta 0.1.0:模块优化,删除不必要的模块,优化代码(模块详情参考:三、项目结构)
  • beta 0.0.5:前端添加ECharts,便于图形化展示
  • beta 0.0.4:添加JMS(ActiveMQ)消息服务(目前仅测试方法,暂无业务流转,后期逐渐完善细化)
  • beta 0.0.3:添加Solr搜索引擎服务(基本的全文检索功能,可根据实际需求情况进行二次开发,后期本人再逐渐完善)
  • beta 0.0.2:优化整体代码、添加更多注释,结构更清晰、代码更易懂
  • beta 0.0.1:将原有yan-demo项目重构,保留原有功能,模块拆分、优化项目结构

一、必要条件

为了性能上面的考虑,尽量使用异步编程,比如注册送优惠券,那么注册成功就可以给用户返回注册成功了,但是送优惠券可以是异步调用的,不阻塞注册的线程。

五、配置说明(Properties)

yan-dao 模块 resources/properties 中配置文件说明

名称(Key值) 描述
mbg.path mybatis generator 插件生成代码的路径(绝对路径)
mbg.db.username mybatis generator 插件连接数据库的用户名
mbg.db.password mybatis generator 插件连接数据库的密码
mbg.db.driverClassName mybatis generator 插件连接数据库的驱动
mbg.db.url mybatis generator 插件连接数据库的地址

yan-service 模块 resources/properties 中配置文件说明

名称(Key值) 描述
default.datasource.username 默认数据库用户名
default.datasource.password 默认数据库密码
default.datasource.driverClassName 默认数据库驱动类
default.datasource.url 默认数据库链接地址
dextend.datasource.username 扩展数据库用户名(用于多数据源切换)
dextend.datasource.password 扩展数据库密码(用于多数据源切换)
dextend.datasource.driverClassName 扩展数据库驱动类(用于多数据源切换)
dextend.datasource.url 扩展数据库链接地址(用于多数据源切换)
datasource.initialSize 初始化时建立物理连接的个数
datasource.minIdle 最小连接池数量
datasource.maxActive 最大连接池数量
datasource.maxWait 获取连接时最大等待时间,单位毫秒
datasource.timeBetweenEvictionRunsMillis 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
datasource.minEvictableIdleTimeMillis 配置一个连接在池中最小生存的时间,单位是毫秒
datasource.validationQuery 用来检测连接是否有效的sql
datasource.testWhileIdle 建议配置为true,不影响性能,并且保证安全性
datasource.testOnBorrow 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
datasource.testOnReturn 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
datasource.poolPreparedStatements 是否缓存preparedStatement,也就是PSCache
datasource.maxPoolPreparedStatementPerConnectionSize 每个连接上PSCache的大小
datasource.filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
- -
dubbo.application.name dubbo 应用服务提供者名称
dubbo.protocol.port dubbo 协议暴露服务的端口
dubbo.registry.address dubbo 使用 zookeeper 注册中心暴露服务的地址
- -
jms.brokerURL activeMQ 服务地址
jms.userName activeMQ 服务管理端用户名
jms.password activeMQ 服务管理端密码

yan-web 模块 resources/properties 中配置文件说明

名称(Key值) 描述
jms.brokerURL activeMQ 服务地址
jms.userName activeMQ 服务管理端用户名
jms.password activeMQ 服务管理端密码
- -
logback.name 日志文件前缀名称(一般使用项目名称,便于区分)
logback.path 日志存放路径(绝对路径)
logback.maxHistory 日志最大的历史天数
logback.db.username 日志写入数据库时连接数据库的用户名
logback.db.password 日志写入数据库时连接数据库的密码
logback.db.driverClassName 日志写入数据库时连接数据库的驱动
logback.db.url 日志写入数据库时连接数据库的url
- -
setting.upload 文件上传路径(绝对路径)
- -
solr.builder Solr搜索引擎服务地址

四、整理数据库表

本文主要是介绍微服务开发上的选型,对于细则不做深究,大家感兴趣可以了解下各个组件。当然,我们的选型未免正确,不同场景应用可能完全不同,本文仅供参考。

七、示例代码(Codes)

注意,这个阶段我们只是见名知意,即使点开页面,连接上数据库看看,也千万别花过多的时间,因为这个阶段的重点就是仅仅知道这条业务线提的整体内容。

接口文档swagger:比起传统全手工写接口文档,swagger有统一的输出格式,不管是几个人写的;swagger采用写代码的方式来写接口文档,以前修改了代码,还必须打开wiki手工修改接口文档,现在只需要修改一下代码即可,程序员更愿意修改了,成本更低了,前端与其它调用者不会天天吼着,你这接口咋又变了,新加的字段是啥意思呀。

四、项目入门(Introduction)

  1. 下载项目,并且导入到IDE开发工具中(建议使用:IntelliJ IDEA)
  2. 使用 Maven 构建项目
  3. 创建数据库并执行 yan-dao 模块中 resources/database 路径下的 yan.sql 文件,创建整个项目必要的表(如:用户表、资源表、日志记录表等...)
  4. 分别修改 yan-dao、yan-service、yan-web 模块中 resources/properties 路径下的 *.properties 配置文件(具体修改方法及对应属性解释,详见 - 五、配置说明)
  5. 完成以上步骤就可以正常部署启动服务了:

    a). 启动 zookeeper 服务(必要服务,不启动该服务导致项目无法正常运行)

    b). 启动 activemq 服务(非必要服务,若不启动该服务,则项目运行中会有jms监听器异常,但不影响整体能)

    c). 启动 solr 服务(非必要服务,若不启动该服务,则搜索引擎无法使用,但不影响整体功能)

    [以上服务具体配置及启动命令,这里我不多做阐述了,不知道的可自行百度搜索]
  6. 启动完以上基础的服务后,就可以运行项目了

    a). 首先启动 yan-service,直接运行该模块中的 com.yan.service.ServiceApp.main() 方法来启动

    b). 其次启动 yan-web ,可(使用 jetty / tomcat 均可)[详细部署过程在这里就不多做阐述了],启动成功后即可访问web应用界面。接下来进入开发阶段
  7. 根据实际业务需求,在对应的数据库中创建业务表,表命名规范:“模块名_表名” 如:SYS_RESOURCE(系统模块资源表)
  8. 修改 yan-dao 模块中 resources 路径下的 generatorConfig.xml 中的 targetPackage 包名及 tableName 表名,使用 MyBatis generator 插件生成对应的持久层模块代码(Maven 执行命令:mvn mybatis-generator:generate),具体配置请参考MyBatis GeneratorXML Configuration
  9. yan-api 模块中 src/main/java 路径下创建对应的接口
  10. yan-service 模块中 src/main/java 路径下创建对应的接口服务实现类,并在 src/main/resources/META-INF/spring 路径下的 spring-dubbo-provider.xml 配置中添加声明暴露对应服务接口
  11. yan-web 模块中 src/main/java 路径下创建对应的 controller 控制器,该控制器类命名规范以 Controller 结尾,继承 BaseController 类,编写 controller 控制器业务处理代码(具体使用参考 - 七、示例代码),并在 src/main/resources/spring/config 路径下的 spring-dubbo-customer.xml 配置中添加声明暴露对应服务接口
  12. yan-web 模块中 src/main/webapp/views 路径下创建对应的jsp页面,并编写前端页面展示代码

图片 3

微服务接口测试工具postman

方法均在继承于BaseController的controller类中使用this.metodName或直接使用methodName来进行调用(注:methodName代表需要调用的方法名称,方法名称见下表)
方法名 参数 返回值 描述
getSession HttpSession 服务器会话 获取服务器会话 session 对象
setSession session 服务器会话 设置服务器会话 session 对象
getRequest HttpServletRequest 用户请求 获取用户请求 request 对象
setRequest request 用户请求 设置用户请求 request 对象
getResponse HttpServletResponse 服务器响应结果 获取服务器响应结果 response 对象
setResponse response 服务器响应结果 设置服务器响应结果 response 对象
getSessionUser TbSysUser 用户对象 获取登录成功后 session 中的存储的用户信息
- - - -
getService DelegateService 通用 Service,查看自定义 sqlMap 的代理 service 对象 获取 delegateService 对象
resultPage list 查询到的分页结果,为 Page 对象 PageModel<T> 自定义的分页模型,T 为查询的对象 分页结果集对象
resultMsg status 状态值(可根据需求任意设置,无强制标准);msg 消息内容;res 返回的对象 MsgModel 自定义消息模型 消息返回对象
fileUpLoad request 上传方法中传递的 request 对象,并非父类中的 request 对象 List<String> 上传文件成功后的新文件名称,以集合形式返回 文件上传方法,支持多个文件上传
fileDownLoad fileName 需要下载的文件名称 ResponseEntity<byte[]> 下载的文件,在浏览器会进行下载 文件下载方法
- - - -
isNull obj 需要进行判断的对象 boolean 为null或空返回 true,否则返回 false 判断对象是否为null,或空
obj2Str obj 需要转换的对象 String 对象的值(为null则返回"") 对象转换为 String,通常用于获取 Map 集合中的对象时使用
getUUID String 32位主键字符串 生成 uuid 主键,长度为32位,且为大写模式
base64Encoder str 需要进行编码的字符串 String 进行编码后的结果字符串 对字符串进行 base64 编码
base64Decoder str 已进行 base64 编码的编码字符串 String 解码后的原字符串 对字符串进行 base64 解码
md5 str 需要进行 md5 加密的字符串 String 加密后的结果 对字符串进行 md5 加密算法
currentDate pattern 获取系统时间的格式,如:yyyy-MM-dd HH:mm:ss String 返回格式化后的当前时间 获取系统当前时间
timeStamp2Date timestamp 需要进行转换的时间戳;pattern 转换后的格式 String 格式化后的日期 时间戳转换成日期
date2TimeStamp dateStr 需要进行转换的日期字符串;pattern 日期的格式 String 转换后的时间戳 日期转换为时间戳
readFromFile filePath 文件路径(绝对路径) String 读取的文件内容 从指定文件中读取文件内容
writeToFile content 需要写入文件中的内容 filePath 文件路径(绝对路径) 将内容写入到指定文件中(写入会覆盖文件原有内容,建议先读取,再写入,将读取的内容与需要写入的内容并在一起进行写入)
generatePath path 文件夹路径(绝对路径) 生成指定路径文件夹,先进行判断文件夹是否存在,若不存在则创建对应目录的文件夹,若存在则不进行任何操作
generateFile path 文件路径(绝对路径) 生成指定路径的文件,先进行判断文件是否存在,若不存在则进行创建文件,若存在则不进行任何操作
propertiesValue key 资源文件中的 key 值 String 读取到的 key 对应的 value 值 读取 properties 文件中的值,读取 classpath 下 /properties/config.properties 配置文件
propertiesValue resource 资源文件路径(对应 classpath 中的路径);key 资源文件中的 key 值 String 读取到的 key 对应的 value 值 读取指定路径 properties 文件中的值,会从 classpath 路径下进行查找资源文件

这个整理的过程,主要是让自己梳理清楚,一共有哪些项目,哪些是前端可视的,哪些是后台提供服务的,并且大致了解前端项目分别调用了哪些后台服务。通过后台服务和数据库的名称,我们能从本质上了解到这条业务线提供了什么功能;从前端项目和页面路径,我们能了解到我们需要给用户展示什么。

微服务框架下,日志不可能还分散在各个服务节点上,必须有统一的日志中心。ELK是一个实时日志分析平台,就是将各个服务的日志汇总于日志中心,然后可以按照系统、节点等进行搜索,除上述搜索条件外,我们还在各个微服务实现了按照业务id(一次请求生成一个业务id)与用户id搜索日志,方便跟踪与定位问题。

八、效果预览(Preview)

图片 4

login

图片 5

web

图片 6

mobile

三、了解项目间的关系

  • 客户端调用业务系统,不直接调用微服务;
  • 微服务内部也存在调用关系。

项目所需工具及版本 *

  • zookeeper-3.4.11 http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.11
  • apache-activemq-5.15.2 http://activemq.apache.org/activemq-5152-release.html
  • solr-7.1.0 https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.1.0

我们首先要想的是,有了哪些必要条件后,给你足够的时间,你才能够完全了解整个项目?

  • 数据库升级
  • 升级前对数据库做物理或逻辑备份
  • 数据库脚本不能含有删除或修改表与数据的语句,防止升级过程中旧业务报错
  • 所有脚本上线前运维人员必须check,一些敏感词drop或delete

2.前端技术(Web)

名称 版本号 网址
angular - https://angularjs.org
awesome-bootstrap-checkbox - https://github.com/flatlogic/awesome-bootstrap-checkbox
bootstrap 3.3.7 http://www.bootcss.com
bootstrap-datetimepicker - http://www.bootcss.com/p/bootstrap-datetimepicker/
bootstrap-select 1.12.4 http://silviomoreto.github.io/bootstrap-select/
bootstrap-table 1.11.1 http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/
bootstrapvalidator 0.5.3 https://github.com/nghuuphuoc/bootstrapvalidator/
ECharts 3.8.4 http://echarts.baidu.com
font-awesome 4.7.0 http://fontawesome.io/icons/
fontIconPicker 2.0.0 https://codeb.it/fonticonpicker/
fullPage - https://alvarotrigo.com/fullPage/
jquery-confirm 3.3.0 https://github.com/craftpip/jquery-confirm
malihu-custom-scrollbar-plugin - https://github.com/videoMonkey/malihu-custom-scrollbar-plugin
material-design-iconic-font 2.2.0 https://github.com/zavoloklom/material-design-iconic-font
waves 0.7.5 https://github.com/fians/Waves
zTree_v3 3.5.26 http://www.treejs.cn/v3/main.php#_zTreeInfo
BootstrapMenu - https://mobirise.com/bootstrap-menu
device - https://github.com/matthewhudson/device.js
jquery 3.2.1 http://jquery.com
jquery-cookie - https://github.com/carhartl/jquery-cookie

六、重新理清项目间的关系

强内聚是指,我们虽然要拆分成一个个小的微服务,但是也要考虑某些功能的强关联性,比如一个凳子是由四个脚与一个板组成,我们不能把四个脚与板分开售卖,就没有意义了。

常用 delegateService 方法
// 使用自定义sql模板查询单个对象
Xxx xxx = delegateService.selectOne(statement);
Xxx xxx = delegateService.selectOne(statement, parameter);

// 使用自定义sql模板查询对象集合
List<Xxx> list = delegateService.selectList(statement);
List<Xxx> list = delegateService.selectList(statement, parameter);

// 使用自定义sql模板有范围的查询,(每次返回指定的对象条数集合)
List<Xxx> list = delegateService.selectList(statement, parameter, rowBounds);

// 使用自定义sql模板进行分页查询
PageModel<Xxx> pageModel = delegateService.selectPagination(statement, offset, limit);
PageModel<Xxx> pageModel = delegateService.selectPagination(statement, parameter, offset, limit);

// 使用自定义sql模板保存
int res = delegateService.insert(statement);
int res = delegateService.insert(statement, parameter);

// 使用自定义sql模板修改
int res = delegateService.update(statement);
int res = delegateService.update(statement, parameter);

// 使用自定义sql模板删除
int res = delegateService.delete(statement);
int res = delegateService.delete(statement, parameter);

很多新人进入一家新公司后,最头疼的就是如何快速了解公司的业务和项目架构,或者说不要求快速,即便有足够的时间,也很难在庞大的业务中整理出思绪。当然,如果你碰到一个特别热心的老员工,事无巨细地给你讲,随时在你身边答疑解惑,那可能还好。

java开发5年以上的都非常清楚,很多JAVA框架都淡出了视野,比如hibernate、struts1、struts2,唯有spring越来越受欢迎。

和数据库一样,如果接口很少,那么一个个看;如果特别多,还是先找出比较核心的几个方法研究。

  • 持续集成

到此为止,你对整条业务线就有了大致的了解,接下来就可以结合你具体负责的内容、领导安排你做的方向,去看具体的业务代码了。

  1. 模块化是基础

在此基础之上,这个图可以不断细化,比如项目部署的机器,我们可以标注在项目旁边,或者保存在Xshell里。此外所有非业务相关的,能查到的尽量都记录下来。这个真的为以后找各种东西提供太多方便了。如果不在这一步这样做,别看你现在节约了时间,但等到以后查找相关东西的时候,时间加起来将会是天文数字了。

微服务的好基友:docker

  • 源码位置(gitlab或svn);
  • 部署环境(dev/test/online);

问题二:为什么不做成一个saas的微服务,这样就只有不到10个的微服务,就非常容易管理了不是吗?

五、整理Controller层接口

负载均衡利器:docker swarm

我之所以说那两个是必要条件,是想说其实项目本质上就是这么简单的一个事,你千万不要想的太复杂。它的业务可以无限复杂,但它的本质却逃不出这些,你千万不可以糊涂。当你无从下手或者什么都不清楚的时候,就主要把源码和环境弄清楚吧,其它的都是附属品。

权限认证.png

我们上面都是整理项目的大体框架,还没有涉及到具体的项目细节。这一部分,仍然不去涉及。

RocketMQ:一直纠结kafka与rocketMQ,最终选择了RocketMQ

这样等到需要负责具体到细节的业务时,虽然依然需要花时间,但相比整体一头雾水地开始,还是简单许多的。

每个程序员都有这样的经历,刚上线,客户又反馈了bug,原来是我们修改某个功能代码的时候,导致了其它功能的bug,每次上线心里都没底;这就体现了接口测试的必须性,尤其是每次版本升级的时候,都需要执行一遍,以防修改某个接口导致其它接口报错,比手动测试靠谱许多。

这里的一个前端项目可能对应多个后台服务,所以最终的图应该差不多是这样:

  • 强大而友好的spring体系

首先在这里强调一点,我的策略不是快速了解一个项目的具体业务,因为这个不同项目也不一样,无法总结。我的策略是大体了解整个业务线上的所有项目,大概摸清楚每个项目都是干嘛的,它们之间的关系如何,以便以后不论具体负责哪个项目都不至于找不到方向。

我们采用mysql,因为我们是应用多,但数据量单表并不算大,多则不超过百万,mongodb也实验过,开发非常快,也非常灵活,但因为不是关系型数据库,维护成本较高。

对某个具体项目的了解,一定要建立在对整体了解的基础上。这时我们首先为各个项目画出一条线,并标明每一个节点的信息,就像下面的样子:

调用逻辑

这就是我总结的了解项目的过程,我工作年限不多,经验上还不够丰富,希望大佬们多多留言指点,提出问题,共同进步。

单点故障影响全局,我们选择了稳定更重要;另外saas的话,为了应对不同行业,会存在过度设计的嫌疑;私有化更容易。

这里我也给自己做了个小工具,扫描出所有的controller层的接口,展示出方法名、路径名、参数列表和返回值等,但可惜没能展示注释,有大神有想法的话也欢迎帮我想想。

图片 7

当对数据库表做了以上的了解后,你基本上对这个系统能提供什么服务了解得差不多了。这个时候不论你的代码长什么样子,数据库摆在那里,能提供的服务差不多就已经出来了,对有经验的人来讲,代码的业务逻辑也大致能猜到个八九分。

边模块化边微服务.png

在研究具体业务代码的同时,不断地跳出来看整条业务线的框架,修正之前由于不了解具体业务而理解错误的架构。

图片 8

这里我用的是postman,把要研究的接口访问保存起来,并且添加访问成功和失败的Example。我推荐自己开发的时候也把postman用起来,越详细越好,postman不只是可以简简单单访问你的接口,还能做批量测试,还可以生成api文档用于和前端交互。这样你不但测试了自己的接口,还省的写文档了。而且postman还有个好处就是可以给自己的接口mock一个服务,这样即使你的接口挂了,或者接口根本就没写好,也可以让前端人员先访问你的mock,完全不影响前端边测试边开发,这才是真正的前后端分离嘛。

服务接口改变后,再也不需要口头通知服务调用者了,因为调用者太多,你根本不知道他是谁,难免遗漏;可支持PHP。

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn返回搜狐,查看更多

问题一:有些人会问,假如有20个业务系统,那就有上百个微服务,这怎么管理得了?

二、从页面到数据库的线

….

到此,你就对整体的数据库结构有所了解了。根据表名也能对表的大致内容有所了解,接下来就是针对具体的表,看里面具体的字段和前人给出的备注,这个过程就没有技巧了,要耐心,要慢慢熬。

  • 异步编程方式

不要和我说查wiki,如果公司wiki都写的这么全,我估计就没这篇文章什么事了。当时我的jenkins权限特别少,只能看一部分项目,而且还只能执行,不能看配置,带我的人也是抠门,每次问他都给我开通所需要的项目的执行权限,多一点都不给。后来我也懒得问了,由于jenkins机器大家都可以用root权限登陆,所以我进入jenkins的配置文件config.xml,给我自己添加了一个admin权限,重启jenkins,再打开之后屏幕满满的项目都出来了,而且都可以查看和修改,畅通无阻。我就这样通过一个个jenkins的配置,整理了部署的机器,也看了下启动的逻辑。

  • 服务注册与发现:eureka
  • 根据之前的接口名称,详细了解下项目间的调用关系。理不清的部分去问老员工,这时候你带着自己的了解问,他们也能给出更多的信息。
  • 看看每个项目中用到的中间件,主要是mq服务,看看谁是生产者,谁是消费者,以此来了解关系。
  • 这时你应该已经开了好几轮的周会了,接下来的周会你应该能听懂部分内容。根据每个人的描述和最新的几组需求,逐渐摸清楚现在项目面临的问题,以及哪个项目是核心,哪个项目是辅助,哪个项目是以稳定安全为主的。

测试

原标题:加入新公司,怎样快速熟悉业务和项目?

2.项目经理根据svn审核文件,并打包成war包;

作者:闪客sun

升级

有了上面的必要条件后,我们就开始了解项目了。由于不只是一个项目,所以千万不能深入具体代码,否则你就越来越烦直到放弃,也不会有好的效果。

  • 统一配置中心 ETCD

针对外部校验,内部完全信任机制。

图片 9

  • 实时日志分析平台 ELK

docker已经家喻户晓了,这是继虚拟机以后,又一重大变革,将所有的单个微服务都放在docker中,这样你何时何地想部署,直接丢过去就OK了,快到爆。

我都写不下去了,项目经理像个超人似的。

  • 权限认证

非模块化,谈不上微服务,比如我们上面的用户微服务、产品微服务、地址微服务等,都需要先模块化,为了更好地落实开发,你可能不得不,边模块化边微服务,模块化的时候要注意,不能有关联查询,包要完全独立,到时候微服务才能拆开。

RESTFUL:URL的资源与操作解耦,让URL更加符合语义,上百个接口也非常好管理,网上有很多文章讲得非常透彻,这玩意不是特别好理解,要多领悟,在项目中实践,就有矛塞盾开的感觉,这里不做详细介绍。

微服务开发架构.png

4.中途修改了文件,可能需要重新打包;

  • 松耦合、强内聚

现在用持续集成非常简单,我们用的工具是Jenkins,推完代码,点几下按钮就完成了上线,不管是测试环境,还是生产环境都非常简单,不然项目经理核对文件眼睛都绿了。

spring-cloud:里面有比较多组件,用于支持微服务,比如spring cloud config统一配置中心,用于多环境的配置文件配置,大家再也不用为多个微服务的开发、测试与生产环境的配置文件管理而发愁了;spring cloud eureka用于服务注册与发现,下面有单独介绍;其它的组件大家可以去官网看看,这里不一一介绍,总之如果JAVA平台,尽量使用spring体系的内容。

图片 10

传统的版本升级,

调用逻辑.png

spring-boot:较springmvc更加简约了,springmvc有一大零的配置文件,比如spring-servlet、spring-mybatis、spring.xml与web.xml,这些在spring-boot都不需要了,只需要强大的注解功能即可,boot更合适微服务。

结尾

微服务并不是单独存在的,为了更好地实现微服务架构,需要整合许多组件混搭使用,方能打通任督二脉,天下无敌。网上很多大拿讲了微服务治理的内容,也有人单方面讲微服务的,比如spring boot与docker,本文着重于组件选型的较量,也积累了我们团队多次PK的精华;这些组件包括spring boot、spring cloud、docker、服务注册发现、RESTFUL、postman、jenkins、ELK、ETCD等。

当然可能有更加轻量级与好用的disconf或spring cloud config,但是我们有php开发的应用,以上二者都不支持。如果全是JAVA应用,采用disconf还是非常不错的。

用几句简单的命令就搞定了负载均衡,而且还可以平滑升级,版本升级的时候,大家就不用告诉客户:系统通知,某日某晚00:00-08:00我行处于系统升级维护中,大家不要去取钱哦,因为你可能取不出来,呵呵。

本文由bv1946伟德入口发布于互联网,转载请注明出处:怎样快速熟悉业务和项目,boot就够了吗

关键词: