JNPF快速开发框架是一个可复用的设计构件,使用JNPF的编程人员可以在一个通用功能已经实现的基础上开始具体的系统开发。JNPF快速开发框架是一个可复用的设计构件,使用JNPF的编程人员可以在一个通用功能已经实现的基础上开始具体的系统开发。
平台设计灵活可扩展、可移植、可应对高并发需求。同时兼顾本地化、私有云、公有云部署,支持SaaS模式应用。
-
采用前后端分离的模式:前端基于
vue-element-admin
框架定制开发,后端采用Spring Cloud Alibaba
全家桶; -
服务注册&发现与调用:基于
Nacos
来实现的服务注册与发现,使用Open Feign
/Dubbo RPC
来实现服务互调; -
统一授权认证:基于
Spring Security
、Spring OAuth2
、JWT 实现的统一认证服务中心,登录基于 spring security 的标准登录流程。客户端授权支持 oauth2.0 的四种授权模式:授权码模式、简化模式、密码模式、客户端模式,授权流程跟标准的 oauth2 流程一致。web 端采用简化模式(implicit)登录系统,移动端可使用密码模式(password)登录系统。同时还支持基于 Spring Social 的三方账号登录方式,如微信、QQ等。 -
业务熔断:采用
Sentinel
实现业务流量控制、熔断降级、系统负载等多个维度保护服务的稳定性; -
应用监控:利用
Spring Boot Admin
来监控各个服务的运行状态; -
链路调用监控:基于
SkyWalking
作为项目的全链路性能监控, 从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便找到故障产生的源头,生产上可极大缩短故障排除时间; -
灵活的权限控制:基于
RBAC
权限管理,该功能模块下的功能用于维护企业的组织架构信息以及员工信息。主要包含了组织架构管理、部门管理、分级管理员、角色管理、岗位管理、企业通讯录、通信录同步等功能。用户可在此功能模块下维护公司的组织架构信息(组织/部门/角色/岗位)和用户信息,也可以通过第三方应用(钉钉/企业微信)将组织架构信息一键导入到系统中,也可以使用组织架构和员工信息的导入功能将数据导入到系统中; -
支持多租户:简单配置即可转为多租户模式,实现数据隔离;
-
支持多种数据库:支持
MySQL
、Oracle
、SQL Server
、达梦数据库
、人大金仓数据库
、PostgreSQL
,您无需关心不同类型数据库间的语法区别; -
统一接口管理:基于
Swagger
拓展的API文档服务,主要提供在平台开发阶段的API文档管理和API调试等功能。
private SemaphoreSlim _sem = new SemaphoreSlim(0, 1);
private CancellationTokenSource _cts = new CancellationTokenSource();
[Benchmark]
public Task WithCancellationToken()
{
Task t = _sem.WaitAsync(_cts.Token);
_sem.Release();
return t;
}
[Benchmark]
public Task WithTimeout()
{
Task t = _sem.WaitAsync(TimeSpan.FromMinutes(1));
_sem.Release();
return t;
}
[Benchmark]
public Task WithCancellationTokenAndTimeout()
{
Task t = _sem.WaitAsync(TimeSpan.FromMinutes(1), _cts.Token);
_sem.Release();
return t;
}
后端技术栈
- 主框架:Spring Cloud Alibaba + Spring Boot + Spring Framework
- 安全框架:Spring Cloud Security OAuth2+JWT
- 持久层框架:Mybatis-plus、Hibernate Validation、
- 数据库连接池:Alibaba Druid
- JSON序列化:Jackson&FastJSON
- 数据缓存:Redis
- 消息队列: RocketMQ
- API网关:Spring Cloud Gateway
- 服务注册&发现和配置中心: Nacos
- 服务监控:Spring Boot Admin
- 服务消费:OpenFeign/Dubbo RPC
- 日志收集:E(Elasticsearch)+L(Logstash)+K(Kibana)
- 负载均衡:Ribbon
- 服务熔断:Sentinel
- 项目构建:Maven
- 分布式事务:Seata
- 代码生成器:Mybatis-plus-generator
- 链路追踪:Skywalking
- 模板引擎:Velocity
- 即时通讯:spring-boot-starter-websocket
- AOP:spring-boot-starter-aop
- 文件服务:阿里云OSS、本地存储、七牛云kodo、腾讯cos、MinIO
前端技术栈
- Vue2 全家桶
- Element-ui
- axios
- sass
- echarts
- dayjs
数据库支持
可支持多种关系型数据库,可根据需求再扩展支撑其他数据库:
- MySQL
- Oracle
- SQLServer
- PostgreSQL
- 达梦数据库(DM8)
- 人大金创数据库
using System.Text.Json;
namespace SerializeBasic
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string jsonString = JsonSerializer.Serialize(weatherForecast);
Console.WriteLine(jsonString);
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
[Benchmark(OperationsPerInvoke = 1_000_000)]
public void CreateManyRegisterDispose()
{
using (var cts = new CancellationTokenSource())
{
CancellationToken ct = cts.Token;
for (int i = 0; i < 1_000_000; i++)
ct.Register(s => { }, null).Dispose();
}
}
[Benchmark(OperationsPerInvoke = 1_000_000)]
public void CreateManyRegisterMultipleDispose()
{
using (var cts = new CancellationTokenSource())
{
CancellationToken ct = cts.Token;
for (int i = 0; i < 1_000_000; i++)
{
var ctr1 = ct.Register(s => { }, null);
var ctr2 = ct.Register(s => { }, null);
var ctr3 = ct.Register(s => { }, null);
var ctr4 = ct.Register(s => { }, null);
var ctr5 = ct.Register(s => { }, null);
ctr5.Dispose();
ctr4.Dispose();
ctr3.Dispose();
ctr2.Dispose();
ctr1.Dispose();
}
}
}