您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

我在前端写Java SpringBoot项目

时间:2023-10-17 12:11:23  来源:  作者:OSC开源社区

作者 | 京东云开发者-京东零售 周明亮

原文链接:https://my.oschina.NET/u/4090830/blog/10116557

前言

玩归玩,闹归闹,别拿 C端 开玩笑!这里不推荐大家把 Node 服务作为 C 端服务,毕竟它是单线程多任务 机制。这一特性是 JAVA 语言设计之初,就决定了它的使命 - Java >>>【】,这里就不多解释了,大家去看看 Java 的历史就知道啦~这也就决定了,它不能像后端语言那样 多线程多任务,用户访问量小还能承受,一旦承受访问量大高并发,就得凉凉~

那为什么我们还要去写 Node 服务?主要是方便快捷,对于小项目可以迅速完成建设,开发成本小。其次,主要通过写 Nest 完成下面收获:

  • 学习装饰器语法,感受其简洁优美;
  • 自己学习一门新的开发框架,感受不同框架的优缺点,为以后开发选型打基础;
  • 感受服务端排查问题的复杂性,找找前端设计的灵感。

本篇文章主要是使用 NestJs + Sequelize + MySQL 完成基础运行, 带大家了解 Node 服务端的基础搭建,也可以顺便看看 Java SpringBoot 项目的基础结构,它俩真的非常相似,不信你去问服务端开发同学。

养成好习惯,看文章先一键三连~【点赞,关注,转发】,评论可以看完再吐槽~继续完善填坑~

第一步、项目跑起来

在选择服务端的时候,我之前使用过 Egg.js ,所以这次就不选它了。其次,Egg 也是继承了 Koa 的开发基础,加上 Express 也是基于 Koa 上创新的,两者应该差不多,就不选择 Koa 和 Express 。

所以,我想尝试下 Nest.js 看语法跟 Java 是一样的,加上之前也自己开发过 Java + SpringBoot 的项目,当然更古老的 SSH 2.0 也从无到有搭建过,即:Spring2.0 + Struts2+ Hibernate3.2,想想应该会很容易上手,顺便怀旧下写写。

参考文档:

  • https://www.geeksforgeeks.org/best-nodejs-frameworks-for-App-development/
  • https://anywhere.epam.com/business/best-node-js-frameworks

说下我的想法,首先我们刚入门,估计会有一堆不清楚的坑,我们先简单点,后续我们再继续加深。既然要搞服务端,要搞就多搞点,我们都去尝鲜玩玩。我们打算使用 Nest 作为前端框架,Graphql 作为中间处理层。底层数据库我们用传统的 MySQL,比较稳定可靠,而且相对比较熟悉,这个就不玩新的了,毕竟数据库是一切的基石 。

说下我们具体实现步骤:

1.【必须】没有任何数据库,完成接口请求运行,能够跑起来;

2.【必须】创建基础数据库 MySQL ,接入 @nestjs/sequelize 库 完成 增删改查 功能即:CRUD

3.【可选】打算采取 Graphql 处理 API 查询,做到精确数据查询,这个已经火了很多了,但是真正使用的很少,我们打算先感受下,后续可以直接用到业务。

4.【可选】接入 Swagger 自动生成 API 文档,快捷进行前端与后端服务联调测试。

◦Swagger 是一个开源工具,用于设计、构建、记录和使用 RESTful web 服务。

5.【可选】接口请求,数据库优化处理

◦请求分流,数据库写入加锁,处理并发流程

◦增加 middleware 中间件统一处理请求及响应,进行鉴权处理,请求拦截等操作

◦数据库分割备份,数据库融灾处理,分为:主、备、灾

◦数据库读写分离,数据双写,建立数据库缓存机制,使用 redis 处理

也欢迎大家补充更多的优化点,我们一起探讨~有兴趣可以帮忙补充代码哈~

确定了大概方向,我们就开始整。先不追求一步到位,否则越多越乱,锦上添花的东西,我们可以后续增加,基础功能我们要优先保障完成。Nest.js 官网:https://docs.nestjs.com/ ,话不多说,我们直接开整。

# 进入文件夹目录

cdfull-stack-demo/packages

# 安装脚手架

npmi -g @nestjs/cli

# 创建基础项目

nestnew node-server-demo

# 进入项目

cdnew node-server-demo

# 运行项目测试

npmrun start:dev

我们移除一些不需要的东西,先简单再复杂,别把自己搞晕了。接下来写一个简单示例感受下这个框架,之后完整的代码,我会公布在后面。废话不多说,开整!调整后目录结构:

•common- 公用方法类

•config- 配置类文件

•controller- 控制器,用于处理前端发起的各类请求

•service- 服务类,用于处理与数据库交互逻辑

•dto- DTO(Data Transfer Object)可以用于验证输入数据、限制传输的字段或格式。

•entities- 实体类,用于描述对象相关的属性信息

•module- 模块,用于注册所有的服务类、控制器类,类似 Spring 里面的 bean

◦这里不能完全等同哈,两个实现机制上就不同,只是帮助大家理解。

•mAIn.ts- nest 启动入口

•types- type 相关声明类型

我在前端写Java SpringBoot项目

只是写 demo, 搞快点就没有怎么写注释了,我感觉是一看就懂了,跟 Java SpringBoot 的写法非常一致,部分代码展示:

  • 控制器 controller
// packages/node-server-demo/src/controller/user/index.ts

import{Controller,Get,Query }from'@nestjs/common';

importUserServices from'@/service/user';

import{GetUserDto,GetUserInfoDto }from'@/dto/user';

@Controller('user')

exportclassUserController{

constructor(privatereadonlyuserService:UserServices){}

// Get 请求 user/name?name=bricechou

@Get('name')

asyncfindByName(@QuerygetUserDto:GetUserDto){

returnthis.userService.read.findByName(getUserDto.name);

}

// Get 请求 user/info?id=123

@Get('info')

asyncfindById(@QuerygetUserInfoDto:GetUserInfoDto){

constuser =awaitthis.userService.read.findById(getUserInfoDto.id);

return{gender:user.gender,job:user.job };

}

}

// packages/node-server-demo/src/controller/log/add.ts

import{Controller,Post,Body }from'@nestjs/common';

import{AddLogDto }from'@/dto/log';

importLogServices from'@/service/log';

@Controller('log')

exportclassCreateLogController{

constructor(privatereadonlylogServices:LogServices){}

// post('/log/add')

@Post('add')

create(@BodycreateLogDto:AddLogDto){

returnthis.logServices.create.create(createLogDto);

}

}

  • 数据转换 Data Transfer Object
// packages/node-server-demo/src/dto/user.ts

exportclassCreateUserDto{

name:string;

age:number;

gender:string;

job:string;

}

// 可以分开写,也可以合并

exportclassGetUserDto{

id?:number;

name:string;

}

// 可以分开写,也可以合并

exportclassGetUserInfoDto{

id:number;

}

  • service 数据库交互处理类
// packages/node-server-demo/src/service/user/read.ts

import{Injectable }from'@nestjs/common';

import{User }from'@/entities/User';

@Injectable

exportclassReadUserService{

constructor{}

asyncfindByName(name:string):Promise<User>{

// 可以处理判空,从数据库读取/写入数据,可能会被多个 controller 进行调用

console.info('ReadUserService findByName > ',name);

returnPromise.resolve({id:1,name,job:'程序员',gender:1,age:18});

}

asyncfindById(id:number):Promise<User>{

console.info('ReadUserService findById > ',id);

returnPromise.resolve({

id:1,

name:'BriceChou',

job:'程序员',

gender:1,

age:18,

});

}

}

  • module 模块注册,服务类 / 控制类
//packages/node-server-demo/src/module/user.ts

import{Module }from'@nestjs/common';

importUserService,{ReadUserService }from'@/service/user';

import{UserController }from'@/controller/user';

@Module({

providers:[UserService,ReadUserService],

controllers:[UserController],

})

exportclassUserModule{}

//packages/node-server-demo/src/module/index.ts 根模块注入

import{Module }from'@nestjs/common';

import{UserModule }from'./user';

import{LogModule }from'./log';

@Module({

imports:[

UserModule,

LogModule,

],

})

exportclassAppModule{}

  • main.js 启动注册的所有类
// packages/node-server-demo/src/main.ts

import{ AppModule } from'@/module';

import{ NestFactory } from'@nestjs/core';

import{ NestExpressApplication } from'@nestjs/platform-express';

asyncfunctionbootstrap{

constapp = awaitNestFactory.create<NestExpressApplication>(AppModule);

// 监听端口 3000

awaitapp.listen(3000);

}

bootstrap;

这样一个单机的服务器就启动起来了,我们可以使用 Postwoman[https://hoppscotch.io/] 进行请求,瞅瞅看返回效果。

我在前端写Java SpringBoot项目

我在前端写Java SpringBoot项目

控制台也收到日志了,后面可以把这些日志请求保留成 .log 文件,这样请求日志也有了,完美!下一步,我们开始连接数据库,这样就不用单机玩泥巴了~

第二步、配置 MySQL

MySQL 安装其实很简单,我电脑是 mac 的,所以下面的截图都是以 mac 为例,先下载对应的数据库。

下载地址:https://dev.mysql.com/downloads/mysql/ 至于其他系统的,可以网上找教程,这个应该烂大街了,我就不重复搬运教程了。

  • 注意:安装的数据库,一定要设置密码,连接数据库必须要有密码,否则会导致连接数据库失败。
  • MySQL 我们只安装数据库就行,熟悉指令的童鞋,就直接命令行操作就行。
  • 不熟悉的话,那就下载图形化管理工具。

◦Mysql 官方控制台 https://dev.mysql.com/downloads/workbench/

windows 也可以使用 https://www.heidisql.com/download.php?download=installer

PS:安装 workbench 时发现要求 MacOS 13以上,我的电脑是 MacOS 12。

白白下载,所以只能 https://downloads.mysql.com/archives/workbench/ 从归档里面找低版本 8.0.31。对于数据库服务也有版本要求,大家按照自己电脑版本,选择支持的版本即可。 https://downloads.mysql.com/archives/community/。我这边选择的是默认最新版本:8.0.34,下载好直接安装,一路 Next 到底,记住自己输入的 Root 密码!!!

确认好当前数据库是否已经运行起来了,启动 Workbench 查看状态。

我在前端写Java SpringBoot项目

1.创建数据库

我在前端写Java SpringBoot项目

数据库存在字符集选择,不同的字符集和校验规则,会对存储数据产生影响,所以大家可以自行查询,按照自己存储数据原则选择,我这里默认选最广泛的。确认好,就选择右下角的应用按钮。

2.创建表和属性

我在前端写Java SpringBoot项目

选项解答:

•PRIMARY KEY是表中的一个或多个列的组合,它用于唯一标识表中的每一行。

•Not NULL和 Unique就不解释,就是直译的那个意思。

•GENERATED生成列是表中的一种特殊类型的列,它的值不是从插入语句中获取的,而是根据其他列的值通过一个表达式或函数生成的。

CREATETABLEpeople (

first_name VARCHAR(100),

last_name VARCHAR(100),

full_name VARCHAR(200)AS(CONCAT(first_name,' ',last_name))

);

  • UNSIGNED 这个数值类型就只能存储正数(包括零),不会存储负数。
  • ZEROFILL 将数值类型的字段的前面填充零,他会自动使字段变为 UNSIGNED,直到该字段达到声明的长度,如:00007
  • BINARY 用于存储二进制字符串,如声明一个字段为 BINARY (5),那么存储在这个字段中的字符串都将被处理为长度为 5 的二进制字符串。

◦如尝试存储一个长度为 3 的字符串,那么它将在右侧用两个空字节填充。

◦如果你尝试存储一个长度为 6 的字符串,那么它将被截断为长度为 5

◦主要用途是存储那些需要按字节进行比较的数据,例如加密哈希值

  • 此外也可顺手传创建一个索引,方便快速查找。
CREATETABLE`rrweb`.`test_sys_req_log`(

`id`INTUNSIGNEDNOTNULLAUTO_INCREMENT,

`content`TEXTNOTNULL,

`l_level`INTUNSIGNEDNOTNULL,

`l_category`VARCHAR(255)NOTNULL,

`l_created_at`TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,

`l_updated_at`TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,

PRIMARYKEY(`id`),

UNIQUEINDEX`id_UNIQUE`(`id`ASC)VISIBLE,

INDEX`table_index`(`l_level`ASC,`l_category`ASC,`l_time`ASC)VISIBLE);

3.连接数据库

由于目前 node-oracledb 官方尚未提供针对 Apple Silicon 架构的预编译二进制文件。导致我们无法在 Mac M1 芯片上使用 TypeORM 链接数据库操作,它目前只支持 Mac x86 芯片。哎~折腾老半天,查阅各种文档,居然有这个坑,没关系我们换个方式打开。

我们不得不放弃,从而选用 https://docs.nestjs.com/techniques/database#sequelize-integration 哐哐哐~一顿操作猛如虎,盘它!

  • 安装 Sequelize
# 安装连接库

npminstall --save @nestjs/sequelize sequelize sequelize-type mysql2

# 安装 type

npminstall --save-dev @types/sequelize

  • 配置数据库基础信息
// packages/node-server-demo/src/module/index.ts

import{Module }from'@nestjs/common';

import{UserModule }from'./user';

import{LogModule }from'./log';

import{Log }from'@/entities/Log';

import{SequelizeModule }from'@nestjs/sequelize';

@Module({

imports:[

SequelizeModule.forRoot({

dialect:'mysql',

// 按数据库实际配置

host:'127.0.0.1',

// 按数据库实际配置

port:3306,

// 按数据库实际配置

username:'root',

// 按数据库实际配置

password:'hello',

// 按数据库实际配置

database:'world',

synchronize:true,

models:[Log],

autoLoadModels:true,

}),

LogModule,

UserModule,

],

})

exportclassAppModule{}

  • 实体与数据库一一映射处理
import{getNow }from'@/common/date';

import{

Model,

Table,

Column,

PrimaryKey,

DataType,

}from'sequelize-type';

@Table({tableName:'test_sys_req_log'})

exportclassLogextendsModel<Log>{

@PrimaryKey

@Column({

type:DataType.INTEGER,

autoIncrement:true,

field:'id',

})

id:number;

@Column({field:'content',type:DataType.TEXT})

content:string;

@Column({field:'l_level',type:DataType.INTEGER})

level:number;// 3严重,2危险,1轻微

@Column({field:'l_category'})

category:string;// 模块分类/来源分类

@Column({

field:'l_created_at',

type:DataType.NOW,

defaultValue:getNow,

})

createdAt:number;

@Column({

field:'l_updated_at',

type:DataType.NOW,

defaultValue:getNow,

})

updatedAt:number;

}

  • module 注册实体
//packages/node-server-demo/src/module/log.ts

import{Module }from'@nestjs/common';

import{SequelizeModule }from'@nestjs/sequelize';

import{Log }from'@/entities/Log';

importLogServices,{

CreateLogService,

UpdateLogService,

DeleteLogService,

ReadLogService,

}from'@/service/log';

import{

CreateLogController,

RemoveLogController,

UpdateLogController,

}from'@/controller/log';

@Module({

imports:[SequelizeModule.forFeature([Log])],

providers:[

LogServices,

CreateLogService,

UpdateLogService,

DeleteLogService,

ReadLogService,

],

controllers:[CreateLogController,RemoveLogController,UpdateLogController],

})

exportclassLogModule{}

  • service 操作数据库处理数据
import{Log }from'@/entities/Log';

import{Injectable }from'@nestjs/common';

import{AddLogDto }from'@/dto/log';

import{InjectModel }from'@nestjs/sequelize';

import{ResponseStatus }from'@/types/BaseResponse';

import{getErrRes,getSucVoidRes }from'@/common/response';

@Injectable

exportclassCreateLogService{

constructor(

@InjectModel(Log)

privatelogModel:typeofLog,

){}

asynccreate(createLogDto:AddLogDto):Promise<ResponseStatus<null>>{

console.info('CreateLogService create > ',createLogDto);

const{level =1,content ='',category ='INFO'}=createLogDto ||{};

conststr =content.trim;

if(!str){

returngetErrRes(500,'日志内容为空');

}

constitem ={

level,

category,

// Tips: 为防止外部数据进行数据注入,我们可以对内容进行 encode 处理。

// content: encodeURIComponent(str),

content:str,

};

awaitthis.logModel.create(item);

returngetSucVoidRes;

}

}

一路操作猛如虎,回头一看嘿嘿嘿~终于,我们收到了来自外界的第一条数据! hello world!

我在前端写Java SpringBoot项目

我在前端写Java SpringBoot项目

连接及创建数据成功!此时已经完成基础功能啦~

第三步、实现 CRUD 基础功能

剩下的内容,其实大家可以自行脑补了,就是调用数据库的操作逻辑。先说说什么是 CRUD

  • C create 创建
  • R read 读取
  • U update 更新
  • D delete 删除

下面给个简单示例,大家看看,剩下就去找文档,实现业务逻辑即可:

import{Injectable }from'@nestjs/common';

import{InjectModel }from'@nestjs/sequelize';

import{User }from'./user.model';

@Injectable

exportclassUserService{

constructor(

@InjectModel(User)

privateuserModel:typeofUser,

){}

// 创建新数据

asynccreate(user:User){

constnewUser =awaitthis.userModel.create(user);

returnnewUser;

}

// 查找所有数据

asyncfindAll{

returnthis.userModel.findAll;

}

// 按要求查找单个

asyncfindOne(id:string){

returnthis.userModel.findOne({where:{id }});

}

// 按要求更新

asyncupdate(id:string,user:User){

awaitthis.userModel.update(user,{where:{id }});

returnthis.userModel.findOne({where:{id }});

}

// 按要求删除

asyncdelete(id:string){

constuser =awaitthis.userModel.findOne({where:{id }});

awaituser.destroy;

}

}

Tips: 进行删除的时候,我们可以进行假删除,两个数据库,一个是备份数据库,一个是主数据库。主数据库可以直接删除或者增加标识表示删除。备份数据库,可以不用删除只写入和更新操作,这样可以进行数据还原操作。

此外,为了防止 SQL 数据库注入,大家需要对数据来源进行统一校验处理或者直接进行 encode 处理,对于重要数据可以直接进行 MD5 加密处理,防止数据库被直接下载泄露。关于 SQL 数据库的安全处理,网上教程有很多,大家找一找就可以啦~

部署就比较简单了,我们就不需要一一赘述了,数据库可以用集团提供的云数据库,而 Nest 就是普通的 node 部署。



Tags:SpringBoot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: SpringBoot  点击:(9)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: SpringBoot  点击:(86)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: SpringBoot  点击:(90)  评论:(0)  加入收藏
公司用了六年的 SpringBoot 项目部署方案,稳得一批!
本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作。 profiles指定不同环境的配置 maven-assembly-plugin打发布压...【详细内容】
2024-01-10  Search: SpringBoot  点击:(163)  评论:(0)  加入收藏
简易版的SpringBoot是如何实现的!!!
SpringBoot作为目前最流行的框架之一,同时是每个程序员必须掌握的知识,其提供了丰富的功能模块和开箱即用的特性,极大地提高了开发效率和降低了学习成本,使得开发人员能够更专注...【详细内容】
2023-12-29  Search: SpringBoot  点击:(132)  评论:(0)  加入收藏
用 SpringBoot+Redis 解决海量重复提交问题
前言 一:搭建redis的服务Api 二:自定义注解AutoIdempotent 三:token创建和检验 四:拦截器的配置 五:测试用例 六:总结前言:在实际的开发项目中,一个对外暴露的接口往往会面临很多...【详细内容】
2023-12-20  Search: SpringBoot  点击:(53)  评论:(0)  加入收藏
SpringBoot中如何优雅地个性化定制Jackson
当使用 JSON 格式时,Spring Boot 将使用ObjectMapper实例来序列化响应和反序列化请求。在本教程中,我们将了解配置序列化和反序列化选项的最常用方法。一、默认配置默认情况下...【详细内容】
2023-12-20  Search: SpringBoot  点击:(132)  评论:(0)  加入收藏
springboot-如何集成Validation进行参数校验
一、步骤概览 二、步骤说明1.引入依赖包在 pom.xml 文件中引入 validation 组件,它提供了在 Spring Boot 应用程序中进行参数校验的支持。<!-- WEB 程序依赖包 --><dependen...【详细内容】
2023-12-13  Search: SpringBoot  点击:(156)  评论:(0)  加入收藏
优雅的springboot参数校验,你学会了吗?
前言在后端的接口开发过程,实际上每一个接口都或多或少有不同规则的参数校验,有一些是基础校验,如非空校验、长度校验、大小校验、格式校验;也有一些校验是业务校验,如学号不能重...【详细内容】
2023-11-29  Search: SpringBoot  点击:(198)  评论:(0)  加入收藏
Springboot扩展点之BeanDefinitionRegistryPostProcessor,你学会了吗?
前言通过这篇文章来大家分享一下,另外一个Springboot的扩展点BeanDefinitionRegistryPostProcessor,一般称这类扩展点为容器级后置处理器,另外一类是Bean级的后置处理器;容器级...【详细内容】
2023-11-27  Search: SpringBoot  点击:(174)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(9)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条