苍穹外卖DAY1

技术栈

项目结构

POJO,VO,DTO,Entity

比如说前后端通过json来传输数据,就需要用到DTO。需要展示前端的(列表,表单)数据,就需要VO。entity,dto,vo都属于pojo,只是为了功能的区别二细分。

nginx

反向代理

就是将前端发送的动态请求由 nginx 转发到后端服务器

意义:

  • 提高访问速度(做了数据缓存nginx就直接可把数据返回,不需要真正地访问服务端)

数据缓存就相当于将从前端的数据提前存储到nginx(这里的nginx就相当于一个存储数据的容器)中,让tomcat可以随取随用

把tomcat比作一只小猫,浏览器比作人,nginx相当于猫粮的盆,人通过路径http://localhost/api/employee/login把猫粮放在盆子里面,tomcat通过http://localhost:8080/admin/employee/login把猫粮吃掉,nginx就充当了存储猫粮的角色,

  • 进行负载均衡(把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器)

  • 后端服务安全(后台服务地址不会暴露,所以使用浏览器不能直接访问,可以把nginx作为请求访问的入口

使用例子,nginx.conf配置文件中的相关内容如下:

   server {
        listen       90; # 运行端口
        server_name  localhost;

        # 反向代理,处理管理端发送的请求
        location /api/ {
			proxy_pass   http://localhost:8080/admin/;
            #proxy_pass   http://webservers/admin/;
        }
		
		# 反向代理,处理用户端发送的请求
        location /user/ {
            proxy_pass   http://webservers/user/;
        }

如果用户在浏览器访问http://localhost/api/employee/login,首先是nginx先接收用户的请求,根据nginx.conf配置文件中的配置,转到http://localhost:8080/admin/,所以根据配置/api更换为/admin,最后组装起来的请求地址为http://localhost:8080/admin/employee/login,和后台服务的访问地址一致。

负载均衡

所谓的负载均衡就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。

名称说明实际运用
轮询默认方式适用于后端服务器性能配置完全相同的集群场景
weight权重方式,默认为1,权重越高,被分配的客户端请求就越多适用于服务器性能不均等的场景,如新老服务器混用(新服务器配置高,设置更大权重)
ip_hash依据ip分配方式,这样每个访客可以固定访问一个后端服务适用于需要会话保持的场景,如:购物车系统,用户登录状态维护,文件上传/下载等需要连续会话的业务
least_conn依据最少连接方式,把请求优先分配给连接数少的后端服务适用于处理长连接的场景,如:实时通讯服务(WebSocket),游戏服务器,视频流媒体服务
url_hash依据url分配方式,这样相同的url会被分配到同一个后端服务适用于资源缓存优化的场景,如: 静态资源服务器(图片/CSS/JS)
fair依据响应时间方式,响应时间短的服务将会被优先分配适用于服务器性能差异较大或需要动态调整的场景

使用权重方式进行负载均衡配置:

完善登录功能

密码加密-MD5

代码实现:使用Spring加密工具类-DigestUtils实现

注意MD5是不可逆的

@Service
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeMapper employeeMapper;
    /**
     * 员工登录
     *
     * @param employeeLoginDTO
     * @return
     */
    public Employee login(EmployeeLoginDTO employeeLoginDTO) {
        String username = employeeLoginDTO.getUsername();
        String password = employeeLoginDTO.getPassword();
        //1、根据用户名查询数据库中的数据
        Employee employee = employeeMapper.getByUsername(username);
        //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
        if (employee == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }
        //密码比对
        password = DigestUtils.md5DigestAsHex(password.getBytes()); // 使用 MD5 加密密码
        // 暂略

        //3、返回实体对象
        return employee;
    }
}

MD5可以被破解,所以现在流行的是加盐。解密MD5的网址:MD5在线加密/解密/破解—MD5在线

在线接口

使用接口管理平台Yapi导入与管理接口,利用Swagger(knife4j)生成在线接口调试页面

knife4j常用注解

注解说明
@Api用在类上,例如Controller,表示对类的说明
@ApiModel用在类上,例如entity、DTO、VO
@ApiModelProperty用在属性上,描述属性信息
@ApiOperation用在方法上,例如Controller的方法,说明方法的用途、作用
  • 在pom.xml文件中导入坐标
<!-- knife4j依赖 -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>
  • 在config包下的配置类中添加knife4j配置

@Bean表示由Spring框架创建且管理此对象(Docket);

在apiinfo中创建接口文档的信息,比如标题,版本与描述;

/**
通过knife4j生成接口文档
@return
*/
@Bean // 注解作用 由Spring创建并管理此对象(Docket)
public Docket docket() {
    ApiInfo apiInfo = new ApiInfoBuilder() // apiInfo对象生成接口文档的信息
            .title("苍穹外卖项目接口文档")
            .version("2.0")
            .description("苍穹外卖项目接口文档")
            .build();
    Docket docket = new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo) // 生成接口文档信息
            .select()
            // (重要!)指定接口文档需要扫描的包,扫描controller下的包与方法来生成接口文档
            .apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
            .paths(PathSelectors.any())
            .build();
    return docket;
}
  • 设置静态资源映射,否则接口文档页面无法访问

/**
设置静态资源映射
@param registry
*/
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}

使用例

package com.sky.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(description = "员工登录时传递的数据模型")
public class EmployeeLoginDTO implements Serializable {
    @ApiModelProperty("用户名")
    private String username;
    @ApiModelProperty("密码")
    private String password;
}

### 苍穹外卖 Day1 不支持版本 5 的原因分析与解决方案 #### 问题背景 苍穹外卖系统在不同版本之间可能存在兼容性问题。根据提供的引用内容[^5],可以推测该系统可能在版本升级过程中遇到了一些设计或实现上的限制,导致某些功能无法正常运行。 #### 可能的原因 1. **依赖冲突**:如果苍穹外卖 Day1 使用了特定版本的库或框架(例如 Spring Boot 或 Redis),而版本 5 引入了不兼容的依赖项,则可能导致功能异常。 2. **API 变更**:版本 5 中的某些 API 可能发生了变化,导致 Day1 中的代码无法正确调用这些接口。 3. **事务管理问题**:根据引用[^2]提到的事务知识,如果版本 5 修改了事务的配置方式或行为,可能会导致原有逻辑失效。 4. **缓存机制冲突**:引用[^2]中提到了 Spring Cache 和 Redis 的集成。如果版本 5 对缓存机制进行了调整,可能导致缓存相关功能无法正常工作。 5. **全局异常处理的变化**:引用[^5]中描述了全局异常处理器的设计。如果版本 5 修改了异常处理的方式,可能会导致原有的异常捕获逻辑失效。 #### 解决方案 以下是针对上述可能原因提出的解决方案: 1. **检查依赖冲突**: - 使用工具(如 Maven Dependency Plugin)分析项目中的依赖关系,确保没有版本冲突。 - 如果发现冲突,尝试将相关依赖升级到与版本 5 兼容的版本。 2. **适配 API 变更**: - 查阅版本 5 的官方文档,了解其与旧版本之间的差异。 - 修改代码以适配新的 API 接口。 3. **调整事务管理**: - 检查版本 5 的事务配置是否发生变化。 - 根据需要更新事务注解(如 `@Transactional`)的配置。 4. **优化缓存机制**: - 确保缓存相关的注解(如 `@Cacheable` 和 `@CacheEvict`)与版本 5 的缓存策略一致。 - 如果版本 5 改变了缓存的默认行为,可以在配置文件中显式指定缓存策略。 5. **更新异常处理逻辑**: - 检查版本 5 的异常处理机制是否有变化。 - 如果有变化,修改全局异常处理器的代码以兼容新机制。 #### 示例代码 以下是一个示例代码片段,展示如何通过 Maven Dependency Plugin 检查依赖冲突: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <goals> <goal>tree</goal> </goals> </execution> </executions> </plugin> ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值