会议学习内容
了解数据存储方式,沟通数据传输规则。
原本此次数据传输约定好了传入的省份,但是其实传入了脏数据。
即使事先沟通好了数据规则,也可能出现对方未按规则入库的情况。因此程序中应该有一定的容错机制,即使数据不准确,至少保证程序不会报错。
注意沟通技巧
1、本来这次沟通时候,数据方说已经整好了脚本,某字段不做确定值,但是实际沟通时候,强硬告知这个字段值必须限定,并且已有先例。于是数据方妥协,传入确定值。
2、本次项目初始会议时,需求方提出,实际数据从2018年开始。要求页面中不能让使用人员感受到数据断层,即:我们本地实际数据也要从2018年开始。
实际开发时,数据从2021年开始,说的是后续看安排会补录之前的数据。~~
PS:实际此次数据量不大,综合计算了一下,十年后表里数据也就1w左右,但是还是要补充记录一下我遇到过的大数据量处理:
某次数据同步时,原本约定每天2-3W数据量,每小时1000,高峰时2-3K,但是实际运行两个月后,数据开始有延迟推送情况。一次推送几十万条数据(很多天的数据)。导致消息数量超过了队列的限制,导致过多数据丢失。(解决办法:修改消息队列上限。)
查询问题:表数据到达50W时,因为有关联查询,虽然分页只展示10条数据,但是实际查询时需要十几秒时间。程序中限制的超时时间是10s,导致查询失败。(解决办法:去除大数据量表的关联查询。建索引可以提高查询速度)
项目调通
前面修改配置的步骤不分先后顺序
1、修改项目数据库配置
2、由于只有一个可用数据库连接,所以初始DAO层配置中,数据库配置了两个数据源信息,其中一个是不可用数据源,导致数据库启动失败。删除不可用的数据源配置后解决问题。
3、配置上下文路径
4、kafka连接失败,修改为可用的kafka连接
5、修改启动类扫描的包(当时出现问题:项目启动成功,但是找不到我自己写的方法。原因是启动类扫描的包不对)
6、测试前后端交互时,出现跨域问题。项目中添加CORSConfig之后解决问题
至此,项目调通。可以写前后端代码。可以正常访问。项目打包分为两部分:service、control.
项目整合
原因:因为并发不高,一个包部署方便。
验证:改完打个包,java -jar启动下看看。启动之后看下swagger,如果正常访问就没问题。
接口写了三分之一的时候,负责人告诉我:项目只需要一个包。现有的框架是两个包的。so…下一步就是把项目框架修改成只打一个包的。
经过我跟周围大佬的请教,大佬们告诉我,要整合成一个包,意思就是在一个服务器上部署。那么第一步就是把dubbo的相关配置去掉。到这个时候我才真正理解了dubbo的作用:如果我们的服务部署在两个服务器上,那么这两个服务之间怎么可以互通呢?这个时候就是dubbo来做这个沟通的桥梁了。相同的问题,两年前侯哥问过我,还给我讲了我未来的学习方向。感谢侯哥。圆规正转,如果我们只需要一个启动类,那么service和control之间就不存在互通问题(不需要原因,因为它是属于同一个工程的。service和control分别部署在两个服务器上时,他们是两个工程。)。
配置去掉之后,就是修改代码里的。原本代码里写的@Service(group=“aaab”),现在要把(group=“aaab”)去掉。然后就是把代码里@Reference(group=“aaab”)改为@Autowired。
代码里的引用改完之后,要改的是配置文件了。
1、确定留用原control层的启动类,将service层pom文件里的打包方式修改,删除service层启动类、配置文件。
2、在原control层pom文件里添加相关引用,在parent的pom文件里修改打包信息。
3、在control层启动类里,添加service层需要扫描的包。注意要添加@EnableDataSource注解(指定读取xml文件)和@MapperScan(“com.cmos.aaab.dao”)(指定扫描mapper类文件所在的包)注解,少MapperScan的话,Serivce层注入时候会失败,少EnableDataSource的话,会映射不到查询方法。
至此,项目修改成一个启动类,打一个包的项目。本地测试启动和调用没问题之后,打包用java -jar命令测试,启动成功。(在包所在的文件夹里打开命令窗口,java -jar 文件名称,回车就可以执行jar包了)swagger页面展示正常
项目目录结构修改
项目改为一个启动类之后,负责人说希望整合一下项目的目录结构。动手!!
首先该建的文件夹建一下,该挪过来的类挪一挪。然后改一下项目打包的名称,pom文件里该去除的引用去掉,该改名称的改一下。
完事。
(后来添加了探针页面,鉴权代码)
探针页面,一开始页面一直访问不到。添加配置之后好了。访问页面的类不能使用@RestController,要直接使用@Controller,返回String,名称为页面名称
鉴权代码,因为整合第二个redis集群的时候获取不到准确的配置文件,所以在代码里根据环境写死了集群信息。Jedis 2.8版本不支持初始化时候写入密码(JedisCluster),所以会报错。更换为Jedis2.9版本之后就好了。
pom文件加载时候会优先加载靠前的配置,有高版本之后就不再加载写在后面的低版本依赖。依靠这个方法解决了密码不能写入初始化代码中的问题。
项目中如果引入了 spring-boot-starter-actuator的依赖,在项目路径后加上/env就会看到项目的配置信息。在application.properties增加配置为:endpoints.enabled = false
可以解决这个问题
日志配置文件修改
项目配置完成之后,日志信息一直不能正常展示。
系统启动的时候报错:
log4j报错:ERROR StatusLogger No log4j2 configuration file found.
log4j2只支持xml和json两种格式的配置,所以配置log4j.properties是没有作用的。
log4j的2.x版本在默认情况下,系统选择configuration文件的优先级如下
1.classpath下名为log4j-test.json或者log4j-test.jsn文件
2.classpath下名为log4j2-test.xml
3.classpath下名为log4j.json或者log4j.jsn文件
4.classpath下名为log4j2.xml
所以把日志配置改为xml,改完之后,日志显示正常。
零碎知识
redis集群切换工具中,一开始只有本地环境可以连接测试redis,研发环境不能连接测试redis,解决办法:在配置文件中添加标记,然后在代码中获取标记区分环境,配置实际使用的redis集群。
项目中打包时,指定使用的配置文件:
maven命令里加
完结。