项目四总结

项目4总结

一、Git

1、概念
	(1)分布式的版本控制工具
2、和svn的区别
	(1)Git和SVN类似,都是版本控制的工具,用作项目的协同开发,不同的是,SVN是集中式的版本控制工具,Git是分布式的版本控制工具
3、操作
	(1)概要
		①命令行操作
		②图形化界面操作
		③idea集成git操作
	(2)常用操作
		①Clone
			拉取中央厂库代码到本地仓库中
		②Add
			添加到版本库
		③Commit
			提交代码到本地仓库
		④Push
			跟新本地仓库代码
		⑤Pull
			提交本地仓库到中央仓库
		⑥Pull&Commit
			直接提交代码到本地仓库,再通过本地仓库到中央仓库【一键完成】
	(3)冲突的解决
		①修改冲突文件
		②标记为已解决
		③提交代码
4、Gitee代码仓库
	(1)在项目中通常使用GitLab比较多
	(2)需要注意的地方
		①仓库地址
		②账号和密码

二、项目准备

1.项目背景
(1)该项目是为公司开发的Saas的人力资源管理平台,目的是让找工作的人可以 在平台上进行应聘和自我学习提升;让招聘单位入驻后可以在平台上发布招聘需 求,减少招聘成本;让培训机构入驻后可以在平台上发布和售卖课程,减少招生成 本。
2.功能描述
(1)该项目主要分为以下几个模块:
课程中心、职位中心、用户中心、授权中心、系统中心
3.技术架构
(1)前后端分离
前端:Vue技术栈
后端:SpringBoot+SpringCloud、 SpringBoot搭建单个服务、SpringCloud治理服务
4.项目的流程
(1)需求分析(产品经理,项目经理)
设计(技术经理,架构师)、编码(前端,Java)、测试(测试人员)、上线、运维(运 维人员)、项目周期:6个月左右、编码3-4个月
5.项目人员组成
(1)项目经理
架构师、前端、Java、测试、UI

三、项目基础架构的搭建

1.Eureka【注册中心】

服务启动时会生成服务的基本信息对象Instancelnfo,然后在启动时会register到服务治理中心。注册完成后会从服务治理中心拉取所有的服务信息,缓存在本地。之后服务会被30s(可配置)发送一个心跳信息,续约服务。

2.Feign&Ribbon

负载均衡调用服务。
Ribbon和Feign的区别?
Feign的底层是Ribbon,Ribbon在调用服务的时候需要将参数拼接到url中,所以很麻烦,通过Feign,可以更优雅的实现接口的调用。
使用Feign的话我们只需要写Feign的客户端接口,Feign会为我们生成动态代理对象,调用动态代理对象的方法进行服务的调用,将服务调用的复杂性进行了封装。Feign整合了Hystrix,使用熔断机制保证服务的健壮性。

3.Hystrix

断路器,保证微服务的健壮,防止微服务雪崩。
Hystrix的措施:
资源隔离/限流:将服务封装到HystrixCommond熔断:当一定数量的请求在一定时间内的失败达到设置的阈值,对服务做熔断熔断的服务在一段时间后会进入到半熔断状态,允许少量请求访问,如果还是失败,回到熔断状态,如果成功,则回到闭合状态,服务正常提供。
降级:返回拖地数据
我们在用Hystrix的时候,会预先设置服务的托底数据,如果服务熔断,则不能正常提供服务,返回托底数据。

4.Zuul

微服务的统一入口,在网关中通过路由的配置,指定具体的url访问具体的服务。
Zuul默认整合了Ribbon,使用Ribbon做服务的负载均衡调用。
网关也需要注册到Eureka中。

四、技术要点:

我们使用mybatisplus代码生成器自动生成了租户的crud,在租户列表上完成了高级分页查询。然后实现租户入住完成图片logo的上传。因为在集群和分布式的环境下必须使用分布式文件系统进行统一项目管理,然后我们就使用了fastdfs架构进行调度和负载均衡,其中fastdfs主要原理就是将附件上传到fastdfs得到一个文件的链接路径url,我们获取到这个url将他以字符串形式保存到我们的mysql中,下载的时候获取到这个url直接打开或者下载附件。
后端搭建服务与配置去pom里面添加依赖,然后在网关中配置文件的路由,然后再去写上传和删除的接口,接口的话写一个文件上传的路径 然后通过byte数据接受文件上传的内容,然后获取文件名称,在掉方法lastindexof()以点为分割获取文件的扩展名,然后在通过substring方法返回一个新的字符串,在以上传得方法 传入得参数去接受上传得文件内容和新的字符串然后返回这个新的字符串。这个字符串就是文件得连接路劲url,这样完成了文件服务的上传、下载、删除。

课程类型管理

类型树
类型树我们使用的是无限级别的方式实现,其中可选有三种方式:分别是递归、嵌套查询、循环+Map。递归的方式会使项目效率降低,每一次都要去查询数据库,代码的可读性也很差,每次递归方法栈都会添加一个栈帧容易导致栈溢出。在三种方式都实现过后,我们选择了使用循环+Map。
代码如下:

private List<CourseType> listChildrenByPid(Long pid){
   
    //查询到pid所有的子类型
    List<CourseType> CourseTypes =
            baseMapper.selectList(new QueryWrapper<CourseType>().eq("pid",pid));
    //递归的出口,没有子类型的时候直接返回空集合
    if(CourseTypes==null||CourseTypes.size()<=0){
   
        return new ArrayList<>();// 建议不要return null
    }
    //向每一个子类行中添加children
    for (CourseType CourseType : CourseTypes) {
   
        List<CourseType> children = listChildrenByPid(

你可能感兴趣的:(java)