其他分享
首页 > 其他分享> > HRM项目总结

HRM项目总结

作者:互联网

HRM项目总结

一、Git

1.git的介绍

Git和SVN类似,都是版本控制的工具,用作项目的协同开发,不同的是,SVN是集中式的版本控制工
具,Git是分布式的版本控制工具

2.git的使用

①将新写的代码git add

②执行git commit,进行代码的提交,提交到本地

③推送【git push】

④拉取【git pull】

3.git图形化界面操作

TortoiseGIT

Idea使用Git

4.冲突的处理

和svn类型,svn冲突后会有多个版本文件,但是git不会产生多个版本文件,我们只需要更改冲突的文
件后,标记为“解决”,再提交代码就OK了,其他和svn解决冲突一模一样。

5.Git的远程仓库

GitLab

二、搭建后端项目结构

1.注册中心Eureka

1.1.依赖

<!--eureka服务端的场景启动器-->
<dependencies> 
     <dependency> 
         <groupId>org.springframework.cloud</groupId> 
         <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> 

1.2.配置

server: 
	port: 8761 
eureka: 
	instance: 
		hostname: localhost 
	client: 
		registerWithEureka: false 
		fetchRegistry: false 
		serviceUrl: 
			defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机版

1.3.启动类

@SpringBootApplication 
@EnableEurekaServer 
public class EurekaServerApplication { 
    public static void main(String[] args) { 							             			SpringApplication.run(EurekaServerApplication.class,args);
   } 
}

2.配置中心服务端

2.1.创建一个springboot项目,只保留resources,存放配置文件

2.2.依赖

<!--配置中心服务端场景启动器-->
<dependencies>  
    <dependency> 
        <groupId>org.springframework.cloud</groupId> 
        <artifactId>spring-cloud-config-server</artifactId> 
    </dependency> 
    <!--eureka-client的场景启动器--> 
    <dependency>
        <groupId>org.springframework.cloud</groupId> 
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

2.3.配置

server:
  port: 6969

#springcloud从本地读取配置文件
#spring:
#  cloud:
#    config:
#      server:
#        native:
#          search-locations: D:/itsource/workspace/hrm-config/src/main/resources
#  profiles:
#    active: native
spring:
  application:
      name: CONFIG-SERVER
  #从gitee中拉取配置文件
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/solargen_admin/hrm-config.git #git仓库的路径
          searchPaths: src/main/resources #从仓库路径中哪个目录中加载

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    instance-id: config-server:6969 #服务实例的标识
    prefer-ip-address: true #以ip注册

2.4.启动类

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class,args);
    }

}

3.网关

3.1.依赖

<dependencies>
    <!--网关的场景启动器-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    <!--eureka-client的场景启动器-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--配置中心客户端-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
</dependencies>

2.2.配置

#配置中心客户端配置
spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG-SERVER
      name: application-zuul
      profile: dev

#eureka客户端配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

配置文件仓库中:application-zuul-dev.yml

server:
  port: 1299
spring:
  application:
    name: ZUUL-SERVICE
eureka:
  instance:
    instance-id: zuul-service:1299 #服务实例的标识
    prefer-ip-address: true #以ip注册
zuul:
  ignored-services: "*"
  prefix: /servies
#路由配置
  routes:
    user:
      path: /myusers/**
      serviceId: users

2.3.启动类

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class,args);
    }

}

三、Mybatis-Plus

mybatis-plus是使用mybatis的工具,无缝的整合到mybatis的项目中,只做增强,不做改变,如丝般顺滑。

1.mybatis-plus的核心

(1)CRUD接口

(2)条件构造器

(3)分页插件

(4)代码生成器

四、租户入驻

1.租户入驻的流程

前端展示一个租户入驻的页面,填写租户的基本信息和选购的套餐,将参数传递到后端,把租户信息插入到租户表,再将租户信息里面的用户名和密码和刚刚返回的租户主键插入员工表,然后再将返回的员工表主键插入到租户表,最后再将租户主键和租户信息里面的套餐id插入到租户-套餐中间表,这个业务需要加入事务管理,需要保证事务一致性。

2.租户logo上传(分布式文件系统fastdfs)

2.1.fastdfs的架构原理【tracker storager】

2.2.使用fastdfs实现文件上传的流程

五、课程类型管理+redis中央缓存

1.类型树,获取无线级别的课程类型实现方式

2.redis优化课程类型

3.redis缓存的流程

①接收到前端请求课程类型的请求后直接查询redis;

②判断缓存中的数据是否存在;

③如果存在,直接返回数据;

④如果不存在,从数据库中查询数据,将查出来的数据同步到redis中后再返回给前端。

4.redis遇到的问题

4.1.缓存穿透

(1)案例:

​ 将用户信息缓存到redis中,使用用户的id作为key,我们知道,id通常不为负数,如果某些人发送大量请求访问id=-1的用户信息,缓存中查询不到,会直接查询数据库。如果并发量很高,则这种现象直接穿透了redis缓存,大量请求直接访问数据库,会压垮数据库,造成数据库宕机。

(2)解决方案:

4.2.缓存击穿

(1)案例:

​ 同时大量请求访问某一个key,而这个key由于刚刚过期或者redis刚刚启动缓存中还没有,造成大量的请求访问数据库

(2)解决方案:

​ 同步代码块+双重校验所

@Override
public List<CourseType> loadDataTree() {

    //1、从缓存中获取数据
    AjaxResult result = redisClient.getStr(KEY);
    if(!result.isSuccess()){
        return null;
    }
    //2、判断缓存中的数据是否存在
    String courseTypes = (String) result.getResultObj();
    if(StringUtils.isEmpty(courseTypes)){
        //缓存不存在
        synchronized (this){
            result = redisClient.getStr(KEY);
            if(!result.isSuccess()){
                return null;
            }
            courseTypes = (String) result.getResultObj();
            if(StringUtils.isEmpty(courseTypes)){
                logger.debug("缓存中没有数据,查询数据库并缓存......");
                List<CourseType> courseTypeList = null;
                //4、如果不存在,则查询数据库,将查询结果缓存到redis中
                courseTypeList = loopMapCourseTypes();
                try {
                    //模拟这边业务要执行2000ms
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String jsonString = JSONArray.toJSONString(courseTypeList);
                redisClient.setStr(KEY,jsonString);
                //5、再将结果返回
                return courseTypeList;
            }
        }
    }

    logger.debug("从缓存中获取到了数据......");
    //3、如果存在,则将缓存中获取的数据直接返回 - fastjson
    List<CourseType> courseTypeList = JSONArray.parseArray(courseTypes, CourseType.class);
    return courseTypeList;

}

4.3.缓存雪崩

(1)案例

在同一时间,大量的缓存失效,导致查询这些缓存的请求都会访问DB,造成DB压力过大;

和缓存击穿不同的是,缓存击穿是“热点数据”失效(某几个key),

而缓存雪崩是大量的key同一时间失效。

比如,项目启动,从数据库中加载所有的用户信息,我们设置相同的过期时间,时间到后,这些用户全部过期了,查询所有的用户的请求都要访问数据库(缓存雪崩)

(2)解决方案

让过期时间均匀分布(过期时间与随机值配合,在一段时间内依次过期)

六、课程的上下线+ElasticSearch

1.课程上下线业务简述

2.项目中为什么使用elasticsearch,解决了什么问题

七、页面静态化

页面静态化业务流程

发送短信验证码的业务流程

单点登录的解决方案,单点登录时如何实现的

Zuul网关在微服务中的作用

标签:总结,缓存,请求,项目,redis,用户,HRM,类型,cloud
来源: https://blog.csdn.net/weixin_46241579/article/details/105589620