f 云原生-如何高效地架构一个Java项目 - Powered by qidao123.com技术社区

如何高效地架构一个Java项目

打印 上一主题 下一主题

主题 1724|帖子 1724|积分 5172

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

        Java是企业级应用开发的主流语言之一,而我们作为使用Java语言的程序员,职称有初级、中级、高级、资深、司理、架构,但我们往往只是逐步通过履历的积聚迭代了自己的等级,假如没有保持学习的习惯,大多数程序员会停顿在靠近高级的位置,简单来讲就是CRUD工程师,小编不甘心于此,以是长期保持学习新知识的习惯,尝试许多大于自身能力的事故,我信赖未来的某一天我会感谢曾经努力的自己,下面的内容是我在尝试架构项目时总结的履历,希望能帮助到大家
前期准备



  • 需求分析:明确项目的功能需求
  • 技能选型:

    • Java版本

      • 8,17

    • 框架选择

      • 应用:Spring,SpringBoot,SpringCloud
      • ORM(对象关系映射):JPA,MyBatis(Plus)

    • 数据库选择

      • 关系型:MySQL,PostgreSQL,Oracle
      • 非关系型:Redis,MongoDB
      • 时序数据库(物联网物联网):TDengine,IoTDB

    • 构建工具

      • Maven,Gradle


项目结构计划



  • 分层架构

    • 认证授权
    • 控制层
    • 业务层
    • 数据层

  • 模块分别

    • 按功能分别
    • 按业务分别

简单示例

        跳过项目的功能需求分析(具体项目具体分析),技能选型,Java版本选择17,应用框架选择SpringBoot,ORM(对象关系映射)框架选择MyBatis-Plus,数据库选择MySQL 8.x,构建工具选择Maven,项目结构,拦截器中完成认证授权,控制层吸收用户哀求调用业务层的方法,业务层处理惩罚逻辑调用数据层的方法,数据层与数据库交互,跳过模块分别(具体项目具体分析)
准备开发环境

1.下载安装配置Java17

访问官方的下载地址:Java Archive Downloads - Java SE 17
1.下载并解压 


2.配置环境变量

我的电脑 -> 属性 -> 高级系统设置 -> 环境变量 ->系统变量(S) -> 新建(W)

双击系统变量(S)中的Path -> 新建(N) 

确定后打开命令提示符界面(快捷键 win+R 输入 cmd 回车),输入java -version命令检察是否安装乐成

2.下载安装MySQL 8.x

访问官方的下载地址:MySQL :: Download MySQL Installer (Archived Versions)
参考文章:【MySQL8.0.39下载安装】_mysql8.0.39.0安装教程-CSDN博客 
架构项目

1.创建SpringBoot项目 


2.创建包/文件结构



3.认证与授权 

        起首确定使用什么尺度和框架进行认证与授权,常见的尺度有:OAuth 2.0,JWT,常见的框架有:Spring Security,Apache Shiro,我采用的是近几年很火的轻量级框架:SaToken,如何集成可以参考我的另一篇文章:Java集成Sa-Token进行认证与授权_基于satoken的 sop-CSDN博客
4.创建数据库、用户表(含索引)

  1. DROP DATABASE IF EXISTS `muze`;
  2. CREATE DATABASE `muze` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  3. SET NAMES utf8mb4;
  4. SET FOREIGN_KEY_CHECKS = 0;
  5. USE `muze`;
  6. DROP TABLE IF EXISTS `t_user`;
  7. CREATE TABLE `t_user` (
  8.     id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  9.     username VARCHAR(30) COLLATE utf8mb4_0900_bin NOT NULL COMMENT '用户名',
  10.     password VARCHAR(255) COLLATE utf8mb4_0900_bin NOT NULL COMMENT '密码',
  11.     PRIMARY KEY (id)
  12. ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
  13. CREATE INDEX idx_username ON t_user(username);
复制代码
5.创建用户实体

        为了方便实体类的编写,我们引入依赖 - 小辣椒
  1. <!-- 小辣椒 -->
  2. <dependency>
  3.     <groupId>org.projectlombok</groupId>
  4.     <artifactId>lombok</artifactId>
  5. </dependency>
复制代码
  1. /**
  2. * 用户实体
  3. * @author muze
  4. */
  5. @Data
  6. @TableName("t_user")
  7. public class User implements Serializable {
  8.     @Serial
  9.     private static final long serialVersionUID = 684552117916625567L;
  10.     /**
  11.      * 主键
  12.      */
  13.     @TableId(type = IdType.AUTO)
  14.     private Long id;
  15.     /**
  16.      * 账号
  17.      */
  18.     private String username;
  19.     /**
  20.      * 密码
  21.      */
  22.     private String password;
  23. }
复制代码
6.创建用户数据层

       技能选型时数据库是MySQL,ORM(对象关系映射)框架是MyBatis-Plus,因此引入对应依赖
  1. <!-- MySQL -->
  2. <dependency>
  3.     <groupId>com.mysql</groupId>
  4.     <artifactId>mysql-connector-j</artifactId>
  5.     <version>8.0.33</version>
  6. </dependency>
  7. <!-- MyBatis-Plus -->
  8. <dependency>
  9.     <groupId>com.baomidou</groupId>
  10.     <artifactId>mybatis-plus-boot-starter</artifactId>
  11.     <version>3.5.7</version>
  12. </dependency>
复制代码
在启动类上打MyBatis-Plus提供的@MapperScan("MyBatis Mapper 接口包路径"),自动扫描指定包下的 MyBatis Mapper 接口,并将它们注册为 Spring 容器中的 Bean
  1. /**
  2. * 启动类
  3. * @author muze
  4. */
  5. @MapperScan("com.muze.project.mapper")
  6. @SpringBootApplication
  7. public class ProjectApplication {
  8.     public static void main(String[] args) {
  9.         SpringApplication.run(ProjectApplication.class, args);
  10.     }
  11. }
复制代码
在配置文件application.yml中添加数据库连接信息
  1. spring:
  2.   datasource:
  3.     url: jdbc:mysql://localhost:3306/muze?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
  4.     username: 你的用户名
  5.     password: 你的密码
  6.     driver-class-name: com.mysql.cj.jdbc.Driver
复制代码
用户数据层
  1. /**
  2. * 用户数据层
  3. * @author muze
  4. */
  5. public interface UserMapper extends BaseMapper<User> {
  6. }
复制代码
7.创建用户业务层

        我习惯将业务层分离为接口层和实现层,以是我会在sevice包下创建一个impl包,假如你不习惯可以只编写实现层,编写用户登录方法前必要定义方法入参和返回值
入参:哀求实体(用户名 + 暗码)
返回值:登录结果
创建DTO(哀求实体)
  1. /**
  2. * 用户登录请求实体
  3. * @author muze
  4. */
  5. @Data
  6. public class UserLoginDTO implements Serializable {
  7.     @Serial
  8.     private static final long serialVersionUID = -1706553212610156227L;
  9.    
  10.     /**
  11.      * 用户名
  12.      */
  13.     private String username;
  14.     /**
  15.      * 密码
  16.      */
  17.     private String password;
  18. }
复制代码
用户登录业务接口层和实现层
  1. /**
  2. * 用户业务接口层
  3. */
  4. public interface IUserService {
  5.     /**
  6.      * 登录
  7.      * @param userLoginDTO 用户登录请求实体
  8.      * @return 登录结果
  9.      */
  10.     String login(UserLoginDTO userLoginDTO);
  11. }
复制代码
  1. /**
  2. * 用户业务实现层
  3. * @author muze
  4. */
  5. @Service
  6. public class UserServiceImpl implements IUserService {
  7.     /**
  8.      * 注入用户数据层
  9.      */
  10.     @Autowired
  11.     private UserMapper userMapper;
  12.     @Override
  13.     public String login(UserLoginDTO userLoginDTO) {
  14.         // 取出用户名和密码
  15.         String username = userLoginDTO.getUsername();
  16.         String password = userLoginDTO.getPassword();
  17.         // 构建查询条件
  18.         LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<User>().eq(User::getUsername, username);
  19.         // 查询用户
  20.         User user = userMapper.selectOne(userLambdaQueryWrapper);
  21.         // 如果用户为空或者输入密码与用户密码不匹配则返回:用户名或密码错误
  22.         if (user == null || !password.equals(user.getPassword())) return "用户名或密码错误";
  23.         // 使用SaToken的工具类StpUtil调用登录方法login,入参:用户id
  24.         StpUtil.login(user.getId());
  25.         // 返回:登录成功
  26.         return "登录成功";
  27.     }
  28. }
复制代码
8.创建用户控制层

        编写控制层前我们要先确定哀求路径,哀求方式,哀求参数,响应数据
哀求路径:/user/login
哀求方式:POST
哀求参数:用户名 + 暗码
响应数据:响应码 + 响应消息 + 响应数据
DTO(哀求实体)已经在编写用户业务层时创建好了
VO(响应实体)使用SaToken提供的SaResult
  1. /**
  2. * 用户控制层
  3. */
  4. @RestController
  5. @RequestMapping("/user")
  6. public class UserLogin {
  7.     /**
  8.      * 注入用户业务接口层
  9.      */
  10.     @Autowired
  11.     private IUserService userService;
  12.     /**
  13.      * 登录
  14.      * @param userLoginDTO 用户登录请求实体
  15.      * @return 响应码 + 响应消息 + 响应数据
  16.      */
  17.     @PostMapping("/login")
  18.     public SaResult login(@RequestBody UserLoginDTO userLoginDTO) {
  19.         return SaResult.ok(userService.login(userLoginDTO));
  20.     }
  21. }
复制代码
测试

编写sql语句新增一条用户信息用于测试登录
  1. INSERT INTO t_user (username, password) VALUES ("muze", "123456");
复制代码
启动项目,使用接口调试工具测试登录功能

端口默认为8080 

可以发现,Cookie中放入了一个令牌
 

        到此,一个拥有底子功能:登录,认证与授权的Java项目就架构完成了,后续就是按照功能需求分别模块进行开发了,希望能对你有所帮助!
彩蛋:你肯定也发现了,暗码并没有进行加密解密,固然在HTTPS协议中Post哀求会对传输数据加密,但在HTTP协议中Post哀求不会对传输数据加密,因此我们还应该对数据传输进行加密,小编会在后续更新一篇与数据加密相关的文章,敬请等候

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表