diff --git a/docs/404.html b/docs/404.html index 27e0ed2a997ddc8cb217e3a14042282e8381a972..83a108df566835e5dca7caa9bc46d9e8504f8a5b 100644 --- a/docs/404.html +++ b/docs/404.html @@ -4,14 +4,14 @@ 找不到页面 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

找不到页面

我们找不到您要找的页面。

请联系原始链接来源网站的所有者,并告知他们链接已损坏。

- - + + \ No newline at end of file diff --git a/docs/admin/deploy-admin/index.html b/docs/admin/deploy-admin/index.html index f3318629a86d5d6a8d627055f9090914d76c2864..caccbb3a020471cbbf0010591f07f4e13f98d917 100644 --- a/docs/admin/deploy-admin/index.html +++ b/docs/admin/deploy-admin/index.html @@ -4,15 +4,15 @@ 盘古 Admin 部署运维参考 | 盘古 Admin | 盘古开发框架 - - + +
跳到主要内容

部署运维参考

本文仅讨论 Admin 前端部署。后端服务部署相关问题请查阅 服务开发文档

编译源文件

# 进入项目目录
cd pangu-framework/pangu-admin/pangu-admin-frontend
# 构建部署(生产模式):编译后的文件将输出到 dist 文件夹
npm run build

部署

我们可以将 dist 文件夹内的文件直接部署到 ngix 或者 caddy 等 web 服务器。nginx 的相关资源已经非常丰富了,本文就以新兴 web 服务器 caddy 为例来展示如何部署盘古 admin。示例将达到如下效果:

  • 静态资源部署。
  • 反向代理盘古 Admin 后端统一网关接口。
  • 包括静态资源和 API 接口全站自动启用 SSL。

基于 Nginx 部署盘古 Admin

略。相关资源非常丰富,请自行查阅。

基于 Caddy 部署盘古 Admin

Caddy 简介

Caddy 2 is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go. — 摘自 Caddy 官网

  • 充当 WebServer 部署项目静态网站。
  • 充当流量网关方向代理后端的 Web 节点(业务网关)。
  • 全站自动 SSL。包含静态网站和 API 请求。
  • 解决跨域请求;解决前端 https 后端 http 的协议适配问题。

上传静态资源文件

将编译输出后 dist 文件夹内容上传到服务器某个路径。如:/var/www/pangu-admin

解析域名

登录域名服务商控制台,添加一条二级域名,如: pangu-admin.pulanit.com 的解析记录。

修改配置文件

# vi /etc/caddy/Caddyfile
pangu-admin.pulanit.com {
# Set this path to your site's directory.
root * /var/www/pangu-admin
encode gzip
# Enable the static file server.
file_server

# Another common task is to set up a reverse proxy:
reverse_proxy /api/* {
# 可以指定多个后端业务网关 WEB 节点
to localhost:8080
}
}
  • 静态资源文件上传到目录:/var/www/pangu-admin
  • Admin 后端部署不在本文讨论范围,本文仅通过 Caddy 反向代理后端业务网关。
  • 通过如上配置,网站和 API 自动都拥有了 https 的能力。

测试

根据上述配置即可尝试访问盘古 Admin 首页了。https://pangu-admin.pulanit.com

提示

上述部署结构,使得静态网站和 API 处于同一域名下,解决了跨域的问题。但如果 API 需要反向代理到不同的端口下或者域名下,则可以设置业务网关的参数开启跨域支持,也可以在 Caddy 配置文件配置响应头参数以支持跨域访问。

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/admin/faq/index.html b/docs/admin/faq/index.html index 0c5732072139f33d8eb9bf928ce4258e7985f53d..e9af51702b35d2582037febcc39f162ebc76242c 100644 --- a/docs/admin/faq/index.html +++ b/docs/admin/faq/index.html @@ -4,14 +4,14 @@ 常见问答 | 盘古 Admin - - + +
跳到主要内容

日常开发常见问答

本文将重点关注 Admin 前端开发问题的收集汇总。后端开发相关问题请查阅 服务开发常见问答

1. 可以将盘古 Admin 的后端改为单体应用吗?

必须可以。只需要将 pangu-admin-web 网关模块和 pangu-admin-system 权限模块做一些简单的合并即可。合并后就能将跨进程的 RPC 服务调用转变为 jvm 进程内本地服务调用。如果连配置中心都不想搭建的话,可以将配置直接改为本地配置文件。如此,就能使用传统的单体开发模式,将业务系统代码作为子包模块写入合并后的工程即可。

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/admin/how-to-create-backend-environment/index.html b/docs/admin/how-to-create-backend-environment/index.html index f012dcdc06e4db65bd7a2f9520f2749b07d9d0e0..7b74ebd482202bee0d833774660ea1a8c6a696fe 100644 --- a/docs/admin/how-to-create-backend-environment/index.html +++ b/docs/admin/how-to-create-backend-environment/index.html @@ -4,14 +4,14 @@ 盘古 Admin | 搭建后端开发环境 | 盘古开发框架 - - + +
跳到主要内容

搭建后端开发环境

工程结构说明

盘古 Admin 后端仓库代码路径:pangu-framework/pangu-admin/pangu-admin-backend

  • pangu-admin-web:统一网关
  • pangu-admin-system:权限模块
    • pangu-admin-system-api:权限模块服务接口
    • pangu-admin-system-app:权限模块服务实现

开发环境搭建

  • 将后端工程引入 IDEA。工程代码:pangu-framework/pangu-admin/pangu-admin-backend。
  • 执行目录 ~/pangu-admin-system/pangu-admin-system-app/src/main/resources/sql 中的数据脚本。

配置

分别在 nacos 配置中心创建模块pangu-admin-webpangu-admin-system-app的配置信息。如下图所示。

盘古开发框架 Admin

关于 naocs 配置中心的相关用法请查阅开发指南章节的 配置中心

Data Id 为 ppangu-admin-web 的配置数据
spring.jackson.time-zone=GMT+8
pangu.web.cross-origin=true

dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.consumer.timeout=5000
dubbo.registry.address=nacos://${nacos.server-addr}?namespace=${nacos.namespace}
dubbo.consumer.check=false

app.jwt.secret-key=alliswell666
app.jwt.ttl-min=480
app.jwt.persistent=true

app.log.queue.producer.disabled=false
#app.log.queue.producer.excludes.method-start-with=list,find,select,query,read
app.log.queue.consumer.pool.threads=10

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO
logging.level.com.alibaba.nacos.client.config.impl.ClientWorker=WARN
logging.level.com.yomahub.tlog.dubbo.filter=ERROR

启动

启动参数说明

  • -Dnacos.server-addr: nacos 服务器地址。
  • -Dnacos.namespace: nacos 里的命名空间 ID 。

启动权限服务模块

启动参数
-Dnacos.server-addr=100.100.100.XXX:8048 -Dnacos.namespace=pangu-dev

启动成功后在 nacos 服务列表中可看到相关服务提供者信息。如下图所示。

盘古开发框架 Admin

启动网关模块

启动参数
-Dnacos.server-addr=100.100.100.XXX:8048 -Dnacos.namespace=pangu-dev

启动成功后在 nacos 服务列表中可看到相关服务消费者信息。如下图所示。

盘古开发框架 Admin

提示

本文仅讨论盘古 Admin 后端开发环境搭建过程,至于后端服务开发方法和细节请参阅 服务开发文档

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/admin/how-to-create-frontend-environment/index.html b/docs/admin/how-to-create-frontend-environment/index.html index 932e770422cbbfeca00ef5811c244fdc56bc26fe..4d602d07b2e440215c29eabb9df779430e63722c 100644 --- a/docs/admin/how-to-create-frontend-environment/index.html +++ b/docs/admin/how-to-create-frontend-environment/index.html @@ -4,14 +4,14 @@ 盘古 Admin | 搭建前端开发环境 | 盘古开发框架 - - + +
跳到主要内容

搭建前端开发环境

工程结构说明

盘古 Admin 前端仓库代码路径:pangu-framework/pangu-admin/pangu-admin-frontend

前端开发环境搭建

前端 IDE 可以自由选择,推荐 vscode。

安装 & 启动

安装依赖和启动需依赖npm。安装方法:https://nodejs.org/zh-cn

# 进入项目目录
cd pangu-framework/pangu-admin/pangu-admin-frontend
# 安装依赖
npm i
# 启动项目 (开发模式)
npm run serve
# 构建部署(生产模式):将根目录生成 dist 文件夹发布到服务器即可
npm run build

编译启动成功后可通过控制台提示信息开始访问。如:http://localhost:2800

Admin 权限系统截屏

如下为权限系统参考实现的部分截屏。完整体验请访问:在线演示系统

盘古开发框架 Admin

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/admin/intro/index.html b/docs/admin/intro/index.html index 815698df04ce5f984644aafdf51187f6c9381fae..75879351627ad61aa74bde5036900e79e244c47f 100644 --- a/docs/admin/intro/index.html +++ b/docs/admin/intro/index.html @@ -4,14 +4,14 @@ 盘古通用权限系统开发框架 | 快速开始 | SUCI(Vue3、Element-Plus) | 盘古开发框架 - - + +
跳到主要内容

简介

盘古 Admin 是一套基于 SCUI(Vue3、Element-Plus) + 盘古服务开发框架的中后台业务系统前后端统一解决方案。并预置了轻量成熟的 权限系统参考实现,用户可以基于此快速搭建中后台业务系统二次开发脚手架。

前端方案介绍

盘古 Admin 前端基于 SUCI 开发。SCUI 是一个中后台前端解决方案,基于 VUE3 和 ElementPlus 实现。 使用最新的前端技术栈,提供各类实用的组件方便在业务开发时的调用,并且持续性的提供丰富的业务模板帮助你快速搭建企业级中后台前端任务。更多 SCUI 信息,请直接参考其 项目主页和相关文档。

后端方案介绍

盘古 Admin 后端基于盘古服务开发框架。详情请查看 相关文档

Admin 权限系统截屏

如下为权限系统参考实现的部分截屏。完整体验请访问:在线演示系统

盘古开发框架 Admin

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/admin/new-module/index.html b/docs/admin/new-module/index.html index 3b7a2a81c214b0fcb1f2c4cc3a1e21a4c549b633..1b8329aa79c3c54ef4a65d30c2e21c0e99892d3a 100644 --- a/docs/admin/new-module/index.html +++ b/docs/admin/new-module/index.html @@ -4,14 +4,14 @@ 盘古通用权限系统开发框架 | 新增业务模块 | 盘古开发框架 - - + +
跳到主要内容

新增业务功能模块

本文将介绍如何基于盘古 Admin 实现一个自己的业务功能模块。

虚拟业务场景

假设我们要实现的是一个某银行信用卡申请审批后台系统。在此,我们演示如何新增一个【信用卡人工复核】 菜单,列出各种渠道提交到后台的卡申请信息供审核人员审核确认。

第一步 新建模块工程

以 pangu-admin-system 为原型模版,新建业务模块工程。

┌── icbc-card-audit # ICBC 某行信用卡审批相关业务
│ ├── icbc-card-audit-api # 业务接口
│ ├── icbc-card-audit-app # 业务实现

第二步 新建配置

在 nacos 配置中心创建 Data Id 为 icbc-card-audit-app 的配置数据。注意:所属命名空间需要和 pangu-admin-* 的配置数据所属命名空间保持一致。

第三步 网关集成

在网关模块 pangu-admin-web 的 pom.xml 中添加对接口模块 icbc-card-audit-api 的依赖。并通过 RestController 调用相关 api 接口。

提示

本文以缺省的微服务开发模式开发后端服务。如果您选择单体开发,则可参考 服务开发 相关文档。

第四步 新建前端模块

┌── src       # 源代码
│ ├── api # 在这里定义相关模块 API 请求
│ ├── views # 在这里新建相关模块前端页面
│ ├── ... # etc

第五步 新建业务菜单

登录权限系统,通过【资源管理】菜单,新增业务菜单【信用卡人工复核】。并将其授权给相关角色和人员即可。

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/admin/tags/faq/index.html b/docs/admin/tags/faq/index.html index 43ca0ec1d5a0ed8d22af906eb6d9c558acead957..53a3fd69cfae3c1fbf2933d6150dd9c0248f977c 100644 --- a/docs/admin/tags/faq/index.html +++ b/docs/admin/tags/faq/index.html @@ -4,14 +4,14 @@ 1 篇文档带有标签「FAQ」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

1 篇文档带有标签「FAQ」

查看所有标签
- - + + \ No newline at end of file diff --git a/docs/admin/tags/index.html b/docs/admin/tags/index.html index 12c2f68391ef1768388333e2b205e6e751267f7d..832bc60b089d51a223446897ec72d915049dea90 100644 --- a/docs/admin/tags/index.html +++ b/docs/admin/tags/index.html @@ -4,14 +4,14 @@ 标签 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容
- - + + \ No newline at end of file diff --git "a/docs/admin/tags/\347\233\230\345\217\244-admin/index.html" "b/docs/admin/tags/\347\233\230\345\217\244-admin/index.html" index 4fa2b71358fb90b0c6a63a2b92578792be545cee..675afde2e5628b6fd3fd7a24f15b80c72d7a8504 100644 --- "a/docs/admin/tags/\347\233\230\345\217\244-admin/index.html" +++ "b/docs/admin/tags/\347\233\230\345\217\244-admin/index.html" @@ -4,14 +4,14 @@ 4 篇文档带有标签「盘古 Admin」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

4 篇文档带有标签「盘古 Admin」

查看所有标签

简介

盘古通用权限系统开发框架 | 快速开始 | SUCI(Vue3、Element-Plus) | 盘古开发框架

- - + + \ No newline at end of file diff --git "a/docs/admin/tags/\351\203\250\347\275\262/index.html" "b/docs/admin/tags/\351\203\250\347\275\262/index.html" index a43fed377a96ba6ff5018ee9d51839f4098093b7..2066e3fe06d62531c5f494e8f44c79aac5fd40b0 100644 --- "a/docs/admin/tags/\351\203\250\347\275\262/index.html" +++ "b/docs/admin/tags/\351\203\250\347\275\262/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「部署」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

1 篇文档带有标签「部署」

查看所有标签
- - + + \ No newline at end of file diff --git a/docs/app/faq/index.html b/docs/app/faq/index.html index 3ab998ac46bcf4ebecf08d39220b3482663ad7b1..b1de59bc2ef560d30b8b00f6a26d7a1d6bd52881 100644 --- a/docs/app/faq/index.html +++ b/docs/app/faq/index.html @@ -4,14 +4,14 @@ 常见问答 | 盘古 APP Starter - - + +
跳到主要内容

日常开发常见问答

本文将重点关注 APP 前端开发问题的收集汇总。后端开发相关问题请查阅 服务开发常见问答

1. 为什么关于 APP 开发的文档比较少?

盘古 APP Starter 集成了 uni-app 和 uView UI,绑定使用 HbuilderX 作为开发 IDE。因此,关于组件使用规范细节、IDE 开发流程操作等问题可以参考如下文档即可。

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/app/how-to-create-environment/index.html b/docs/app/how-to-create-environment/index.html index 3e5bca3844c8e41ddcebc9456392d2f29e84e258..b63371e16e9a10ebbf974e44ca95b73f964ab734 100644 --- a/docs/app/how-to-create-environment/index.html +++ b/docs/app/how-to-create-environment/index.html @@ -4,14 +4,14 @@ 盘古 APP Starter | 搭建开发环境 | 盘古开发框架 - - + +
跳到主要内容

搭建开发环境

工程结构说明

盘古 App 仓库代码路径:pangu-framework/pangu-app-starter

开发环境搭建

由于 uni-app 依赖 HbuilderX,因此,我们开发盘古 APP 的 IDE 选择为 HbuilderX。

导入模版工程

使用 HbuilderX「文件 -> 导入 -> 从本地目录导入」菜单,导入 pangu-app-starter 模版工程。

安装依赖

安装依赖和启动需依赖npm。安装方法:https://nodejs.org/zh-cn

# 进入项目目录
cd pangu-framework/pangu-app-starter
# 安装依赖
npm i

H5 Web 浏览器调试启动

使用 HbuilderX「运行 -> 运行到浏览器 -> Chrome」菜单,启动工程并通过浏览器访问。如下图所示。

盘古 APP

微信小程序模拟器调试启动

  • 安装微信开发者工具。
  • 使用 HbuilderX 「运行 -> 运行到小程序模拟器 -> 微信开发者工具」菜单,HbuilderX 会编译输出小程序应用并连接微信开发者工具启动调试。如下图所示。
盘古 APP

Android APP 真机调试启动

  • 将 Android 手机用数据线与电脑连接,打开手机开发者调试模式。
  • 使用 HbuilderX 「运行 -> 运行到手机或模拟器 -> 运行到 Android App 基座」菜单,HbuilderX 会将 Android 基座壳子安装到目标手机,并启动加载页面。如下图所示。
盘古 APP

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/app/intro/index.html b/docs/app/intro/index.html index dc4319966ce7dadafc5f2aeadd409a6d59bfc509..747a098bc20e0d6a2c0d4d62ce3b0e4de58926bf 100644 --- a/docs/app/intro/index.html +++ b/docs/app/intro/index.html @@ -4,17 +4,17 @@ 盘古 APP Starter | 移动端多平台快速开发脚手架 | uViewUI | uni-app | 盘古开发框架 - - + +
跳到主要内容

简介

盘古 APP Starter 是集成了 uni-app 内置组件、官方扩展组件和全面兼容 nvue 的 uni-app 生态框架 uView UI 的移动端多平台快速开发脚手架。用户可以基于此完成Android/IOS App、微信小程序、H5 应用的快速开发。(一次开发,针对不同平台编译发布版本)

  • uni-app 介绍
    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。

  • uView UI 介绍
    uView UI 是全面兼容 nvue 的 uni-app 生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水。

  • HBuilderX 介绍
    -HbuilderX 是一款免费的前端开发 IDE。uni-app 的多端编译部署能力依赖于它。所以,盘古 APP Starter 的标准开发工具也就是 HBuilderX。

盘古 APP Starter 截屏

如下为盘古 APP Starter 的部分截屏。完整体验请访问:在线演示

盘古 APP Starter

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/app/quick-start/index.html b/docs/app/quick-start/index.html index 83122b174ccf9d1ae431b97abd0616653d1b0e35..5acfa6554e46ee8765c78a8f4ee89a5c380a3966 100644 --- a/docs/app/quick-start/index.html +++ b/docs/app/quick-start/index.html @@ -4,14 +4,14 @@ 盘古 APP Starter | 快速入门指南 | 盘古开发框架 - - + +
-
跳到主要内容

快速入门指南

配置底部导航菜单

以范例 APP 底部的「组件」导航菜单为例,说明如何配置首页底部的导航菜单。

配置菜单节点信息

打开 pages.json 配置文件,找到 tabBar 节点。如下所示:

"tabBar": {
"color": "#303133",
"selectedColor": "#529b2e",
"borderStyle": "black",
"backgroundColor": "#f4f4f5",
"list": [{
"pagePath": "pages/example/components",
"iconPath": "static/common/img/nav/component.png",
"selectedIconPath": "static/common/img/nav/component-selected.png",
"text": "组件"
}
// ...其它菜单配置...
]
}

配置菜单路由信息

配置路径 pages/example/components 的路由信息。在 pages.json 配置文件中,找到 pages 节点。如下所示:

    "pages": [ 
//pages数组中第一项表示应用启动页
{
"path": "pages/example/components",
"style": {
"navigationBarTitleText": "组件"
}
}
// ...其它路由配置...
]

该路由配置对应视图文件:pages/example/components.nvue。

新增业务模块页面路由

参考 pages.json 相关配置文件即可。

提示

更多关于 pages.json 的配置,请查阅 uni-app 相关文档

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/data-persistance/index.html b/docs/docs/advanced-guide/data-persistance/index.html index 2445e15a350920cd562572c0da59462157ffb024..06796ee50723bd8403718e6aa2942f8da625ae3f 100644 --- a/docs/docs/advanced-guide/data-persistance/index.html +++ b/docs/docs/advanced-guide/data-persistance/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 数据持久化 | 自动填充字段 | 逻辑删除 | 乐观锁 | MyBatis Plus - - + +
跳到主要内容

数据持久化

盘古开发框架数据持久化 API 依赖 MyBatis Plus 提供。在 MyBatis 的基础上提供了强大的内置通用 Mapper CRUD 操作、支持 Lambda 表达式、内置屏蔽不通数据库方言差异的分页插件、自动填充字段值、多种主键自动生成策略、逻辑删除、乐观锁插件等。

安装相关盘古模块

<parent>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-parent</artifactId>
<version>latest.version.xxx</version>
<relativePath/>
</parent>

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的Nacos配置中心模式,请参阅:配置中心章节。

spring.application.name=pangu-examples-crud

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/pangu-examples?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&useSSL=false&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root123456
mybatis-plus.mapperLocations=classpath*:/mapper/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
# 分页SQL方言数据库类型标识(缺省:自动识别)
pangu.jdbc.db-type=mysql

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO
logging.level.com.gitee.pulanos.pangu.showcases.crud.dao=debug

生成持久化所需的模版代码

基于实践经验,我们建议使用盘古代码生成器,而不是使用 Mybatis Plus 官方生成器。关于生成代码相关内容,请参阅 《代码生成器插件》 章节,这里不再赘述。(针对每一个数据表会生成一个 *Mapper.java 文件和一个 *Entity.java 文件)

基本数据持久化操作

这里只是给出几个简单典型的操作代码,更多内容请参阅范例或阅读 Mybatis Plus 官方文档

新增

UserEntity userEntity = new UserEntity();
userEntity.setName("XC").setAge(18).setUserType("1");
int row = userMapper.insert(userEntity);
log.info("成功插入{}条数据。{}", row, userEntity);

修改

//方式1
userMapper.updateById(new UserEntity().setId(1L).setName("XC2"));

//方式2
LambdaUpdateWrapper<UserEntity> updateWrapper = Wrappers.lambdaUpdate();
updateWrapper.set(UserEntity::getAge, 100);
updateWrapper.eq(UserEntity::getId, 2L);
userMapper.update(null, updateWrapper);
//方式2简写
userMapper.update(null, Wrappers.<UserEntity>lambdaUpdate().set(UserEntity::getName, "XC2").eq(UserEntity::getId, 3L));

//方式3
UserEntity userEntity = new UserEntity();
userEntity.setName("XC2");
userMapper.update(userEntity, Wrappers.<UserEntity>lambdaUpdate().eq(UserEntity::getId, 4L));

删除

//方式1
userMapper.deleteById(1000L);

//方式2
userMapper.deleteBatchIds(Arrays.asList(1000L, 1001L));

//方式3
userMapper.delete(Wrappers.<UserEntity>lambdaQuery().ge(UserEntity::getAge, 150));
userMapper.delete(Wrappers.lambdaQuery(UserEntity.class).ge(UserEntity::getAge, 150));

//方式4
userMapper.deleteById(new UserEntity().setId(2000L));

简单查询

//方式1
UserEntity userEntity = userMapper.selectById(1L);

//方式2
UserEntity userEntity1 = userMapper.selectOne(Wrappers.<UserEntity>lambdaQuery().eq(UserEntity::getId, 1L));

//方式3 (需要注意对传入 ID 集合为非空判断,否则生成的 SQL in() 语法将报错)
if(CollUtil.isNotEmpty(userIds)){
userEntities = userMapper.selectBatchIds(userIds);
}

//方式4
LambdaQueryWrapper<UserEntity> lambdaQueryWrapper = Wrappers.lambdaQuery();
//动态组合查询条件的简便写法
lambdaQueryWrapper.between(ObjectUtil.isNotEmpty(age), UserEntity::getAge, 1, age);
lambdaQueryWrapper.eq(UserEntity::getUserType, "1");
lambdaQueryWrapper.orderByDesc(UserEntity::getId);
List<UserEntity> userEntities1 = userMapper.selectList(lambdaQueryWrapper);

//方式5
LambdaQueryWrapper<UserRoleEntity> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(UserRoleEntity::getUserId, userId).orderByDesc(UserRoleEntity::getRoleId);
List<UserRoleEntity> userRoleEntities = userRoleMapper.selectList(lambdaQueryWrapper);
List<Long> roleIds = userRoleEntities.stream().map(UserRoleEntity::getRoleId).collect(Collectors.toList());

//方式6
List<Map<String, Object>> userMaps = userMapper.selectMaps(Wrappers.<UserEntity>lambdaQuery().eq(UserEntity::getUserType, "1"));

//方式7 count 查询
Long cnt = userMapper.selectCount(Wrappers.<UserEntity>lambdaQuery().le(UserEntity::getGmtCreate, DateUtil.date()));

//方式8 group 查询
QueryWrapper<UserEntity> queryWrapper1 = Wrappers.query();
queryWrapper1.select("age, count(id) as cnt").groupBy("age");
List<Map<String, Object>> mapList = userMapper.selectMaps(queryWrapper1);

//方式9 or 查询
if (ObjectUtil.isNotEmpty(keyword)){
lambdaQueryWrapper.and(w -> w.like( UserEntity::getName, keyword).or().like(UserEntity::getUserName, keyword));
}

//方式10 指定查询字段
LambdaQueryWrapper<UserEntity> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.select(UserEntity::getId, UserEntity::getUserName);
lambdaQueryWrapper.eq(...);

//方式11 排除查询字段
lambdaQueryWrapper.select(UserEntity.class, info -> !info.getColumn().equals("password") && !info.getColumn().equals("password2"));

分页查询

盘古框架已经做了 Mybatis Plus 分页插件的自动装配工作,直接使用即可。无需额外配置。

基于 Mapper API 的分页查询

public void aPageQuery(){
log.info("MyBatisPlus API 分页查询数据...");
Page page = new Page<UserEntity>(1,3);
userMapper.selectPage(page, Wrappers.<UserEntity>lambdaQuery().ge(UserEntity::getAge, 10).orderByAsc(UserEntity::getId));
Console.log("总数:{}", page.getTotal());
List<UserEntity> userEntities = page.getRecords();
userEntities.forEach(System.out::println);
}

基于手工映射 SQL 的分页查询

继续阅读本文后面的 《手工编写SQL映射》 章节可以找到。

一个完整的分页查询例子

// 分页入参对象
public class RoleIn extends Page {
private String name;
}

// Controller
@GetMapping("/list")
public Result<PageResult<RoleEntity>> list(RoleIn roleIn) {
PageResult<RoleEntity> pageResult = roleService.list(roleIn);
return Result.success(pageResult);
}

// Service实现
public PageResult<RoleEntity> list(RoleIn roleIn) {
Page<RoleEntity> page = PagingUtil.createPage(roleIn);
LambdaQueryWrapper<RoleEntity> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.like(ObjectUtil.isNotEmpty(roleIn.getName()), RoleEntity::getName, roleIn.getName());
roleMapper.selectPage(page, lambdaQueryWrapper);
return PagingUtil.getPageResult(page);
}

手工编写SQL映射

提示

一般来说在日常开发中我们是不需要再编写SQL代码的,Mapper API已经能满足我们的需求了。但对于一些特殊需求,我们也可以手工写SQL映射的方式来处理。如下范例演示了手工SQL查询的操作,新增、修改、删除也是同理。

public void bPageQuery(){
log.info("自定义SQL映射分页查询数据...");
Page page = new Page<UserEntity>(1,3);
Map<String, Object> params = Maps.newHashMap();
params.put("userType", "1");
List<UserEntity> userEntities = crudMapper.listUsersByPage(page, params);
Console.log("总数:{}", page.getTotal());
userEntities.forEach(System.out::println);
}

public void cPageQuery(){
log.info("自定义SQL映射分页查询数据...");
Page page = new Page<Map<String, Object>>(1,3);
String userType = "1";
List<Map<String, Object>> userMaps = crudMapper.listUserMapsByPage(page, userType);
Console.log("总数:{}", page.getTotal());
userMaps.forEach(System.out::println);
}

public void bSelect() {
log.info("自定义SQL映射查询数据...");
Map<String, Object> params = Maps.newHashMap();
params.put("userType", "1");
List<UserEntity> userEntities = crudMapper.listUsersByMap(params);
userEntities.forEach(System.out::println);
}
src/main/java/com/gitee/pulanos/pangu/showcases/crud/dao/mapper/CrudMapper.java
/**
* 提示:自定义sql手工映射大部分时候为复杂的多表联合查询的SQL,单表操作都应该统一使用mybatis plus的API
*/
@Mapper
public interface CrudMapper {

List<UserEntity> listUsersByPage(Page<UserEntity> page, Map<String, Object> param);

List<Map<String, Object>> listUserMapsByPage(Page<Map<String, Object>> page, String userType);

List<UserEntity> listUsersByMap(Map<String, Object> param);

}
src/main/resources/mapper/CrudMapper.xml
<mapper namespace="com.gitee.pulanos.pangu.showcases.crud.dao.mapper.CrudMapper">
<!-- 分页查询 -->
<select id="listUsersByPage" resultType="com.gitee.pulanos.pangu.showcases.crud.dao.entity.UserEntity">
select id,name,age,user_type,gmt_create,gmt_update from user
<where>
<if test="param.userType!=null and param.userType!=''">
user_type = #{param.userType}
</if>
</where>
ORDER BY id
</select>

<!-- 分页查询 -->
<select id="listUserMapsByPage" resultType="java.util.Map">
select age, count(id) as userCnt from user
<where>
<if test="userType!=null and userType!=''">
user_type = #{userType}
</if>
</where>
GROUP BY age
ORDER BY age DESC
</select>

<!-- 普通查询 -->
<select id="listUsersByMap" resultType="com.gitee.pulanos.pangu.showcases.crud.dao.entity.UserEntity">
select id,name,age,user_type,gmt_create,gmt_update from user
<where>
<if test="userType!=null and userType!=''">
user_type = #{userType}
</if>
</where>
</select>
</mapper>

高级特性

事务

单一数据源事务,直接使用 Spring 事务相关注解即可( @EnableTransactionManagement@Transactional )。对于分布式事务请参阅 《分布式事务》 章节。

逻辑删除

盘古框架借助 Mybatis Plus 对逻辑删除提供了非常友好的支持。通过如下简单配置即可实现从物理删除到逻辑删除在 CRUD 上面的无感体验。

# 指定逻辑删除的标识字段
mybatis-plus.global-config.db-config.logic-delete-field=deleted
# 删除前的缺省值
mybatis-plus.global-config.db-config.logic-not-delete-value=0
# 删除后的值
mybatis-plus.global-config.db-config.logic-delete-value=id

配置说明

  • 逻辑删除字段 deleted 建议通过数据库设置默认值 0。
  • 删除后的值建议不用 1,这会带来某字段需要唯一索引时的尴尬问题。因此建议将删除后的值更新为当前记录的 ID 字段值,如上配置所示。这时如果表中某字段需要建立唯一索引,则可以和 deleted 字段一起创建联合唯一索引。
  • 查询和更新操作,框架会自动拼接逻辑删除字段作为条件。(AND deleted = 0)

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/data-sharding/index.html b/docs/docs/advanced-guide/data-sharding/index.html index 45885b4e974aa5001dc478724fdec408bf7913eb..4369a0b365d3e45c7716dd82cc3113d15b072b3c 100644 --- a/docs/docs/advanced-guide/data-sharding/index.html +++ b/docs/docs/advanced-guide/data-sharding/index.html @@ -4,8 +4,8 @@ 盘古开发框架 | 数据治理 | 数据分片 | 水平分片 | 垂直分片 | SQL路由 | SQL改写 - - + +
@@ -14,7 +14,7 @@ 通过在应用端引入组件包,代理应用普通数据源。在这种模式下,路由规则、分片逻辑配置到应用侧,所有 SQL 请求都通过代理数据源完成 SQL 解析、SQL改写、SQL 路由、结果集聚合等必要操作。

实现方式
可选组件
优点
缺点
数据库代理模式ShardingSphere-Proxy
MyCat
多语言支持
独立部署(升级简单)
对开发完全透明
独立部署(增加不稳定因素)
运维成本高
性能损耗高
数据源代理模式 💋 ShardingSphere-JDBC集成简单、轻松驾驭
性能较好
嵌入 JAR(升级麻烦)
日常数据维护麻烦
警告

盘古开发框架使用 ShardingSphere-JDBC 组件,通过数据源代理的方式实现数据分片功能。

安装相关盘古模块

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-data-governance-spring-boot-starter</artifactId>
</dependency>

编程实战一:只分表

初始化数据库环境

数据库表结构和分片算法逻辑如下图所示。

数据分片实现-只分表

请根据如下逻辑表结构创建真实表 t_order0 和 t_order1。

create table t_order
(
order_id bigint not null primary key,
user_id int not null,
status varchar(50) null
)
comment '逻辑表:订单表';

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-shardingsphere-sharding
mybatis-plus.mapperLocations=classpath*:/mapper/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

spring.shardingsphere.mode.type=Memory
# print shardingsphere Actual SQL log
spring.shardingsphere.props.sql-show=true
spring.shardingsphere.datasource.names=ds-0

spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples
spring.shardingsphere.datasource.ds-0.username=root
spring.shardingsphere.datasource.ds-0.password=123456

# sharding table `t_order` configuration
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds-0.t_order$->{0..1}
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=order_id
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=sa-0

# sharding-algorithms configuration
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-0.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-0.props.algorithm-expression=t_order$->{order_id % 2}

关键配置项说明

配置项
配置说明
*.t_order.actual-data-nodes表 t_order 对应的数据节点(真实表)
*.t_order.table-strategy.standard.sharding-column表 t_order 的分片键
*.t_order.table-strategy.standard.sharding-algorithm-name表 t_order 的分片算法名称(自定义标识符)
*.sharding-algorithms.sa-0.type分片算法 sa-0 的类型(INLINE:内置算法)
*.sharding-algorithms.sa-0.props.algorithm-expression分片算法 sa-0 的分片表达式

测试用例

测试写入数据分片

写入时将分片键 order_id 对 2 求模,并根据求模结果将订单数据分片到 2 个表中存储。

@Test
public void createOrder() {
TOrderEntity entity1 = new TOrderEntity().setUserId(1).setStatus("0");
tOrderMapper.insert(entity1);
TOrderEntity entity2 = new TOrderEntity().setUserId(1).setStatus("0");
tOrderMapper.insert(entity2);
}

TOrderEntity 的 orderId 主键请通过如下注解生成。当然也可以自定义 ID 算法赋值。

@TableId(value = "order_id", type = IdType.ASSIGN_ID)
private Long orderId;

测试根据分片键路由查询

根据分片算法,将SQL查询请求路由到对应的真实表查询。

@Test
public void routingQuery() {
TOrderEntity entity = tOrderMapper.selectById(150681599250L);
log.info("结果集:{}" , entity);
TOrderEntity entity2 = tOrderMapper.selectById(150683023105L);
log.info("结果集:{}" , entity2);
}

测试结果集归并、绑定表关联查询、强制路由等特性

不再赘述。请直接获取 本范例源码 查看。

编程实战二:只分库

初始化数据库环境

数据库表结构和分片算法逻辑如下图所示。

数据分片实现-只分库

数据库逻辑表结构 同上,请自行创建相关真实库表结构。

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-shardingsphere-sharding
mybatis-plus.mapperLocations=classpath*:/mapper/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

spring.shardingsphere.mode.type=Memory
# print shardingsphere Actual SQL log
spring.shardingsphere.props.sql-show=true
spring.shardingsphere.datasource.names=ds-0,ds-1

spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples
spring.shardingsphere.datasource.ds-0.username=root
spring.shardingsphere.datasource.ds-0.password=123456

spring.shardingsphere.datasource.ds-1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-1.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples-1
spring.shardingsphere.datasource.ds-1.username=root
spring.shardingsphere.datasource.ds-1.password=123456

# sharding table `t_order` configuration
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds-$->{0..1}.t_order
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-algorithm-name=sa-0

# sharding-algorithms configuration
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-0.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-0.props.algorithm-expression=ds-$->{user_id % 2}

关键配置项说明

配置项
配置说明
*.t_order.actual-data-nodes表 t_order 对应的数据节点(真实表)
*.default-database-strategy.standard.sharding-column表 t_order 的分片键
*.default-database-strategy.standard.sharding-algorithm-name表 t_order 的分片算法名称(自定义标识符)
*.sharding-algorithms.sa-0.type分片算法 sa-0 的类型(INLINE:内置算法)
*.sharding-algorithms.sa-0.props.algorithm-expression分片算法 sa-0 的分片表达式

测试用例

测试写入数据分片

写入时将分片键:user_id 对 2 求模,根据求模结果将不同用户的订单数据分到2个库中存储。

@Test
public void createOrder() {
TOrderEntity entity1 = new TOrderEntity().setUserId(1).setStatus("0");
tOrderMapper.insert(entity1);
TOrderEntity entity2 = new TOrderEntity().setUserId(2).setStatus("0");
tOrderMapper.insert(entity2);
}

测试根据分片键路由查询

根据分片算法,将SQL查询请求路由到对应的真实表查询。

@Test
public void routingQuery() {
List<TOrderEntity> list1 = tOrderMapper.selectList(Wrappers.<TOrderEntity>lambdaQuery().eq(TOrderEntity::getUserId, 1));
log.info("结果集:{}" , list1);
List<TOrderEntity> list2 = tOrderMapper.selectList(Wrappers.<TOrderEntity>lambdaQuery().eq(TOrderEntity::getUserId, 2));
log.info("结果集:{}" , list2);
}

测试结果集归并、绑定表关联查询、强制路由等特性

不再赘述。请直接获取 本范例源码 查看。

编程实战三:分库分表

初始化数据库环境

数据库表结构和分片算法逻辑如下图所示。

数据分片实现-只分库

数据库逻辑表结构 同上,请自行创建相关真实库表结构。

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-shardingsphere-sharding
mybatis-plus.mapperLocations=classpath*:/mapper/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

spring.shardingsphere.mode.type=Memory
# print shardingsphere Actual SQL log
spring.shardingsphere.props.sql-show=true
spring.shardingsphere.datasource.names=ds-0,ds-1

spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples
spring.shardingsphere.datasource.ds-0.username=root
spring.shardingsphere.datasource.ds-0.password=123456

spring.shardingsphere.datasource.ds-1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-1.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples-1
spring.shardingsphere.datasource.ds-1.username=root
spring.shardingsphere.datasource.ds-1.password=123456

# sharding table `t_order` configuration
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-algorithm-name=sa-0
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds-$->{0..1}.t_order$->{0..1}
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=order_id
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=sa-1

# sharding databases algorithms configuration
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-0.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-0.props.algorithm-expression=ds-$->{user_id % 2}
# sharding tables algorithms configuration
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-1.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.sa-1.props.algorithm-expression=t_order$->{order_id % 2}

关键配置项说明

配置项
配置说明
*.t_order.actual-data-nodes表 t_order 对应的数据节点(真实表)
*.default-database-strategy.standard.sharding-column表 t_order 的分库分片键
*.default-database-strategy.standard.sharding-algorithm-name表 t_order 的分库分片算法名称
*.t_order.table-strategy.standard.sharding-column表 t_order 的库内分表分片键
*.t_order.table-strategy.standard.sharding-algorithm-name表 t_order 的库内分表算法名称
*.sharding-algorithms.sa-0.type分库算法的类型
*.sharding-algorithms.sa-0.props.algorithm-expression分库表达式
*.sharding-algorithms.sa-1.type库内分表算法的类型
*.sharding-algorithms.sa-1.props.algorithm-expression库内分表表达式

测试用例

测试写入数据分片

写入时将分片键 user_id 对 2 求模,根据求模结果将订单数据分片到 2 个库中,再将分片键 order_id 对 2 求模,并根据求模结果将订单数据分片到库中不同的表来存储。(注意:本例有两个分片键,第一个用来分库;第二个用来库内分表。)

@Test
public void createOrder() {
TOrderEntity entity1 = new TOrderEntity().setUserId(1).setStatus("0");
tOrderMapper.insert(entity1);
TOrderEntity entity2 = new TOrderEntity().setUserId(2).setStatus("0");
tOrderMapper.insert(entity2);
}

TOrderEntity 的 orderId 主键请通过如下注解生成。当然也可以自定义 ID 算法赋值。

@TableId(value = "order_id", type = IdType.ASSIGN_ID)
private Long orderId;

测试根据分片键路由查询

根据分片算法,将SQL查询请求路由到对应的真实表查询。

@Test
public void routingQuery() {
List<TOrderEntity> list1 = tOrderMapper.selectList(Wrappers.<TOrderEntity>lambdaQuery().eq(TOrderEntity::getUserId, 1));
log.info("结果集:{}" , list1);
List<TOrderEntity> list2 = tOrderMapper.selectList(Wrappers.<TOrderEntity>lambdaQuery().eq(TOrderEntity::getUserId, 2));
log.info("结果集:{}" , list2);
}

测试结果集归并、绑定表关联查询、强制路由等特性

不再赘述。请直接获取 本范例源码 查看。

警报
  • 对分片表的查询操作,查询条件务必要包含分片键,否则会遍历所有数据节点。尽量维持单表查询。
  • 如果需要关联查询,请结合绑定表、广播表酌情合理应用。

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/distributed-lock/index.html b/docs/docs/advanced-guide/distributed-lock/index.html index 64110ec9971ed9d55a0bf9246c7da0010f811933..539a84f8cb556e7ae4484ae035083b0545e7c461 100644 --- a/docs/docs/advanced-guide/distributed-lock/index.html +++ b/docs/docs/advanced-guide/distributed-lock/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 分布式锁 | Lock4j - - + +
跳到主要内容

分布式锁

盘古开发框架基于 Lock4j 提供分布式锁。支持注解声明式和 API 编程式对业务代码在分布式环境下加并发锁。

安装相关盘古模块

<parent>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-parent</artifactId>
<version>latest.version.xxx</version>
<relativePath/>
</parent>

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-lock-redis-based

# spring-redis
spring.redis.host=localhost
spring.redis.database=1
spring.redis.port=6379
spring.redis.password=

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO

基于注解声明

直接在需要缓存的方法上加上 @Lock4j 注解。

@Lock4j

分布式锁注解。

名称默认值说明
name空字符串用于多个方法锁同一把锁 可以理解为锁资源名称,为空则会使用:包名 + 类名 + 方法名。(一般为空即可)
keys空字符串支持 SPEL 表达式,锁的 key = name + keys
acquireTimeout3000获取锁超时时间 单位:毫秒。可以理解为排队时常,超过这个时常就退出排队,抛出获取锁超时异常。
expire30000过期时间 单位:毫秒。主要是防止死锁,建议估计好你锁方法运行时常,正常没有复杂业务的增删改查最多几秒,留有一定冗余,10 秒足够。默认 30 秒是为了兼容绝大部分场景。

代码片段

/**
* 默认获取锁超时 3 秒,30 秒锁过期
*/
@Lock4j
public void doBiz() {
log.info("执行doBiz...");
ThreadUtil.sleep(25*1000);
}

/**
* 配置获取锁超时时间和锁过期时间 支持 SPEL
* @param accountId
*/
@Lock4j(keys = {"#accountId"}, expire = 20000, acquireTimeout = 10000)
public void doBiz2(Long accountId) {
log.info("执行doBiz2...");
ThreadUtil.sleep(20*1000);
}

基于 API 编程

注入 LockTemplate 对象即可使用。如下代码所示。

@Component
public class ApiLockService {

@Autowired
private LockTemplate lockTemplate;

public void apiLock(String userId) {
//... 各种不需要上锁的操作
String lockKey = "lock4j:ApiLockService:apiLock:" + userId;
final LockInfo lockInfo = lockTemplate.lock(lockKey);
//申请锁失败
if (null == lockInfo) {
throw new LockException("业务处理中,请稍后再试...");
}
//申请锁成功
try {
ThreadUtil.sleep(10000L);
log.info("执行 apiLock, 当前线程{}", Thread.currentThread().getName());
} finally {
lockTemplate.releaseLock(lockInfo);
}
}

}

启动入口

@SpringBootApplication
public class LockPanguApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(LockPanguApplication.class).run(args);
}
}

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/distributed-transaction/index.html b/docs/docs/advanced-guide/distributed-transaction/index.html index 417c8b9ac17d71210de4536873881966c50abecb..6aa874a58433b80c89d5d157cf86661a46838eef 100644 --- a/docs/docs/advanced-guide/distributed-transaction/index.html +++ b/docs/docs/advanced-guide/distributed-transaction/index.html @@ -4,8 +4,8 @@ 盘古开发框架 | 分布式事务 | Seata | AT、TCC、SAGA 和 XA - - + +
@@ -16,7 +16,7 @@ 事务成功2

模拟回滚

模拟业务失败的异常逻辑,分支事务回滚、全局事务回滚。

@Test
public void buyItems() {
BuyDto buyDto = new BuyDto();
// !!! 此参数会导致爆库存不足的异常,导致库存服务减库存失败
buyDto.setCount(101);
buyDto.setMoney(10);
buyDto.setCommodityCode("C001");
buyDto.setUserId("U001");
mainBizService.buyItems(buyDto);
}

事务失败1 事务失败2

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/layering-cache/index.html b/docs/docs/advanced-guide/layering-cache/index.html index 658ce3878ae8dcefb313aa31f827118543b86ec4..896150fc33f924c168bc7d37ce57550d102b07ef 100644 --- a/docs/docs/advanced-guide/layering-cache/index.html +++ b/docs/docs/advanced-guide/layering-cache/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 分布式多级缓存 | Laying Cache | 缓存击穿 | 缓存雪崩 - - + +
跳到主要内容

分布式多级缓存

盘古开发框架基于 Laying Cache,提供支持分布式环境的多级缓存功能。使用 Caffeine 作为一级本地缓存,Redis 作为二级集中式缓存。支持缓存信息监控统计、支持缓存过期时间在注解上直接配置、支持缓存的自动刷新、缓存 Key 支持 SpEL 表达式、支持无感禁用一级缓存或二级缓存。通过缓存空值来解决缓存穿透问题、通过判断即将过期时发起异步加载缓存的方式来解决缓存击穿和雪崩问题。

安装相关盘古模块

<parent>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-parent</artifactId>
<version>latest.version.xxx</version>
<relativePath/>
</parent>

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-cache-layering

# layering-cache 多级缓存
layering-cache.stats=false
# redis单机
layering-cache.redis.database=1
layering-cache.redis.host=localhost
layering-cache.redis.port=6379
layering-cache.redis.password=
# redis集群
#layering-cache.redis.password=
#layering-cache.redis.cluster=127.0.0.1:6379,127.0.0.1:6378
layering-cache.redis.serializer=com.github.xiaolyuh.redis.serializer.JacksonRedisSerializer

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO

关键配置项说明

配置项
配置说明
layering-cache.stats缓存监控统计开关,缺省true
layering-cache.redis.serializerRedis序列化方式

基于注解声明

直接在需要缓存的方法上加上 @Cacheable@CacheEvict@CachePut 注解。( @FirstCache@SecondaryCache 为注解配置项,不能单独使用)

@FirstCache

一级缓存配置项。

名称默认值说明
initialCapacity10缓存初始 Size
maximumSize5000缓存最大 Size
expireTime9缓存有效时间
timeUnitTimeUnit.MINUTES时间单位,默认分钟
expireModeExpireMode.WRITE缓存失效模式,ExpireMode.WRITE:最后一次写入后到期失效,ExpireMode.ACCESS:最后一次访问后到期失效

@SecondaryCache

二级缓存配置项。

名称默认值说明
expireTime5缓存有效时间
preloadTime1缓存主动在失效前强制刷新缓存的时间,建议是 expireTime * 0.2
timeUnitTimeUnit.HOURS时间单位,默认小时
forceRefreshfalse是否强制刷新(直接执行被缓存方法)
magnification1非空值和 null 值之间的时间倍率,默认是 1。如 expireTime=60 秒,magnification=10,那么当缓存空值时,空值的缓存过期时间是 60/10=6 秒。

@Cacheable

表示用的方法的结果是可以被缓存的,当该方法被调用时先检查缓存是否命中,如果没有命中再调用被缓存的方法,并将其返回值放到缓存中。

名称默认值说明
cacheNames空字符串数组缓存名称
key空字符串缓存 key,支持 SpEL 表达式
depict空字符串缓存描述(在缓存统计页面会用到)
enableFirstCachetrue是否启用一级缓存
firstCache一级缓存配置
secondaryCache二级缓存配置
@Cacheable 范例代码
@Cacheable(cacheNames = "user", key = "#userId",
firstCache = @FirstCache(expireTime = 5),
secondaryCache = @SecondaryCache(expireTime = 10))
public UserVO getUser(Long userId) {
log.info("执行AnnotationBasedDemoService.getUser()");
// 从DB或其它资源渠道获取数据
UserVO userVO = new UserVO();
userVO.setId(userId);
userVO.setName("钱学森");
return userVO;
}

@CachePut

将数据放到缓存中,新增缓存。

名称默认值说明
cacheNames空字符串数组缓存名称
key空字符串缓存 key,支持 SpEL表达式
depict空字符串缓存描述(在缓存统计页面会用到)
enableFirstCachetrue是否启用一级缓存
firstCache一级缓存配置
secondaryCache二级缓存配置
@CachePut 范例代码
@CachePut(cacheNames = "user", key = "#userVO.id",
firstCache = @FirstCache(expireTime = 10),
secondaryCache = @SecondaryCache(expireTime = 30))
public UserVO saveUser(UserVO userVO) {
log.info("执行AnnotationBasedDemoService.saveUser()");
return userVO;
}

@CacheEvict

删除缓存。

名称默认值说明
value空字符串数组缓存名称,cacheNames 的别名
cacheNames空字符串数组 缓存名称
key空字符串缓存 key,支持 SpEL 表达式
allEntriesfalse是否删除缓存中所有数据,默认情况下是只删除关联 key 的缓存数据,当该参数设置成 true 时 key 参数将无效
@CacheEvict 范例代码
@CacheEvict(cacheNames = "user", key = "#userId")
public void delUser(Long userId) {
log.info("执行AnnotationBasedDemoService.delUser()");
}

@CacheEvict(cacheNames = "user", allEntries = true)
public void delAllUsers() {
log.info("执行AnnotationBasedDemoService.delAllUsers()");
}

基于 API 编程

可以直接使用 Laying Cahce 提供的 API 进行硬编码操作两级缓存,但不建议使用。这里就不做详细讲解了,可以在参考范例的 ApiBasedDemoService 类中找到相关的代码。

启动入口

需要 @EnableLayeringCache 注解的加持。如下代码所示。

@EnableLayeringCache
@SpringBootApplication
public class LayeringCachePanguApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(LayeringCachePanguApplication.class).run(args);
}
}
快速 QA:可以禁用一级缓存,只使用二级缓存吗?
必须可以。设置 enableFirstCache = false 即可。
快速 QA:可以禁用二级缓存,只使用一级缓存吗?
可以。设置二级缓存 expireTime 为 0 即可。
快速 QA:我可以用 Spring Cache 的 RedisTemplate API 吗?
可以。Laying Cache 和 Spring Cache 相互隔离的,你只要在配置文件加入 Spring Cache 的配置,就可以注入 RedisTemplate 直接使用了。可以单独使用,也可以和 Laying Cache 混合使用。具体用法可以参考范例:pangu-examples-cache-single。

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/mq/index.html b/docs/docs/advanced-guide/mq/index.html index aa452f5b18a4a26352de6e71b5ad3de2ba5a20cd..4e80dd6e3af45813cc25b7fc27cba74080c42404 100644 --- a/docs/docs/advanced-guide/mq/index.html +++ b/docs/docs/advanced-guide/mq/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 异步通信 | 服务解耦 | 消峰填谷 | 缓存同步| 消息队列 MQ | RabbitMQ - - + +
跳到主要内容

消息队列

盘古开发框架缺省使用的消息队列中间件是 RabbitMQ。消息队列在分布式系统的异步通信、服务解耦、消峰填谷、缓存同步等应用场景下有广泛的使用。

安装相关盘古模块

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-rabbitmq-spring-boot-starter</artifactId>
</dependency>

队列规划

建议

建议提前规划队列结构模型,而不是通过客户端 API 动态创建消息交换机和绑定队列。

根据应用场景和业务类型先规划设计出队列结构模型,然后分别将队列相关信息分配给生产侧和消费侧开发人员。本教程使用的队列模型如下图所示。

队列规划

图示说明

上图所示虚拟机、交换主机、队列、路由类型、路由键等为 RabbitMQ 中间件的概念。本文对其做如下简要描述,详细信息请查阅 RabbitMQ 相关文档。

  • 虚拟主机(Virtual Host)
    一个资源管理概念,用作逻辑隔离。不同 Vhost 之间的 Exchange 和 Queue 相互隔离,互不干扰。
  • 交换机(Exchange)
    生产者将消息发送到 Exchange 中,Exchange 根据消息的属性或内容将消息路由到一个或多个 Queue 中(或者丢弃),Consumer 从 Queue 中拉取消息进行消费。
  • 路由类型
    交换机的关键属性。包括:Direct、Fanout、Topic。
    • Direct:该类型的交换机会把消息路由到与路由键完全匹配的 Queue 中。
    • Fanout:该类型的交换机会将消息路由到所有与其绑定的 Queue 中。
    • Topic:该类型的交换机会支持多条件匹配和模糊匹配将消息路由至与其绑定的 Queue 中。(本文不讲解,一般情况使用 Direct、Fanout 即可)
  • 路由键
    当交换机路由类型为 Direct 或 Topic 时,交换机绑定队列时需要设置路由键,给交换机发送消息时需要带上这个参数,交换机根据路由类型和路由键匹配规则将消息投递到合适的队列等待消费。(Direct 是精确匹配、Topic 是模糊匹配、Fanout 不需要路由匹配)

创建队列

本文以腾讯云 TDMQ (RabbitMQ 版本) 为例。TDMQ RabbitMQ 版是一款腾讯研发的消息队列服务,支持 AMQP 0-9-1 协议,完全兼容开源 RabbitMQ 的各个组件与概念。因此,本教程也适用原生开源 RabbitMQ 中间件和兼容开源 RabbitMQ 的其它云端消息服务。

在控制台创建队列及相关组件如下图所示。

虚拟主机

消息生产者

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-mq-rabbitmq-sender

spring.rabbitmq.host=jzaep3orxb2b.public.tencenttdmq.com
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=vhost-pangu

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO

消息发送代码

@Slf4j
@Component
public class SendService {
@Autowired
private RabbitTemplate rabbitTemplate;

/**
* 发送消息到Fanout交换机
* @return
*/
public void sendMsg1FanoutBased(){
String msg = "我是云南大熊(Fanout), " + DateUtil.now();
// 参数说明:参数1:交换机名称。 参数2:routing key 参数3:消息内容
rabbitTemplate.convertAndSend("exchange-fanout", "", msg);
log.info("消息发送成功。{}", msg);
}

/**
* 发送消息到Direct交换机
* @return
*/
public void sendMsg1DirectBased(String routingKey){
String msg = "我是云南大熊(Direct), " + DateUtil.now();
// 参数说明:参数1:交换机名称。 参数2:routing key 参数3:消息内容
rabbitTemplate.convertAndSend("exchange-direct", routingKey, msg);
log.info("消息发送成功。{}", msg);
}
}
提示

发送消息到 Fanout 交换机时,路由键参数为空;发送消息到 Direct 交换机时候路由键根据上图(队列规划)传参。(如:Key-1、Key-2)。

消息消费者

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-mq-rabbitmq-receiver

spring.rabbitmq.host=jzaep3orxb2b.public.tencenttdmq.com
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=vhost-pangu
# 开启ACK NONE|MANUAL|AUTO(default)
spring.rabbitmq.listener.simple.acknowledge-mode=manual

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO

关键配置项说明

  • 消息确认模式配置项(spring.rabbitmq.listener.simple.acknowledge-mode
    • NONE:无消息确认支持。消息一旦从队列取出即被永久删除。
    • AUTO:自动确认(缺省配置)。消费代码抛出异常则重新将消息放入队列,无异常则抛出则确认消费。
    • MANUAL:手工确认。如下代码根据业务逻辑进行手工确认消息。

消息监听代码

@Component
public class Queue1Listener {

@RabbitHandler
@RabbitListener(queues = "queue-1")
public void receiveMsg(Message message, Channel channel) throws IOException {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
log.info("接收消息(queue-1):{}", new String(message.getBody()));
// do business...
channel.basicAck(deliveryTag, false);
} catch (Exception e) {
log.error("消费出错了", e);
channel.basicNack(deliveryTag, true, true);
}
}
}

如上为 queue-1 的监听代码,其余类似。如果 ACK 消息确认模式为自动模式则消费代码不需要 try 结构。

测试

消费者:启动消费监听程序

@SpringBootApplication
public class RabbitmqReceiverApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(RabbitmqReceiverApplication.class).run(args);
}
}

生产者:执行测试用例发送消息

/**
* 发送消息交换机
*/
@Test
public void sendMsg() {
//发送消息到Fanout交换机
sendService.sendMsg1FanoutBased();
//发送消息到Direct交换机
sendService.sendMsg1DirectBased("key-1");
//发送消息到Direct交换机
sendService.sendMsg1DirectBased("key-2");
}

测试结果截图

生产者

生产者

消费者

消费者

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/nacos-config-center/index.html b/docs/docs/advanced-guide/nacos-config-center/index.html index e8caa9174b8a91f1b1ad8116d650f1db4d211a38..a2927a2fdb89cfb024fddc3cc29a40f170ce7aa4 100644 --- a/docs/docs/advanced-guide/nacos-config-center/index.html +++ b/docs/docs/advanced-guide/nacos-config-center/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | Nacos | 配置动态化 | 配置中心化 | 配置外部化 - - + +
跳到主要内容

配置中心

配置中心作为分布式微服务开发的标配组件,业界已有很多成功的典型应用,如:携程 Apollo 分布式配置中心、百度 Disconf 分布式配置中心等。盘古配置中心基于阿里的 Nacos 提供动态配置服务。

警告

鉴于文档可读性,盘古教程和参考范例都使用的本地配置的方式。本文将介绍如何基于配置中心让盘古应用获得动态配置服务的能力。在实际应用中,如无特殊需求我们一般都建议采用配置中心的方式来开发。

配置中心介绍

Nacos 动态配置服务可以让你以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。它还提供了一个简洁易用的 UI 帮助你管理所有的服务和应用的配置,包括配置版本跟踪、金丝雀发布、一键回滚配置等一系列开箱即用的配置管理特性,帮助你更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

快速 QA:前文中 Nacos 用于服务注册,为什么配置中心也是它?
Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。致力于发现、配置和管理微服务,完美的整合了配置中心和服务注册中心。因此,Nacos 不仅是服务注册中心也是功能完善的分布式配置中心。
快速 QA:单体分层架构的开发模式也可以使用配置中心进行配置吗?
配置中心是分布式微服务架构开发环境下强烈建议的必选标配组件。但如果你是基于单体分层架构开发,配置中心也是一样可以使用的。对于这些基础能力,无论是微服务还是单体,盘古框架都做了完美适配,只需要依赖 `pangu-spring-boot-starter` 就可以实现开箱即用。

相关名词解释

命名空间

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

配置管理

系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。

配置项

一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别( logLevel=INFO|WARN|ERROR )就是一个配置项。

配置集

一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

配置集ID

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。(比如:使用应用名称作为 Data ID)

配置快照

Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期( expiration )的概念。

本地配置与配置中心对比

  • 本地配置(配置文件)
    • 配置分散、与应用耦合、静态配置
    • 无环境隔离无版本支持,容易引发生产事故
    • 无安全审计
  • 配置中心
    • 配置集中、外部化、动态化实时生效
    • 多环境隔离多版本支持,较安全
    • 配置权限控制、操作变更审计

配置中心实战

下面介绍一个使用配置中心的例子。其它基于本地配置的范例都可以参考这个例子改为基于配置中心的动态配置。

安装相关盘古模块

<parent>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-parent</artifactId>
<version>latest.version.xxx</version>
<relativePath/>
</parent>

本地配置

基于配置中心的配置也是需要一个本地配置文件的,但这个配置文件是固定的模版格式。用于配置一些与配置中心进行数据通信相关的基础类参数。如下所示。

spring.application.name=pangu-examples-config-remote-nacos
spring.profiles.active=${spring.profiles.active:dev}
nacos.config.bootstrap.enable=true
nacos.config.bootstrap.log-enable=true
nacos.config.auto-refresh=true
nacos.config.namespace=${nacos.namespace:pangu-dev}
nacos.config.server-addr=${nacos.server-addr:127.0.0.1:8848}
#nacos.config.type=yaml
nacos.config.type=properties
nacos.config.data-id=${spring.application.name}

关键配置项说明

  • nacos.config.auto-refresh
    配置中心的配置变更后自动刷新到配置客户端
  • nacos.config.namespace
    命名空间(注意是对应命名空间的 ID 值),建议使用命名空间来区分部署环境
  • nacos.config.server-addr
    配置中心通信地址
  • nacos.config.type
    配置中心使用的配置格式( properties、yaml 等)
  • nacos.config.data-id
    配置中心某配置集的唯一标识

配置中心配置

在进行完上述本地配置后,我们的应用就能和配置中心进行数据同步了。现在根据本地配置信息在配置中心创建相对应的命名空间和同名 data-id 的配置集。

快速 QA:客户端是如何与 Nacos 配置中心进行数据同步的?
客户端通过 http 长轮询机制拉取 nacos server 端的配置数据,并会在本地创建配置快照(容灾)。在长轮询的超时等待过程中,nacos server 端如果配置发生改变,会主动将配置写入 response 并返回,模拟了“推送”效果。所以客户端能实时感知配置中心的配置变化。

创建命名空间

在 Nacos 管理系统的『命名空间』菜单新建 ID 为 pangu-dev 的命名空间(此 ID 即为上述配置项 nacos.config.namespace 的值)。如下图所示。

创建命名空间

创建配置集

一个命名空间下可以创建多组配置集,每个配置集由 data-id 来唯一标识。在 Nacos 管理系统的『配置管理-配置列表』菜单新建 data-id 值为 pangu-examples-config-remote-nacos 的配置集。如下图所示。

创建配置集

启动入口

@SpringBootApplication
public class NacosConfigurationApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(NacosConfigurationApplication.class).run(args);
}
}

使用配置

至此,我们就可以在应用中使用 @NacosValue 注解来获取配置项了。如下代码所示。

/**
* 开启 autoRefreshed配置项, 可以实现参数的动态刷新
*/
@NacosValue(value = "${demo.app.id}")
private String appId;
@NacosValue(value = "${demo.app.name}", autoRefreshed = true)
private String appName;
@NacosValue(value = "${demo.app.author}", autoRefreshed = true)
private String appAuthor;
快速 QA:范例只演示了几个简单的变量参数,数据库等中间件的连接配置信息可以放配置中心吗?
当然是可以的,干就完了。

彩蛋:基于配置中心的日志级别热切换

为了增强日志输出的可观测性,盘古基础模块实现了基于配置中心的日志级别热切换能力。只需要在配置中心修改或新增日志级别配置,则对应的日志输出级别即刻实时生效。

#日志
logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/nacos-regist-center/index.html b/docs/docs/advanced-guide/nacos-regist-center/index.html index 5057bae4df51bd11b5d0d8ba00203b19c555ae01..a625a64fff9dd9233cd7a6b405675bebb09d8fc3 100644 --- a/docs/docs/advanced-guide/nacos-regist-center/index.html +++ b/docs/docs/advanced-guide/nacos-regist-center/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 服务发现和服务健康监测 | 动态配置服务 | 动态 DNS 服务 | 服务及其元数据管理 | Nacos - - + +
跳到主要内容

注册中心

注册中心是分布式微服务开发的标配组件,盘古服务注册中心借助 Nacos 提供动态服务注册和服务发现能力。

注册中心介绍

服务注册中心是以服务为中心架构,实现服务化管理的核心组件。类似于目录服务的作用,主要用来存储服务实例信息,譬如提供者地址、路由信息等。服务注册中心是微服务架构中必选的标配基础设施之一。

相关名词解释

注册中心

存储服务实例和服务负载均衡策略的系统。

服务注册

将服务实例地址和元数据信息写入服务注册中心的过程。

服务发现

在计算机网络上,使用服务名对服务的实例地址和元数据进行探测,并以预先定义的接口提供给客户端进行查询。

健康检查

以指定方式检查服务下挂载实例的健康度,从而确认该实例是否能提供服务。根据检查结果,实例会被判断为健康或不健康。对服务发起解析请求时,不健康的实例不会返回给客户端。

注册中心图示

盘古开发框架注册中心图示

注册中心实战

请参考本指南的 快速开始->如何开发微服务 章节,那里已经详细完整的讲解了服务注册&服务发现的相关内容。

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/advanced-guide/readwrite-splitting/index.html b/docs/docs/advanced-guide/readwrite-splitting/index.html index 72ecb1e65024e01b450a5649cd70947c73e75d7c..0f6b274b14e8cf7783d5a1b2ae81c678c99b728d 100644 --- a/docs/docs/advanced-guide/readwrite-splitting/index.html +++ b/docs/docs/advanced-guide/readwrite-splitting/index.html @@ -4,8 +4,8 @@ 盘古开发框架 | 读写分离 | 数据分片 | 数据加密 | 数据治理 | ShardingSphere-JDBC - - + +
@@ -17,7 +17,7 @@ 通过 ORM 框架(Hibernate、Mybatis 等)的插件、拦截器机制实现。这只能算是特定环境下的一种实现方法,不能作为一套完整的标准化解决方案。故在此不做更多描述。

实现方式
可选组件
优点
缺点
数据库代理模式ShardingSphere-Proxy
MyCat
多语言支持
独立部署(升级简单)
对开发完全透明
独立部署(增加不稳定因素)
运维成本高
性能损耗高
数据源代理模式 💋 ShardingSphere-JDBC集成简单、轻松驾驭
性能较好
嵌入 JAR(升级麻烦)
日常数据维护麻烦
ORM 框架代理模式自研/硬编码硬撸一时爽事后火葬场
警告

盘古开发框架使用 ShardingSphere-JDBC 组件,通过数据源代理的方式实现读写分离功能。

编程实战

本实例以一主二从的数据库主从集群为例,来演示如何基于盘古框架开发一个读写分离且支持读负载均衡的范例程序。

初始化数据库环境

主库 DB
create table t_order
(
order_id bigint auto_increment primary key,
user_id int not null,
status varchar(50) null
)
comment '订单表';

根据上述脚本,再创建从库 1 和 从库 2 的 t_order 表。(仅演示读写分离效果,不搭建真实主从复制集群,可手工插入从库所需测试数据)

安装相关盘古模块

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-data-governance-spring-boot-starter</artifactId>
</dependency>

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心章节。

spring.application.name=pangu-examples-shardingsphere-readwrite-splitting

mybatis-plus.mapperLocations=classpath*:/mapper/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# print shardingsphere Actual SQL log
spring.shardingsphere.props.sql-show=true
spring.shardingsphere.datasource.names=ds-master,ds-slave-1,ds-slave-2

# 主库数据源配置
spring.shardingsphere.datasource.ds-master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-master.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples
spring.shardingsphere.datasource.ds-master.username=root
spring.shardingsphere.datasource.ds-master.password=123456

# 从库 1 数据源配置
spring.shardingsphere.datasource.ds-slave-1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-slave-1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-slave-1.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples-0
spring.shardingsphere.datasource.ds-slave-1.username=root
spring.shardingsphere.datasource.ds-slave-1.password=123456

# 从库 2 数据源配置
spring.shardingsphere.datasource.ds-slave-2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-slave-2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-slave-2.jdbc-url=jdbc:mysql://localhost:3306/pangu-examples-1
spring.shardingsphere.datasource.ds-slave-2.username=root
spring.shardingsphere.datasource.ds-slave-2.password=123456

# 读写分离策略配置
spring.shardingsphere.rules.readwrite-splitting.data-sources.pangu-rws.type=Static
# 写数据源配置
spring.shardingsphere.rules.readwrite-splitting.data-sources.pangu-rws.props.write-data-source-name=ds-master
# 读数据源配置
spring.shardingsphere.rules.readwrite-splitting.data-sources.pangu-rws.props.read-data-source-names=ds-slave-1,ds-slave-2
# 读负载均衡算法配置
spring.shardingsphere.rules.readwrite-splitting.load-balancers.read-random.type=RANDOM

测试用例

启动类

@EnableTransactionManagement
@SpringBootApplication
public class ReadWriteSplittingApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(ReadWriteSplittingApplication.class).run(args);
}
}

测试写操作自动走主库

@Test
public void writeRoute() {
TOrderEntity entity = new TOrderEntity().setUserId(1).setStatus("测试");
tOrderMapper.insert(entity);
}

测试读操作自动走从库负载均衡

@Test
public void readRoute() {
tOrderMapper.selectById(1508317805991194627L);
tOrderMapper.selectById(1508317805991194628L);
}

测试读操作强制走主库

@Test
public void readByWriteRoute() {
HintManager hintManager = HintManager.getInstance();
hintManager.setWriteRouteOnly();
try {
log.info("查询数据(强制走主库)...");
TOrderEntity entity = tOrderMapper.selectById(2L);
log.info("查询结果 {}", entity);
} finally {
hintManager.close();
}
}

测试事务方法自动走主库

事务方法里的所有读写操作都自动走主库。

@Test
@Transactional(rollbackFor = RuntimeException.class)
public void doWithTransaction() {
log.info("插入数据...");
TOrderEntity entity = new TOrderEntity().setUserId(1).setStatus("测试");
tOrderMapper.insert(entity);
log.info("查询数据(事务方法内所有请求自动走主库)...");
tOrderMapper.selectById(1L);
}

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/code-generator/index.html b/docs/docs/code-generator/index.html index 66d88cc59c4320c89049e64c73fea595b4ce412e..3cb9d4ae03311c6476bc9dfd177cca5c52f56721 100644 --- a/docs/docs/code-generator/index.html +++ b/docs/docs/code-generator/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 代码生成器插件 - - + +
跳到主要内容

代码生成器插件

盘古代码生成器是基于 Maven 的一个自定义插件。可以方便快捷的以插件的方式安装到任何一个 Maven 模块中去。目前支持生成如下代码。

  • MyBatis Plus Mapper.java 映射接口文件
  • MyBatis Plus Entity.java 实体文件
建议

根据实践经验,不建议使用 MyBatis Plus 的生成器,更不建议生成 Mybatis Plus 风格的 Service 文件。

安装 Maven 插件

pom.xml
<plugin>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-framework-generator-maven-plugin</artifactId>
<version>5.0.6</version>
<configuration>
<url>jdbc:mysql://127.0.0.1:3306/pangu-showcases</url>
<user>root</user>
<password>root123456</password>
<tables>user,resource</tables>
<author>xiongchun</author>
<entityFilePath>${project.basedir}/src/main/java/com/gitee/pulanos/pangu/showcases/crud/dao/entity</entityFilePath>
<mapperFilePath>${project.basedir}/src/main/java/com/gitee/pulanos/pangu/showcases/crud/dao/mapper</mapperFilePath>
</configuration>
</plugin>

插件参数说明

配置项
配置说明
url数据库连接地址
user数据库用户名
password数据库密码
tables目标数据库表,多个表用逗号分割
author源代码文件的作者签名
entityFilePath实体类文件输出路径(根据此路径推导包结构)
mapperFilePathMapper 类文件输出路径(根据此路径推导包结构)
提示
  • 上表中输出路径参数可以是基于 ${project.basedir} 的相对路径,也可以是绝对路径。
  • 微服务开发中实体类文件一般是生成到服务接口包里,与服务消费方共享。(可以在接口包模块安装此插件,或者在服务实现模块将实体类生成路径直接指向接口包)

运行Maven插件

方式一

通过 IDEA 或 Eclipse 等开发工具来执行名为 pangu 的 Maven 插件。如下图所示。

盘古代码生成器

方式二

通过 Mavne 脚本执行。如下所示。

命令行脚本
cd pom.xml所在的更目录
mvn pangu:generate

输出结果

控制台输出日志
xc@xc-mac pangu-examples-crud % mvn pangu:generate
[INFO] Scanning for projects...
[INFO]
[INFO] ------------< com.gitee.pulanos.pangu:pangu-examples-crud >-------------
[INFO] Building pangu-examples-crud 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- pangu-framework-generator-maven-plugin:5.0.6:generate (default-cli) @ pangu-examples-crud ---
[INFO] 开始生成数据表[user]对应的实体对象...
[INFO] UserEntity.java 生成成功。文件路径:/Users/xc/git2/pangu-framework/pangu-examples/pangu-examples-crud/src/main/java/com/gitee/pulanos/pangu/showcases/crud/dao/entiity.java
[INFO] 开始生成数据表[user]对应的数据访问接口...
[INFO] UserMapper.java 生成成功。文件路径:/Users/xc/git2/pangu-framework/pangu-examples/pangu-examples-crud/src/main/java/com/gitee/pulanos/pangu/showcases/crud/dao/mapper/UserMapper.java
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.291 s
[INFO] Finished at: 2021-11-15T21:54:22+08:00
[INFO] ------------------------------------------------------------------------

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/deploy-guide/basic/index.html b/docs/docs/deploy-guide/basic/index.html index 8d6dd703af96bcdac86a5c63e20b60a3bf0bd1b6..c502132c4e7e82ae028c78bbc095c421a979b811 100644 --- a/docs/docs/deploy-guide/basic/index.html +++ b/docs/docs/deploy-guide/basic/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 部署运维指南 - - + +
跳到主要内容

部署相关

打包脚本

mvn clean package

启动脚本

部署流程和方法工具众多,大家可自由发挥。这里仅给出最基础的启动脚本供参考。

nohup java -jar -Dactive=test xxxxx.jar &

启动参数

根据不同的配置模式和启动模块类型,可能还需要追加一些参数信息。比如:

  • Nacos地址(配置中心、注册中心):-Dnacos.server-addr=127.0.0.1:8888
  • Nacos命名空间(配置中心、注册中心):-Dnacos.namespace=pangu-test
  • ...

其它JVM优化参数、日志参数

根据自身需求自行裁定。

参考部署架构

Coming soon...

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/deploy-guide/log/index.html b/docs/docs/deploy-guide/log/index.html index 0bc145c45a27267f007c541e9c70cf0b79841206..97b8b1983a068ee98cda1c55a8a6e7075b3fd7d4 100644 --- a/docs/docs/deploy-guide/log/index.html +++ b/docs/docs/deploy-guide/log/index.html @@ -4,8 +4,8 @@ 盘古开发框架 | 分布式日志追踪 | 日志级别热切换 | 部署运维指南 - - + +
@@ -13,7 +13,7 @@ 业界也有诸多成熟方案。如 SkyWalking,Pinpoint 等,但其运维成本和数据存储成本均不可小觑。如果有相应的资源去做那它们自然是不二之选。 但如果你资源有限,那么这里给出一个非常轻量的通过集成 TLog 来解决日志追踪问题的方案。

什么是 TLog ?

TLog提供了一种最简单的方式来解决日志追踪问题,它不收集日志,也不需要另外的存储空间,它只是自动的对你的日志进行打标签,自动生成TraceId贯穿你微服务的一整条链路。并且提供上下游节点信息。

如何使用

TLog 已经作为一个标准缺省组件集成进了 pangu-spring-boot-starter 盘古基础模块。使用的时候只需要再启动类中加入如下静态代码块就可以。

static {
AspectLogEnhance.enhance();
}

实际日志输出效果

我们在一个 Dubbo 服务消费者和一个 Dubbo 服务生产者应用中分别做如上配置后,就可以在每个调用链的日志里看到 TLog 自定嵌入的 TraceId 标签值 10812814178142336。如下所示。

消费端:
2022-06-23 14:40:50 INFO 47050 - [nio-8080-exec-1] c.x.DemoController : < 0 >< 10812814178142336 > call case1...
生产端:
2022-06-23 14:40:50 INFO 46395 - [:20881-thread-4] c.x.UserServiceImpl : < 0.1 >< 10812814178142336 > 参数userIn:UserInDto(name=null, userType=1)

如果是 HTTP 调用,则 TraceId 标签值 10812814178142336 会写入到 HTTP 请求的响应标题中。如下所示。

tlogTraceId: 10812814178142336

以上 DEMO 案例代码可在如下范例中找到。

  • pangu-examples-dubbo-service
  • pangu-examples-webapi-dubbo-service-based

日志级别热切换

为了增强日志输出的可观测性,盘古基础模块实现了基于配置中心的日志级别热切换能力。只需要在配置中心修改或新增日志级别配置,则对应的日志输出级别即刻实时生效。

#配置中心配置日志
logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/examples-list/index.html b/docs/docs/examples-list/index.html index 7c9552c546dc583a794ec8483ed10a5bd33a40cb..dbe91ba00dd4924a839605365ac839e2310ebea0 100644 --- a/docs/docs/examples-list/index.html +++ b/docs/docs/examples-list/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 范例模版工程 | 获取范例代码 - - + +
跳到主要内容

范例模版工程

信息

pangu-examples 项目收录了和盘古开发相关的各种范例供新手入门参考。 Gitee 获取范例代码

模块目录说明

pangu-examples-empty-springboot-based

  1. 创建一个基于原生 SpringBoot 框架的空应用

pangu-examples-empty

  1. 创建一个基于盘古框架的空应用

pangu-examples-empty-web

  1. 创建一个基于盘古框架的 Web 空应用。

pangu-examples-config-remote-nacos

  1. 基于 Nacos 配置中心进行配置管理的盘古应用开发模式。
    • 如何获取 Nacos 配置中心的远程配置参数
    • 参数值修改后动态刷新 Nacos 配置数据

pangu-examples-config-local

  1. 基于本地配置文件进行配置管理的盘古应用开发模式。

pangu-examples-log-dynamic

  1. 如何在线热切换日志输出级别。

pangu-examples-crud

  1. 使用盘古代码生成 Maven 插件生成 DAO 相关 Mapper 接口和 Entity 实体类。
  2. 使用 MybatisPlus 的 API 接口操作数据库的常用方法。
  3. 分页查询和手工映复杂 SQL 的方法。

pangu-examples-cache-layering

  1. 如何使用两级缓存(本地缓存 + Redis 集中缓存)。

pangu-examples-cache-single

  1. 如何使用 Spring Cache 的一级缓存 RedisTemplate API。

pangu-examples-lock-redis-based

  1. 如何使用基于 Redis 的分布式锁(注解式、API 式)。

pangu-examples-dubbo-api

  1. 开发 Dubbo 服务时接口文件和 POJO 相关类的打包模块。

pangu-examples-dubbo-service

  1. 如何开发一个 Dubbo 远程服务并将其注册到 Nacos 服务中心。
  2. 演示分布式链路日志追踪。

pangu-examples-dubbo-gateway-service

  1. 如何开发一个 Dubbo 远程服务并将其注册到网关管理中心ShenYu Admin。

pangu-examples-dubbo-consumer

  1. 如何调用一个已注册到 Nacos 服务中心的 Dubbo 远程服务。

pangu-examples-webapi-local-service-based

  1. 基于 SpringMVC 将本地服务发布为 HTTP 接口。

pangu-examples-webapi-dubbo-service-based

  1. 基于 SpringMVC 将 Dubbo 服务发布为 HTTP 接口。
  2. 演示分布式链路日志追踪。

pangu-examples-webapi-gateway-based

  1. 基于 ShenYu 网关通过泛化调用将 Dubbo 服务发布为 HTTP 接口。

pangu-examples-mq-rabbitmq-sender

  1. 基于 RabbitMQ 的消息队列范例(生产者)。

pangu-examples-mq-rabbitmq-receiver

  1. 基于 RabbitMQ 的消息队列范例(消费者)。

pangu-examples-seata-at-*

  1. 基于 Seata AT 模式的分布式事务范例。

pangu-examples-shardingsphere-readwrite-splitting

  1. 如何开发一个读写分离且支持读负载均衡的范例程序。

pangu-examples-shardingsphere-sharding

  1. 如何开发一个数据分片的范例程序。

获取范例代码

Gitee 获取范例代码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/faq-service/index.html b/docs/docs/faq-service/index.html index b5c2dee8acd81fa7c00c92b72d894dd97f34eaf0..1c6a9509dd8cd0bfa66a5c04b39c859fad0f61e6 100644 --- a/docs/docs/faq-service/index.html +++ b/docs/docs/faq-service/index.html @@ -4,14 +4,14 @@ 常见问答 | 盘古 Admin - - + +
跳到主要内容

日常开发常见问答

1. 盘古服务开发框架和 Spring CloudSpring Cloud Alibaba 是什么关系?

没有直接关系。「盘古开发框架」直接基于阿里的 Nacos、Seata、Sentinel 和 Apache 的 Dubbo、ShardingSphere 等分布式中间件输出微服务架构的能力。是一套完全独立于 Spring Cloud 生态的轻量灵活、成熟可靠的工业级分布式微服务开发和治理框架。相较于 SC 和 SCA 而言,简单、纯洁、不被污染和绑架、易扩展好维护是其显著特点。

2. 盘古服务开发框架可以做单体开发吗?

可以。从纯技术角度看,盘古服务开发的最佳姿势是 分布式微服务开发,但也支持搭建 垂直单体分层架构的开发模式

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/install/index.html b/docs/docs/install/index.html index 8941cf466b79a4c780ab47b17289f9298745536d..93dc96f2f93614034f75937403d25babbd9fbe84 100644 --- a/docs/docs/install/index.html +++ b/docs/docs/install/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 安装 | 依赖管理模块 | 基础模块 | Dubbo模块 | JDBC模块 | 分布式事务管理模块 | 数据治理模块 | 缓存模块 | 消息队列模块 | 网关模块 | Web模块 | 代码生成插件 - - + +
跳到主要内容

安装

盘古服务开发框架已经发布到 Maven 中央仓库,直接使用如下方法安装使用即可。

依赖管理模块

盘古资源依赖声明管理模块。所有盘古引用都应该依赖这个模块。

<parent>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-parent</artifactId>
<version>${最新稳定版本}</version>
<relativePath/>
</parent>

基础模块

盘古启动、中心化配置、动态日志等基础能力自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-spring-boot-starter</artifactId>
</dependency>

Dubbo模块

盘古微服务开发自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-dubbo-spring-boot-starter</artifactId>
</dependency>

JDBC模块

盘古数据库持久化操作自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-jdbc-spring-boot-starter</artifactId>
</dependency>

分布式事务管理模块

盘古 Seata 分布式事务自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-seata-spring-boot-starter</artifactId>
</dependency>

数据治理模块

盘古 ShardingSphere 数据治理(如:读写分离、数据分片、数据加密等)自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-data-governance-spring-boot-starter</artifactId>
</dependency>

缓存模块

盘古缓存开发自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-cache-spring-boot-starter</artifactId>
</dependency>

消息队列模块

盘古 RabbitMQ 消息队列开发自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-rabbitmq-spring-boot-starter</artifactId>
</dependency>

Web模块

盘古 Web 应用自动装配模块。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-web-spring-boot-starter</artifactId>
</dependency>

代码生成插件

盘古代码生成器 Maven 插件。

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-generator-maven-plugin</artifactId>
</dependency>

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/intro/index.html b/docs/docs/intro/index.html index 1d9c908bcc83eece666423744140937d60515aab..60b030079e1f0a827a962af0db83bfb5f374db71 100644 --- a/docs/docs/intro/index.html +++ b/docs/docs/intro/index.html @@ -4,14 +4,14 @@ 盘古框架文档 | 盘古服务开发框架简介 - - + +
跳到主要内容

简介

盘古服务开发框架(PanGu Service Framework)以 Dubbo、Nacos 和 Spring Boot 为核心架构,可在云原生时代构建以「服务」为中心的现代应用架构,帮助用户在云环境中更好的构建、交付和管理自己的微服务平台(也兼容支持垂直单体分层架构开发模式)。

设计原则

在类设计、模块结构划分、技术组件选型、框架体系架构设计时会优先遵循的一些设计范式和指导原则。

  • 极简原则
    大道至简,简单代表好用、稳定、易协作。坚持「Keep it Simple & Stupid」设计理念。
  • 最佳实践原则
    通过大量的生产实例检验,沉淀复用最佳实践。
  • 无为而治原则
    不求大而全,轻量灵活保持架构的纯洁与透明,坚持「Less is More」设计理念。
  • 服务优先原则
    「服务」是盘古开发框架的一等公民,旨在微服务和云原生范式基础上构建「以服务为中心」的现代应用架构。
  • 一致性原则
    双架构支持,既是分布式微服务架构的工业级首选,同时也能兼容特定需求场景下的单体应用开发。

生态架构图

盘古开发框架生态架构图

主要功能

  1. 自定义的 Spring Boot 启动器,完成各功能组件的自动装配。
  2. 自研轻量 Maven 插件,支持各场景的模版代码生成。
  3. 配置参数外部化、动态化和中心化管理。
  4. 面向接口代理的高性能 RPC 服务调用。
  5. 支持服务调用智能容错和负载均衡、服务限流与熔断、可视化的服务治理与运维等。构建「以服务为中心」的现代应用架构服务平台。
  6. 强大的数据访问能力,内置通用 CRUD 接口;支持 Lambda 表达式;提供逻辑删除、乐观锁、分页、字段值填充等功能。
  7. 支持基于异步非阻塞模型的高性能 HTTP 网关通过泛化调用后端 Dubbo 服务。同时网关支持 HTTP 层的鉴权、动态限流、熔断、防火墙、灰度发布等。
  8. 提供靠谱的最终一致性分布式事务落地方案。
  9. 提供数据治理相关功能,如:读写分离、数据分片、数据加密等。
  10. 提供消息队列在异步通信、服务解耦、消峰填谷、缓存同步等应用场景下的使用能力。
  11. 提供分布式环境下的多级缓存功能(注解式和编程式)。Caffeine 作为一级本地缓存,Redis 作为二级集中式缓存。
  12. 支持可配置、可监控的分布式任务调度。
  13. 支持注解声明式和编程式对业务代码在分布式环境下加并发互斥锁。
  14. 应用日志输出级别动态切换、分布式日志跟踪等...

组件依赖

  • 基础核心组件

    • Spring Boot ※ Spring Framework
    • MyBatis (MyBatis Plus)
    • Apache Dubbo
    • Aliware Nacos
  • 扩展增强型组件

    • Apache ShardingSphere
    • Aliware Seata
    • Aliware Sentinel
    • Layering Cache
    • Lock4J
    • TLog
  • 辅助工具类组件

    • Lombok
    • Apache Commons
    • Google Guava
    • Hutool
  • 可选组件

    可选组件指由我们优选的做过适配或提供集成方案,但不作为盘古框架缺省或标配的组件。

    • Apache ShenYu
    • XXL Job

模块列表

  • pangu-parent
    盘古资源依赖声明管理模块
  • pangu-common
    盘古公共基础类库
  • pangu-spring-boot-starter
    盘古启动、中心化配置等基础能力自动装配模块
  • pangu-dubbo-spring-boot-starter
    盘古 Dubbo 服务开发自动装配模块
  • pangu-jdbc-spring-boot-starter
    盘古数据库持久化操作自动装配模块
  • pangu-cache-spring-boot-starter
    盘古缓存开发自动装配模块
  • pangu-web-spring-boot-starter
    盘古 Web 应用自动装配模块
  • pangu-rabbitmq-spring-boot-starter
    盘古消息队列自动装配模块
  • pangu-seata-spring-boot-starter
    盘古分布式事务自动装配模块
  • pangu-data-governance-spring-boot-starter
    盘古数据治理(读写分离、数据分片等)自动装配模块
  • pangu-generator-maven-plugin
    盘古代码生成器Maven插件
  • pangu-examples
    盘古框架模版化参考范例集

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/quick-start/how-to-create-http-api/index.html b/docs/docs/quick-start/how-to-create-http-api/index.html index e1bc765b19565b3917bea3d774e69f12555ec79b..06d5af724fe57883d1f49b059b41dfa08a0ac7d9 100644 --- a/docs/docs/quick-start/how-to-create-http-api/index.html +++ b/docs/docs/quick-start/how-to-create-http-api/index.html @@ -4,15 +4,15 @@ 盘古开发框架 | 网关开发模式简介 | 如何开发 HTTP API 接口 - - + +
跳到主要内容

如何基于微服务开发 Web 接口

在上文《如何开发微服务应用》中,已经介绍了如何开发一个微服务应用以及微服务模块之间的互相调用。本文介绍如何将微服务发布为 Web 接口供前端调用。

技术实现方案

在盘古开发框架下实现将微服务发布为 Web 接口有两种方式。一种是基于 Spring RestController 的接口调用模式;一种是基于 ShenYu 网关的泛化调用模式。

基于 Spring RestController 的接口调用模式

  • 实现原理
    基于 Spring RestController,依赖 Servlet 容器。
  • Dubbo 集成
    依赖接口 JAR ,通过接口调用 Dubbo 服务。
  • 性能 & 复杂度
    性能高,开发简单,部署运维简单。
  • 其它特性
    • 支持跨域配置、流量控制、鉴权、熔断、白名单等(配置简单且与盘古开发框架浑然一体)。
    • 提供了Controller聚合层,可一定程度上减少了微服务之间的循环依赖和调用。

基于 ShenYu 网关的泛化调用模式

  • 实现原理
    基于 Spring Webflex,依赖 Netty 框架或 Servlet 3.1+ 容器。
  • Dubbo 集成
    不依赖接口 JAR,泛化调用 Dubbo 服务。(需要维护接口元数据,且性能有损耗 10%~20%)
  • 性能 & 复杂度
    网关自身性能较高(Webflex非阻塞模型)。开发部署运维极其复杂,带来的成本不可小觑。
  • 其它特性
    支持流量控制、鉴权、熔断等(配置复杂)。
警告

上述是从不同维度简单粗暴的以定性的角度给出了一些比较,结论是孤立且脱离项目背景和业务场景的,仅供参考。采用什么样的开发模式不能一概而论,需要综合实际情况酌情选择。但对于大部分盘古开发项目而言,我们推荐整体性价比较高的方案一。当然,如果您的项目背景适合使用 ShenYu网关,我们也给出了详细的集成方案。详见:盘古开发框架集成 Apache ShenYu 网关

编程实战一:基于 Spring RestController 的接口调用模式

此种模式基于 SpringMVC 通过 Controller 调用后端 Dubbo 服务。依赖 Servlet 容器,需要引入服务接口包。对于 HTTP 接口层面的鉴权、流控等需求都需要基于拦截器来实现。高可用和性能提升可通过Caddy/Nginx 充当 API 网关 反向代理后端多个 Web 节点实现。

安装相关盘古模块

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-web-spring-boot-starter</artifactId>
</dependency>

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-webapi-dubbo-service-based
spring.jackson.time-zone=GMT+8

pangu.web.cross-origin=true

dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.consumer.timeout=5000
dubbo.registry.address=nacos://${nacos.server-addr}?namespace=${nacos.namespace}
dubbo.consumer.check=false

logging.level.root=INFO

调用微服务接口

可以在任何一个 SpringBean 组件中(针对网关模块而言一般是 Controller 中),引入服务接口后就像本地接口调用一样调用远程服务。Dubbo 将提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。 如下所示,通过 Cotroller 调用远程服务接口,实现将微服务接口发布为 WebAPI。

DemoController.java
// 注入 Dubbo 服务接口
@Reference(version = "1.0.0", group = "pangu-examples-dubbo-service")
private UserService userService;

/**
* 通过 Spring MVC 将 Duboo 微服务接口发布为 HTTP API
* @return
*/
@RequestMapping("/case1")
public Result<List<UserOut>> case1() {
log.info("call case1...");
UserIn userIn = new UserIn().setUserType("1");
List<UserOut> userOuts = userService.listUserOuts(userIn);
return Result.success(userOuts);
}

启动入口

@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(DubboProviderApplication.class).run(args);
}
}

本范例源码

编程实战二:基于 ShenYu 网关的泛化调用模式

盘古开发框架下发布 Dubbo 服务为 HTTP 接口的缺省标准姿势已调整为基于 pangu-web 模块的传统接口调用模式(见上文)。基于 ShenYu 网关的开发模式已降级为一种可选方案,其文档已迁移到了博客专栏。详见:盘古开发框架集成 Apache ShenYu 网关

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/quick-start/how-to-make-architecture/index.html b/docs/docs/quick-start/how-to-make-architecture/index.html index 227961b0e8d34d2e9daed5af9433c0b9ad71658e..5ea5a27a9366c564f2ac7701783efa5e5df5f5ec 100644 --- a/docs/docs/quick-start/how-to-make-architecture/index.html +++ b/docs/docs/quick-start/how-to-make-architecture/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 微服务分布式架构 | 单体分层架构 | 盘古开发架构选型对比 - - + +
跳到主要内容

开发架构模式对比

提示

盘古框架不会把用户绑定到一个固定的开发范式和架构上,而是支持随意组合、自动装配、灵活插拔。 既能构建大并发高可用的分布式微服务架构也能搭建小巧的垂直单体分层架构。

写在前面

软件架构的本质是一种在特定资源背景下折中平衡后追求业务增长的一门艺术。决定开发技术架构选型的因素很多。这里,我们简单的对两种不同开发架构模式进行客观比较,希望对大家在技术架构选型时能有所参考意义。

单体分层架构 VS 微服务分布式架构

-
单体分层架构微服务分布式架构
开发开发测试流程简单开发测试流程相对复杂
部署运维单机部署或集群部署(简单)、运维成本低分布式部署(略难)、运维成本高
团队人员团队围绕一个中心应用开发,对开发人员能力要求低。开发、维护成本相对较低。团队基于分布式多应用协作,对开发人员能力要求略高。开发、维护成本相对较高。
其它扩展性弱、可靠性低、技术创新能力弱、企业对代码等数字资产管控能力弱。扩展性强、可靠性高、技术创新能力强、企业对代码等数字资产管控能力高。
警报

上述指标对比均为相对结果,仅供参考。在特定项目资源、团队背景、业务场景等环境下,相关指标的相对高低强弱对比是会有偏差甚至反转的。

盘古开发架构选型建议

如下是从不同维度简单粗暴的以定量或定性的角度给出了一些选型建议,结论是孤立的脱离实际的,仅供参考。采用什么样的架构开发模式不能一概而论,需要大家综合当下实际情况 酌情选择 。 👻

-单体分层架构微服务分布式架构
开发人员 < 5
研发预算 < 100 w
用户数较小的管理类系统
面向C端的(移动)互联网应用
多任务多小组协作
有专职运维人员
追求可维护性和扩展性
追求技术团队长期收益 & 增长
甲方企业自建的技术团队

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/quick-start/how-to-make-microservice-architecture-app/index.html b/docs/docs/quick-start/how-to-make-microservice-architecture-app/index.html index 370c07263a67c8410d9015a2dee5848a0e01f1e1..692d6052e86afab97476557fb230306b8a0c7419 100644 --- a/docs/docs/quick-start/how-to-make-microservice-architecture-app/index.html +++ b/docs/docs/quick-start/how-to-make-microservice-architecture-app/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 如何开发微服务 | 服务提供者 | 服务消费者 - - + +
跳到主要内容

如何开发微服务应用

本文介绍如何基于盘古开发框架开发一个微服务应用。文中所述仅为搭建一个微服务应用的基本框架(服务注册&服务发现),如要增加配置中心、网关代理、数据持久化、缓存等能力请参考使用指南的相关章节。

服务提供者

安装相关盘古模块

<parent>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-parent</artifactId>
<version>latest.version.xxx</version>
<relativePath/>
</parent>

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.profiles.active=${spring.profiles.active:dev}

实现服务接口

声明接口 UserService.java
UserEntity findUserEntity(Long id);
实现接口 UserServiceImpl.java
@Service(version = "1.0.0", group = "pangu-showcases-dubbo-service")
public class UserServiceImpl implements UserService {
@Override
public UserEntity findUserEntity(Long id) {
log.info("参数ID:{}", id);
UserEntity userEntity = new UserEntity();
userEntity.setId(id);
userEntity.setName("云南码农大熊");
return userEntity;
}
}

启动入口

@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(DubboProviderApplication.class).run(args);
}
}
// 启动参数设置(如下示例)
// -Dnacos.server-addr=127.0.0.1:8848 -Dnacos.namespace=pangu-dev
提示

通过 @EnableDubbo 注解开启 Dubbo 支持。由于 Dubbo 的使用 netty 作为底层网络通信,所以缺省情况下微服务启动成功后观察控制台可知并没有 Tomcat 一类 Servlet 容器随之启动。

服务注册

成功启动应用会自动像 Nacos 服务注册中心注册服务。登录 Nacos 控制台即可在【服务管理->服务列表】页查看效果。如下图所示。

盘古开发Dubbo服务

服务消费者

上述服务注册到 Nacos 服务中心以后就可以对外提供服务了。可以在任何一个 SpringBean 组件中(一般是 Service、Manager 等),引入服务接口后就像本地接口调用一样调用远程服务。Dubbo 将提供高性能的基于代理的远程调用能力,为开发者屏蔽远程调用底层细节。服务消费端所需要的依赖和提供端是一样的,这里不再赘述。仅给出消费相关代码。如下所示。

服务消费端,调用远程服务代码 UserAdminManager.java
@Component
public class UserAdminManager {
@Reference(version = "1.0.0", group = "pangu-examples-dubbo-service")
private UserService userService;

public void findUserEntityById(Long id){
log.info("开始Dubbo远程调用...");
UserEntity userEntity = userService.findUserEntity(id);
log.info("[OK] 调用成功 {}", userEntity);
}
}

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/quick-start/how-to-make-monomer-architecture-app/index.html b/docs/docs/quick-start/how-to-make-monomer-architecture-app/index.html index 2195ca736611609ef45497d4505df18bda22869f..ca836180f863fe631347b539b6c6d0cdc30fdad9 100644 --- a/docs/docs/quick-start/how-to-make-monomer-architecture-app/index.html +++ b/docs/docs/quick-start/how-to-make-monomer-architecture-app/index.html @@ -4,14 +4,14 @@ 盘古开发框架 | 如何开发单体应用 - - + +
跳到主要内容

如何开发单体应用

本文介绍如何基于盘古开发框架开发一个单体分层架构的应用。文中所述仅为搭建一个单体应用的基本框架,增加配置中心、数据持久化、缓存等能力请参考开发指南的相关章节。

背景

软件架构的本质是一种在特定资源背景下折中平衡后追求业务增长的一门艺术。虽然盘古框架的标准姿势是分布式微服务架构开发,但决定技术开发架构选型的因素很多,单体应用依旧有很多应用场景。因此,盘古框架不会把用户绑定到一个固定的开发范式和架构上,而是支持随意组合、自动装配、灵活插拔。既能构建大并发高可用的分布式微服务架构也能搭建小巧的垂直单体分层架构。

安装相关盘古模块

<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-web-spring-boot-starter</artifactId>
</dependency>
说明

这里仅演示了最简模块组合。如果需要数据持久化、消息队列等功能,请根据开发指南相关章节继续安装相关模块依赖即可。

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

spring.application.name=pangu-examples-empty-web
spring.jackson.time-zone=GMT+8

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO

启动入口

@SpringBootApplication
public class EmptyWebPanguApplication {
public static void main(String[] args) {
PanGuApplicationBuilder.init(EmptyWebPanguApplication.class).run(args);
}
}

本文相关范例源码

下一步

继续阅读其它章节获取你想要的答案或通过我们的 开发者社区 寻求更多帮助。

- - + + \ No newline at end of file diff --git a/docs/docs/tags/api/index.html b/docs/docs/tags/api/index.html index 8585dd2f364527357d40290bcbf992279533a656..7f5e29be0e81eaeddc5654850faaa341ff8333e1 100644 --- a/docs/docs/tags/api/index.html +++ b/docs/docs/tags/api/index.html @@ -4,14 +4,14 @@ 1 篇文档带有标签「API」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/docs/tags/cache/index.html b/docs/docs/tags/cache/index.html index 36535b30ab1852845cf491753224915171918076..ac72db3099d4d5ce53854840214fb6b7a85a31a1 100644 --- a/docs/docs/tags/cache/index.html +++ b/docs/docs/tags/cache/index.html @@ -4,14 +4,14 @@ 1 篇文档带有标签「Cache」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/docs/tags/dubbo/index.html b/docs/docs/tags/dubbo/index.html index bc1e989cd23e4ff326fdb591e4ff7424786407f7..31ac0158fe17d40468b21bfbc3e9d0fa2aaa9055 100644 --- a/docs/docs/tags/dubbo/index.html +++ b/docs/docs/tags/dubbo/index.html @@ -4,14 +4,14 @@ 1 篇文档带有标签「Dubbo」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/docs/tags/faq/index.html b/docs/docs/tags/faq/index.html index afede2adb906de720b6d68fe02243f876b9d8116..76d5572bac153d17b7419e53aad6c63e7fba938a 100644 --- a/docs/docs/tags/faq/index.html +++ b/docs/docs/tags/faq/index.html @@ -4,14 +4,14 @@ 1 篇文档带有标签「FAQ」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/docs/tags/index.html b/docs/docs/tags/index.html index 9058ab7b6e9aa1fce586d46eff3b6dc46e1e1388..1d7d3677685fdcb88c68218fc2cf0febe861619a 100644 --- a/docs/docs/tags/index.html +++ b/docs/docs/tags/index.html @@ -4,14 +4,14 @@ 标签 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/docs/tags/my-batis-plus/index.html b/docs/docs/tags/my-batis-plus/index.html index b8f71f25511bbfcaf26dd73a9f338208ae1b2fe6..024618f3a4344f8288abf1319ae971bcc718e493 100644 --- a/docs/docs/tags/my-batis-plus/index.html +++ b/docs/docs/tags/my-batis-plus/index.html @@ -4,14 +4,14 @@ 2 篇文档带有标签「MyBatis-Plus」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/docs/tags/my-batis/index.html b/docs/docs/tags/my-batis/index.html index e216d29d3fd63efa9db2faff063abaed0c1614b0..2c0e10491874f4be57b3201275b045539f44718d 100644 --- a/docs/docs/tags/my-batis/index.html +++ b/docs/docs/tags/my-batis/index.html @@ -4,14 +4,14 @@ 2 篇文档带有标签「MyBatis」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/docs/tags/nacos/index.html b/docs/docs/tags/nacos/index.html index 548045423863319a54b4cf5d2c4bb33419e6cb75..3452e34ce613ea5f7c8d168b168f4f77d7eb2bc9 100644 --- a/docs/docs/tags/nacos/index.html +++ b/docs/docs/tags/nacos/index.html @@ -4,14 +4,14 @@ 3 篇文档带有标签「nacos」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

3 篇文档带有标签「nacos」

查看所有标签

配置中心

盘古开发框架 | Nacos | 配置动态化 | 配置中心化 | 配置外部化

注册中心

盘古开发框架 | 服务发现和服务健康监测 | 动态配置服务 | 动态 DNS 服务 | 服务及其元数据管理 | Nacos

- - + + \ No newline at end of file diff --git a/docs/docs/tags/seata/index.html b/docs/docs/tags/seata/index.html index c48083fabaf07a8aae7d37e3ff9ce8dc4d0ca069..28963aee0a1f4e31e35fc74fe560619c6754ca7d 100644 --- a/docs/docs/tags/seata/index.html +++ b/docs/docs/tags/seata/index.html @@ -4,14 +4,14 @@ 1 篇文档带有标签「Seata」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\344\272\213\345\212\241/index.html" "b/docs/docs/tags/\344\272\213\345\212\241/index.html" index 1fae7f3c707a6e1b0ec8ddc0e7c2851736a41005..149f8a94e4e0c3dbf5315f99402b331b52601cc2 100644 --- "a/docs/docs/tags/\344\272\213\345\212\241/index.html" +++ "b/docs/docs/tags/\344\272\213\345\212\241/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「事务」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\346\217\222\344\273\266/index.html" "b/docs/docs/tags/\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\346\217\222\344\273\266/index.html" index bf0b713b81c4d7a9c372e4a42b042b45614b51d1..603d22ed3fb75d910be704c159df697cd6751aaa 100644 --- "a/docs/docs/tags/\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\346\217\222\344\273\266/index.html" +++ "b/docs/docs/tags/\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\346\217\222\344\273\266/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「代码生成器插件」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" "b/docs/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" index b6942acec99379707c498ab387eb417f4b0634c3..1f06a30e6d2b395e832491230f07b8548958366a 100644 --- "a/docs/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" +++ "b/docs/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「分布式事务」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" "b/docs/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" index a4b1bccc3e94226baf4940d7465e40ee8e29f2d3..7025d14f7eff3a15016b3f3c2a702051e52f52c1 100644 --- "a/docs/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" +++ "b/docs/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「分布式锁」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" "b/docs/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" index 80ff67e73978c7137a4c48d398a7959a25345059..314d6fd804d4c4c178594fca98ed5e9ebf99431a 100644 --- "a/docs/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" +++ "b/docs/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「多级缓存」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" "b/docs/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" index ea449fb3e981956c1199b7d971c5bb4b39a9ea8e..f456951698fb163bc043c7610e1ef83e0f7cd518 100644 --- "a/docs/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" +++ "b/docs/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" @@ -4,14 +4,14 @@ 5 篇文档带有标签「快速开始」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

5 篇文档带有标签「快速开始」

查看所有标签

开发架构模式对比

盘古开发框架 | 微服务分布式架构 | 单体分层架构 | 盘古开发架构选型对比

- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" "b/docs/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" index 93d08dc2f9da0b4083fe395aefd4abc97a742e26..b01a131cb55e2efa21a877d49cddbfb2003f7d37 100644 --- "a/docs/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" +++ "b/docs/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" @@ -4,14 +4,14 @@ 2 篇文档带有标签「数据分片」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

2 篇文档带有标签「数据分片」

查看所有标签
- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" "b/docs/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" index cba397dda65d417952b8de47647817594337dda1..e89e5ffce58557a3c3a7c06bd5a4719655839aaf 100644 --- "a/docs/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" +++ "b/docs/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" @@ -4,14 +4,14 @@ 6 篇文档带有标签「数据持久化」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

6 篇文档带有标签「数据持久化」

查看所有标签

分布式事务

盘古开发框架 | 分布式事务 | Seata | AT、TCC、SAGA 和 XA

数据持久化

盘古开发框架 | 数据持久化 | 自动填充字段 | 逻辑删除 | 乐观锁 | MyBatis Plus

- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" "b/docs/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" index f9dbc03d9772a9842c4935052b273511c595a935..f116f65018d2589a1a03740b4d1de42568d20de5 100644 --- "a/docs/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" +++ "b/docs/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" @@ -4,14 +4,14 @@ 2 篇文档带有标签「服务发现」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

2 篇文档带有标签「服务发现」

查看所有标签

注册中心

盘古开发框架 | 服务发现和服务健康监测 | 动态配置服务 | 动态 DNS 服务 | 服务及其元数据管理 | Nacos

- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" "b/docs/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" index 2608233092897f66f21edb63b4d6406acb700854..a65faf8c7e7fa931c6dee98b178f16c820f70cd1 100644 --- "a/docs/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" +++ "b/docs/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「服务治理」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" "b/docs/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" index ce58ae253b2fa75c21f611250f13355a00b101ec..d757a78ab9f002b6d7653075cf5ef280eae077e4 100644 --- "a/docs/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" +++ "b/docs/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" @@ -4,14 +4,14 @@ 2 篇文档带有标签「服务注册」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

2 篇文档带有标签「服务注册」

查看所有标签

注册中心

盘古开发框架 | 服务发现和服务健康监测 | 动态配置服务 | 动态 DNS 服务 | 服务及其元数据管理 | Nacos

- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" "b/docs/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" index b21d0b08c81e15f3b3a20fae413a7e58465dbd9d..2b0bcd3bf5bc072f7937a9b8049a29608fa94346 100644 --- "a/docs/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" +++ "b/docs/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「注册中心」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" "b/docs/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" index 050309dd7b0add77eb1553a7994c8c921d6b34ca..29866969f4f69b35cfdd84f6d5c97353d888244d 100644 --- "a/docs/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" +++ "b/docs/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「消息队列」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" "b/docs/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" index 6bbd4bb026f85775f0f2f24a348eabbe59711832..76186a8654fcd6a996d374806001194e0e5143f8 100644 --- "a/docs/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" +++ "b/docs/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" @@ -4,14 +4,14 @@ 9 篇文档带有标签「盘古架构」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

9 篇文档带有标签「盘古架构」

查看所有标签

安装

盘古开发框架 | 安装 | 依赖管理模块 | 基础模块 | Dubbo模块 | JDBC模块 | 分布式事务管理模块 | 数据治理模块 | 缓存模块 | 消息队列模块 | 网关模块 | Web模块 | 代码生成插件

简介

盘古框架文档 | 盘古服务开发框架简介

开发架构模式对比

盘古开发框架 | 微服务分布式架构 | 单体分层架构 | 盘古开发架构选型对比

配置中心

盘古开发框架 | Nacos | 配置动态化 | 配置中心化 | 配置外部化

日志相关

盘古开发框架 | 分布式日志追踪 | 日志级别热切换 | 部署运维指南

注册中心

盘古开发框架 | 服务发现和服务健康监测 | 动态配置服务 | 动态 DNS 服务 | 服务及其元数据管理 | Nacos

- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" "b/docs/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" index 8876bcfcb381ce8c0371b54e78c97932819ab0c8..a013bee05865b358ce9a977163276476cc50364c 100644 --- "a/docs/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" +++ "b/docs/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" @@ -4,14 +4,14 @@ 9 篇文档带有标签「盘古简介」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

9 篇文档带有标签「盘古简介」

查看所有标签

安装

盘古开发框架 | 安装 | 依赖管理模块 | 基础模块 | Dubbo模块 | JDBC模块 | 分布式事务管理模块 | 数据治理模块 | 缓存模块 | 消息队列模块 | 网关模块 | Web模块 | 代码生成插件

简介

盘古框架文档 | 盘古服务开发框架简介

开发架构模式对比

盘古开发框架 | 微服务分布式架构 | 单体分层架构 | 盘古开发架构选型对比

配置中心

盘古开发框架 | Nacos | 配置动态化 | 配置中心化 | 配置外部化

日志相关

盘古开发框架 | 分布式日志追踪 | 日志级别热切换 | 部署运维指南

注册中心

盘古开发框架 | 服务发现和服务健康监测 | 动态配置服务 | 动态 DNS 服务 | 服务及其元数据管理 | Nacos

- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\347\275\221\345\205\263/index.html" "b/docs/docs/tags/\347\275\221\345\205\263/index.html" index 70695936bcaa0cb7a7e0e79b80e97937b107e3df..1997a4e6003b5457d44fc0ca5cfdc4fda2712f6f 100644 --- "a/docs/docs/tags/\347\275\221\345\205\263/index.html" +++ "b/docs/docs/tags/\347\275\221\345\205\263/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「网关」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" "b/docs/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" index 025bb9f54f9909aef076b6a6e509ae0b669a184e..41f97e6eb115588c514edf6bf0ba1ea95549b776 100644 --- "a/docs/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" +++ "b/docs/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" @@ -4,14 +4,14 @@ 2 篇文档带有标签「读写分离」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

2 篇文档带有标签「读写分离」

查看所有标签
- - + + \ No newline at end of file diff --git "a/docs/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" "b/docs/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" index 3c74ea07a86cb21d9d67d512907d6b3c65713921..e870756f53ab79cc853d6868515a76aaaaf76592 100644 --- "a/docs/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" +++ "b/docs/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" @@ -4,14 +4,14 @@ 2 篇文档带有标签「部署运维」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git "a/docs/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" "b/docs/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" index 5649de0c5c8e5d1dbfe25a7f672e717f5cf4720e..2583d4113a6de5d4f01705f1908e63e4b4b607ea 100644 --- "a/docs/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" +++ "b/docs/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" @@ -4,14 +4,14 @@ 1 篇文档带有标签「配置中心」 | 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + + - - + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index ee139a35855c44369600b4454a35003dddd280c2..d463f8d9a1481b09532419365a38903eb4c06b89 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,14 +4,14 @@ 盘古开发框架官网:一套轻量稳健的工业级行业数字化赋能开发框架 - - + +
跳到主要内容

盘古开发框架

一套轻量稳健的工业级行业数字化赋能开发框架

插件化

免费开源、自主可控

「盘古开发框架」基于商业友好的 Apache-2.0 开源协议免费开源发布。我们希望能为业界持续输出正向、积极的力量,不仅做开源的受益者也能成为开源贡献者,与开源社区一起共建共享开源生态。

under construction

成熟生态、快速开发

由盘古「服务开发框架」、「中后台系统开发脚手架」、「移动端多平台开发脚手架」组成前、中、后台三维多端行业数字化赋能开发框架。可在云原生时代构建以「服务」为中心的现代应用架构,帮助用户在云环境中更好的构建和交付数字化开发任务。

security

全栈百搭适配各类业务场景

聚焦面向(移动)互联网的电商、金融、云端 SAAS 服务等大并发高可用可扩展的互联网应用场景。 同时也能满足诸如 ERP 、CRM 等各种企业数字化和各级电子政务系统的中小规模业务需求。

- - + + \ No newline at end of file diff --git a/docs/intro/index.html b/docs/intro/index.html index df099fc51e5722bff89e05dfec902b91f33c8637..80b865ebd4fa8fe375b558b5e1d62d22ff744517 100644 --- a/docs/intro/index.html +++ b/docs/intro/index.html @@ -4,14 +4,14 @@ 盘古开发框架简介 - - + +
-
跳到主要内容

盘古开发框架简介

「盘古开发框架」是一套轻量稳健的工业级前、中、后台三维多端行业数字化赋能开发框架。基于商业友好的 Apache-2.0 协议免费开源发布。我们希望不仅是开源的受益者也能成为开源贡献者,与开源社区一起共建共享开源生态

生态子项目

盘古开发框架由「盘古服务开发框架」、「盘古中后台业务系统开发脚手架」、「盘古移动端多平台开发脚手架」三个子项目组成。可以单独拆箱使用,也可以打包整合。

盘古服务开发框架

盘古服务开发框架(PanGu Service Framework)以 Dubbo、Nacos 和 Spring Boot 为核心架构,可在云原生时代构建以「服务」为中心的现代应用架构,帮助用户在云环境中更好的构建、交付和管理自己的微服务平台(也兼容支持垂直单体分层架构开发模式)。

盘古中后台业务系统开发脚手架

盘古中后台业务系统开发脚手架(PanGu Admin)是一套基于 SCUI(Vue3、Element-Plus) + 盘古服务开发框架的中后台业务系统前后端统一解决方案。并预置了轻量成熟的权限系统参考实现,用户可以基于此快速搭建中后台业务系统二次开发脚手架。

盘古移动端多平台开发脚手架

盘古移动端多平台开发脚手架(PanGu App Starter) 是集成了 uni-app 内置组件、官方扩展组件和全面兼容 nvue 的 uni-app 生态框架 uView UI 的多平台快速开发脚手架。用户可以基于此完成Android/IOS App、微信小程序、H5 应用的快速开发(一次开发,针对不同平台编译发布版本)。

适用场景

基于盘古开发框架的前、中、后台三维多端行业数字化赋能能力,用户既能快速构建面向(移动)互联网的电商、金融、云端 SAAS 服务等大并发高可用可扩展的互联网应用场景,同时也能满足诸如 ERP 、CRM 等各种企业数字化和各级电子政务系统的中小规模业务需求。

生态架构图

盘古开发框架生态架构图