From 9bdd485d9b874d2cfff584b336e36173b6a19e8d Mon Sep 17 00:00:00 2001 From: xiongchun <18616786188@qq.com> Date: Sat, 2 Apr 2022 20:37:41 +0800 Subject: [PATCH] update doc --- pangu-website/build/404.html | 4 ++-- .../js/{0e384e19.83ac553a.js => 0e384e19.e241fff1.js} | 2 +- .../{runtime~main.da8868a3.js => runtime~main.cc5cc4d5.js} | 2 +- pangu-website/build/blog/archive/index.html | 4 ++-- .../build/blog/chinese-copywriting-guidelines/index.html | 4 ++-- pangu-website/build/blog/index.html | 4 ++-- .../build/docs/advanced-guide/data-persistance/index.html | 4 ++-- .../build/docs/advanced-guide/data-sharding/index.html | 4 ++-- .../build/docs/advanced-guide/distributed-lock/index.html | 4 ++-- .../docs/advanced-guide/distributed-transaction/index.html | 4 ++-- pangu-website/build/docs/advanced-guide/gateway/index.html | 4 ++-- .../build/docs/advanced-guide/layering-cache/index.html | 4 ++-- pangu-website/build/docs/advanced-guide/mq/index.html | 4 ++-- .../docs/advanced-guide/nacos-config-center/index.html | 4 ++-- .../docs/advanced-guide/nacos-regist-center/index.html | 4 ++-- .../docs/advanced-guide/readwrite-splitting/index.html | 4 ++-- pangu-website/build/docs/code-generator/index.html | 4 ++-- pangu-website/build/docs/community/index.html | 4 ++-- pangu-website/build/docs/deploy-guide/index.html | 4 ++-- pangu-website/build/docs/examples-list/index.html | 4 ++-- pangu-website/build/docs/faq/index.html | 4 ++-- pangu-website/build/docs/install/index.html | 4 ++-- pangu-website/build/docs/intro/index.html | 6 +++--- .../docs/quick-start/how-to-make-architecture/index.html | 4 ++-- .../docs/quick-start/how-to-make-gateway-app/index.html | 4 ++-- .../how-to-make-gateway-app/shenyu-based/index.html | 4 ++-- .../how-to-make-gateway-app/springmvc-based/index.html | 4 ++-- .../how-to-make-microservice-architecture-app/index.html | 4 ++-- .../how-to-make-monomer-architecture-app/index.html | 4 ++-- pangu-website/build/docs/tags/cache/index.html | 4 ++-- pangu-website/build/docs/tags/dubbo/index.html | 4 ++-- pangu-website/build/docs/tags/faq/index.html | 4 ++-- pangu-website/build/docs/tags/index.html | 4 ++-- pangu-website/build/docs/tags/my-batis-plus/index.html | 4 ++-- pangu-website/build/docs/tags/my-batis/index.html | 4 ++-- pangu-website/build/docs/tags/nacos/index.html | 4 ++-- pangu-website/build/docs/tags/seata/index.html | 4 ++-- pangu-website/build/docs/tags/shen-yu/index.html | 4 ++-- .../build/docs/tags/\344\272\213\345\212\241/index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../build/docs/tags/\347\275\221\345\205\263/index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- pangu-website/build/docs/thanks/index.html | 4 ++-- pangu-website/build/index.html | 4 ++-- pangu-website/build/markdown-page/index.html | 4 ++-- pangu-website/docs/intro.md | 2 +- 63 files changed, 124 insertions(+), 124 deletions(-) rename pangu-website/build/assets/js/{0e384e19.83ac553a.js => 0e384e19.e241fff1.js} (99%) rename pangu-website/build/assets/js/{runtime~main.da8868a3.js => runtime~main.cc5cc4d5.js} (66%) diff --git a/pangu-website/build/404.html b/pangu-website/build/404.html index b09a3f3ca..b57490a8b 100644 --- a/pangu-website/build/404.html +++ b/pangu-website/build/404.html @@ -7,13 +7,13 @@ Page Not Found | 盘古开发框架 - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/pangu-website/build/assets/js/0e384e19.83ac553a.js b/pangu-website/build/assets/js/0e384e19.e241fff1.js similarity index 99% rename from pangu-website/build/assets/js/0e384e19.83ac553a.js rename to pangu-website/build/assets/js/0e384e19.e241fff1.js index f6dae9b73..142a5eafc 100644 --- a/pangu-website/build/assets/js/0e384e19.83ac553a.js +++ b/pangu-website/build/assets/js/0e384e19.e241fff1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkpangu_website=self.webpackChunkpangu_website||[]).push([[9671],{3905:function(t,e,a){a.d(e,{Zo:function(){return u},kt:function(){return k}});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var o=n.createContext({}),m=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},u=function(t){var e=m(t.components);return n.createElement(o.Provider,{value:e},t.children)},d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,u=p(t,["components","mdxType","originalType","parentName"]),s=m(a),k=r,g=s["".concat(o,".").concat(k)]||s[k]||d[k]||l;return a?n.createElement(g,i(i({ref:e},u),{},{components:a})):n.createElement(g,i({ref:e},u))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,i=new Array(l);i[0]=s;var p={};for(var o in e)hasOwnProperty.call(e,o)&&(p[o]=e[o]);p.originalType=t,p.mdxType="string"==typeof t?t:r,i[1]=p;for(var m=2;m=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var o=n.createContext({}),m=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},u=function(t){var e=m(t.components);return n.createElement(o.Provider,{value:e},t.children)},d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,u=p(t,["components","mdxType","originalType","parentName"]),s=m(a),k=r,g=s["".concat(o,".").concat(k)]||s[k]||d[k]||l;return a?n.createElement(g,i(i({ref:e},u),{},{components:a})):n.createElement(g,i({ref:e},u))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,i=new Array(l);i[0]=s;var p={};for(var o in e)hasOwnProperty.call(e,o)&&(p[o]=e[o]);p.originalType=t,p.mdxType="string"==typeof t?t:r,i[1]=p;for(var m=2;m=t)&&Object.keys(d.O).every((function(e){return d.O[e](a[b])}))?a.splice(b--,1):(r=!1,t0&&e[u-1][2]>t;u--)e[u]=e[u-1];e[u]=[a,c,t]},d.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(f,{a:f}),f},a=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var t=Object.create(null);d.r(t);var n={};f=f||[null,a({}),a([]),a(a)];for(var r=2&c&&e;"object"==typeof r&&!~f.indexOf(r);r=a(r))Object.getOwnPropertyNames(r).forEach((function(f){n[f]=function(){return e[f]}}));return n.default=function(){return e},d.d(t,n),t},d.d=function(e,f){for(var a in f)d.o(f,a)&&!d.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce((function(f,a){return d.f[a](e,f),f}),[]))},d.u=function(e){return"assets/js/"+({53:"935f2afb",111:"7c075d35",166:"478504a7",167:"ab4e345c",341:"d5db8fd5",431:"0be0bf4d",447:"c92f1f5c",556:"1ada7155",627:"f97071e9",737:"86b6e08a",743:"5da849fd",836:"0480b142",1159:"0ef248ad",1204:"35fd95cc",1223:"8212c30c",1283:"642d33ed",1340:"2b6eb587",1346:"ed65fc25",1465:"8f77c8f7",1598:"7e313c69",1699:"cb5d812f",1888:"c7da0f78",2535:"814f3328",2996:"b5a19149",3085:"1f391b9e",3089:"a6aa9e1f",3477:"70a5b8f3",3608:"9e4087bc",3611:"26defb44",3637:"1eed6653",3698:"5180051f",3751:"3720c009",3783:"52cb9ed2",3828:"d634213e",4084:"def2f606",4121:"55960ee5",4135:"f19c9843",4195:"c4f5d8e4",4441:"a43c0e50",4505:"2a27ca14",4616:"67f69e30",4914:"ff0a8aab",5162:"2a665cfe",5214:"f2ed4f2f",5536:"5c93b3c9",5572:"aa0b6d16",5602:"b9cd100e",5606:"d0e67d21",5943:"8afca26f",6088:"a99bafa9",6103:"ccc49370",6492:"ee5c44d0",6700:"ea9ff353",7276:"da875cf4",7414:"393be207",7918:"17896441",8473:"f6540de8",8731:"7a9509ef",9060:"4412fc41",9143:"3ed66d6d",9215:"2517e4a2",9391:"66c51df7",9514:"1be78505",9516:"1a2c7857",9608:"beeec121",9671:"0e384e19",9708:"2ddc1452",9763:"d5159757",9764:"26b38241",9924:"df203c0f"}[e]||e)+"."+{53:"f0d4d6c5",111:"8980bd15",166:"25cee986",167:"32351dbb",341:"025e7626",431:"8a296f69",447:"dd9274fa",556:"5e8b9901",627:"b11e9898",737:"2b3e69c8",743:"f961d562",836:"e792882b",1159:"f23626c5",1204:"5b57abc2",1223:"9b55c673",1283:"d6f688bf",1340:"828098fc",1346:"86b71971",1465:"4aefde73",1598:"fcd7a650",1699:"5a30098c",1888:"2d55fa3f",2535:"5041413f",2996:"e4aa7fbf",3085:"05b09b4e",3089:"ffeb7ccb",3477:"417c1a3e",3608:"2d992f0b",3611:"6751553d",3637:"4d0f7ae4",3698:"2c80b1fa",3751:"815bde38",3783:"4c18d941",3828:"0cbb87eb",3829:"0c033686",4084:"b13cab98",4121:"9c7b65b9",4135:"4c04f0c4",4195:"60a6544f",4441:"c64358b2",4505:"55e33188",4608:"ab6daf43",4616:"012a12e3",4914:"7eadd49d",5162:"2398c238",5214:"467e7358",5536:"92c68c30",5572:"81f10eda",5602:"ff0143a5",5606:"b4818303",5943:"dabb6db6",6088:"64b5eaea",6103:"d85a6a44",6492:"5a1a8472",6700:"677df43d",7276:"9e1bd320",7414:"023b4d77",7918:"7dfe76b0",8473:"93ff3a72",8731:"87851b4b",9060:"d2204056",9143:"d121b1e1",9215:"4d0efa87",9391:"e7c8433c",9514:"b06d9c11",9516:"fdfdd826",9608:"f06a39b4",9671:"83ac553a",9708:"685ed159",9763:"cc998b02",9764:"57aa6325",9924:"1704f62f"}[e]+".js"},d.miniCssF=function(e){return"assets/css/styles.74f4a488.css"},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},c={},t="pangu-website:",d.l=function(e,f,a,n){if(c[e])c[e].push(f);else{var r,b;if(void 0!==a)for(var o=document.getElementsByTagName("script"),u=0;u=t)&&Object.keys(d.O).every((function(e){return d.O[e](c[b])}))?c.splice(b--,1):(r=!1,t0&&e[u-1][2]>t;u--)e[u]=e[u-1];e[u]=[c,a,t]},d.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(f,{a:f}),f},c=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var t=Object.create(null);d.r(t);var n={};f=f||[null,c({}),c([]),c(c)];for(var r=2&a&&e;"object"==typeof r&&!~f.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((function(f){n[f]=function(){return e[f]}}));return n.default=function(){return e},d.d(t,n),t},d.d=function(e,f){for(var c in f)d.o(f,c)&&!d.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:f[c]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce((function(f,c){return d.f[c](e,f),f}),[]))},d.u=function(e){return"assets/js/"+({53:"935f2afb",111:"7c075d35",166:"478504a7",167:"ab4e345c",341:"d5db8fd5",431:"0be0bf4d",447:"c92f1f5c",556:"1ada7155",627:"f97071e9",737:"86b6e08a",743:"5da849fd",836:"0480b142",1159:"0ef248ad",1204:"35fd95cc",1223:"8212c30c",1283:"642d33ed",1340:"2b6eb587",1346:"ed65fc25",1465:"8f77c8f7",1598:"7e313c69",1699:"cb5d812f",1888:"c7da0f78",2535:"814f3328",2996:"b5a19149",3085:"1f391b9e",3089:"a6aa9e1f",3477:"70a5b8f3",3608:"9e4087bc",3611:"26defb44",3637:"1eed6653",3698:"5180051f",3751:"3720c009",3783:"52cb9ed2",3828:"d634213e",4084:"def2f606",4121:"55960ee5",4135:"f19c9843",4195:"c4f5d8e4",4441:"a43c0e50",4505:"2a27ca14",4616:"67f69e30",4914:"ff0a8aab",5162:"2a665cfe",5214:"f2ed4f2f",5536:"5c93b3c9",5572:"aa0b6d16",5602:"b9cd100e",5606:"d0e67d21",5943:"8afca26f",6088:"a99bafa9",6103:"ccc49370",6492:"ee5c44d0",6700:"ea9ff353",7276:"da875cf4",7414:"393be207",7918:"17896441",8473:"f6540de8",8731:"7a9509ef",9060:"4412fc41",9143:"3ed66d6d",9215:"2517e4a2",9391:"66c51df7",9514:"1be78505",9516:"1a2c7857",9608:"beeec121",9671:"0e384e19",9708:"2ddc1452",9763:"d5159757",9764:"26b38241",9924:"df203c0f"}[e]||e)+"."+{53:"f0d4d6c5",111:"8980bd15",166:"25cee986",167:"32351dbb",341:"025e7626",431:"8a296f69",447:"dd9274fa",556:"5e8b9901",627:"b11e9898",737:"2b3e69c8",743:"f961d562",836:"e792882b",1159:"f23626c5",1204:"5b57abc2",1223:"9b55c673",1283:"d6f688bf",1340:"828098fc",1346:"86b71971",1465:"4aefde73",1598:"fcd7a650",1699:"5a30098c",1888:"2d55fa3f",2535:"5041413f",2996:"e4aa7fbf",3085:"05b09b4e",3089:"ffeb7ccb",3477:"417c1a3e",3608:"2d992f0b",3611:"6751553d",3637:"4d0f7ae4",3698:"2c80b1fa",3751:"815bde38",3783:"4c18d941",3828:"0cbb87eb",3829:"0c033686",4084:"b13cab98",4121:"9c7b65b9",4135:"4c04f0c4",4195:"60a6544f",4441:"c64358b2",4505:"55e33188",4608:"ab6daf43",4616:"012a12e3",4914:"7eadd49d",5162:"2398c238",5214:"467e7358",5536:"92c68c30",5572:"81f10eda",5602:"ff0143a5",5606:"b4818303",5943:"dabb6db6",6088:"64b5eaea",6103:"d85a6a44",6492:"5a1a8472",6700:"677df43d",7276:"9e1bd320",7414:"023b4d77",7918:"7dfe76b0",8473:"93ff3a72",8731:"87851b4b",9060:"d2204056",9143:"d121b1e1",9215:"4d0efa87",9391:"e7c8433c",9514:"b06d9c11",9516:"fdfdd826",9608:"f06a39b4",9671:"e241fff1",9708:"685ed159",9763:"cc998b02",9764:"57aa6325",9924:"1704f62f"}[e]+".js"},d.miniCssF=function(e){return"assets/css/styles.74f4a488.css"},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},a={},t="pangu-website:",d.l=function(e,f,c,n){if(a[e])a[e].push(f);else{var r,b;if(void 0!==c)for(var o=document.getElementsByTagName("script"),u=0;u Archive | 盘古开发框架 - + - + \ No newline at end of file diff --git a/pangu-website/build/blog/chinese-copywriting-guidelines/index.html b/pangu-website/build/blog/chinese-copywriting-guidelines/index.html index 620ff2838..55903a9a1 100644 --- a/pangu-website/build/blog/chinese-copywriting-guidelines/index.html +++ b/pangu-website/build/blog/chinese-copywriting-guidelines/index.html @@ -7,13 +7,13 @@ 盘古开发框架文档排版指南 | 盘古开发框架 - +

盘古开发框架文档排版指南

· 5 min read
xiongchun

编制此排版指南的目的是统一和优化「盘古开发框架」相关中文文案排版格式,降低用户阅读成本,增强网站气质,提升品牌影响力。

空格

「有研究显示,打字时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦。有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。」摘录自 vinta/pangu.js

中英文之间增加空格

正确

盘古开发框架基于 Apache-2.0 协议开源发布,且是免费的。

错误

盘古开发框架基于Apache-2.0协议开源发布,且是免费的。

中文与数字之间增加空格

正确

盘古开发框架在 GitEE 网站上已经有 2500 个 Stars 了。

错误

盘古开发框架在 GitEE 网站上已经有2500个 Stars 了。

数字与单位之间增加空格

正确

我的计算机有 16 GB 内存和 512 GB 固态存储。

错误

我的计算机有 16GB 内存和 512GB 固态存储。

链接与字符之间增加空格

正确

通过我们的 开发者社区 寻求更多帮助。

错误

通过我们的开发者社区寻求更多帮助。

全角标点与字符之间不加空格

正确

我自从用上了 Manjaro Linux,再也不用面对 Windows 恶心的蓝屏了。

错误

我自从用上了 Manjaro Linux ,再也不用面对 Windows 恶心的蓝屏了。

标点符号

不重复使用标点符号

正确

大熊,你的程序怎么又出 bug 了?

大熊尽然说:让我重启电脑试试?!

错误

大熊,你的程序怎么又出 bug 了???

大熊尽然说:让我重启电脑试试?!!

中文使用全角标点

正确

嗨!你知道吗?今天前台的小妹跟我说「喵」了哎!

错误

嗨! 你知道嘛? 今天前台的小妹跟我说 “喵” 了哎!

英文使用半角标点

正确

乔布斯那句话是怎么说的?「Stay hungry, Stay foolish.」

错误

乔布斯那句话是怎么说的?「Stay hungry,Stay foolish。」

名词

使用正确的大小写

大小写相关用法原属于英文书写范畴,但部分专有名词以其官方书写规范为准。(如:GitEE、GitHub、PanGu Dev Framework等)

正确

盘古开发框架(PanGu Dev Framework)的代码托管到了国内 Gitee 和 国外 GitHub 平台。

错误

盘古开发框架(Pangu Dev Framework)的代码托管到了国内 gitee 和 国外 Github 平台。

不使用不地道的缩写

正确

我们需要一位熟悉 JavaScript、HTML5、Element Plus 和 PanGu Dev Framework 的全栈开发者。

错误

我们需要一位熟悉 Js、h5、element+ 和 PGDF 的全栈开发者。

其它

段首不缩进

正确

盘古开发框架是完全独立于 Spring Cloud 生态的一套轻量灵活、成熟可靠的工业级分布式微服务开发和治理框架(兼容垂直单体分层架构)。它基于 Apache-2.0 协议开源发布,且是免费的。

错误

        盘古开发框架是完全独立于 Spring Cloud 生态的一套轻量灵活、成熟可靠的工业级分布式微服务开发和治理框架(兼容垂直单体分层架构)。它基于 Apache-2.0 协议开源发布,且是免费的。

参考文献

- + \ No newline at end of file diff --git a/pangu-website/build/blog/index.html b/pangu-website/build/blog/index.html index aca039202..e6e9d2400 100644 --- a/pangu-website/build/blog/index.html +++ b/pangu-website/build/blog/index.html @@ -7,13 +7,13 @@ Blog | 盘古开发框架 - +

· 5 min read
xiongchun

编制此排版指南的目的是统一和优化「盘古开发框架」相关中文文案排版格式,降低用户阅读成本,增强网站气质,提升品牌影响力。

- + \ No newline at end of file diff --git a/pangu-website/build/docs/advanced-guide/data-persistance/index.html b/pangu-website/build/docs/advanced-guide/data-persistance/index.html index be9267451..bc1bf8eae 100644 --- a/pangu-website/build/docs/advanced-guide/data-persistance/index.html +++ b/pangu-website/build/docs/advanced-guide/data-persistance/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 数据持久化 | MyBatis Plus - +

数据持久化

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

快速 QA:可以支持兼容哪些数据库类型?
与 MyBatis Plus 一致。支持所有 JDBC 标准数据库。分页方言兼容如下数据库: mysql、oracle、db2、h2、hsql、sqlite、postgresql、sqlserver、phoenix、gauss、clickhouse、sybase、oceanbase、firebird、cubrid、goldilocks、csiidb、达梦数据库、虚谷数据库、人大金仓数据库、南大通用(华库)数据库、南大通用数据库、神通数据库、瀚高数据库。

安装相关盘古模块

<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.stdout.StdOutImpl
# 分页SQL方言数据库类型标识(缺省:自动识别)
pangu.jdbc.db-type=mysql

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

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

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

基本数据持久化操作

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

新增

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

修改

public void aUpdate() {
log.info("更新数据...");
//方式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));
}

删除

public void aDelete() {
log.info("删除数据...");
//方式1
userMapper.deleteById(1000L);
//方式2
userMapper.deleteBatchIds(Arrays.asList(1000L, 1001L));
//方式3
userMapper.delete(Wrappers.<UserEntity>lambdaQuery().ge(UserEntity::getAge, 150));
//方式4
userMapper.deleteById(new UserEntity().setId(2000L));
}

简单查询

public void aSelect() {
log.info("查询数据...");
//方式1
UserEntity userEntity = userMapper.selectById(1L);

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

//方式3
List<UserEntity> userEntities = userMapper.selectBatchIds(Arrays.asList(1L, 2L));

//方式4
Integer age = 100;
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
QueryWrapper<UserEntity> queryWrapper = Wrappers.query();
queryWrapper.select("id").ge("age", 10).orderByDesc("age");
List<Long> ids = (List<Long>) (List) userMapper.selectObjs(queryWrapper);

//方式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);
}

分页查询

盘古框架已经做了 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映射》 章节可以找到。

手工编写SQL映射

tip

一般来说在日常开发中我们是不需要再编写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 {

/**
* 分页查询
* @param page 分页查询对象
* @param param
* @return
*/
List<UserEntity> listUsersByPage(Page<UserEntity> page, Map<String, Object> param);

/**
* 分页查询
* @param page 分页查询对象
* @param userType
* @return
*/
List<Map<String, Object>> listUserMapsByPage(Page<Map<String, Object>> page, String userType);

/**
* 普通集合查询
* @param param
* @return
*/
List<UserEntity> listUsersByMap(Map<String, Object> param);

}
src/main/resources/mapper/CrudMapper.xml
<!-- 分页查询 -->
<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>

高级特性

事务

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

字段值自动填充

Coming soon...

逻辑删除

Coming soon...

启动入口

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

本文相关范例源码

下一步

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

- + \ No newline at end of file diff --git a/pangu-website/build/docs/advanced-guide/data-sharding/index.html b/pangu-website/build/docs/advanced-guide/data-sharding/index.html index 205804e76..3221a7e6e 100644 --- a/pangu-website/build/docs/advanced-guide/data-sharding/index.html +++ b/pangu-website/build/docs/advanced-guide/data-sharding/index.html @@ -7,7 +7,7 @@ 数据治理之数据分片 | 盘古开发框架 - + @@ -16,7 +16,7 @@ 在数据库和应用系统之间独立部署一个数据库代理中间件,所有的 SQL 请求先发送到这个代理,由它完成 SQL 解析、SQL改写、SQL 路由、结果集聚合等必要操作。在这种模式下,路由规则、分配逻辑都配置到代理上,数据分片的逻辑对开发人员是透明的。

  • 数据源代理模式(客户端代理)
    通过在应用端引入组件包,代理应用普通数据源。在这种模式下,路由规则、分片逻辑配置到应用侧,所有 SQL 请求都通过代理数据源完成 SQL 解析、SQL改写、SQL 路由、结果集聚合等必要操作。

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

    盘古开发框架使用 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/pangu-website/build/docs/advanced-guide/distributed-lock/index.html b/pangu-website/build/docs/advanced-guide/distributed-lock/index.html index fb90aef0d..d1d432306 100644 --- a/pangu-website/build/docs/advanced-guide/distributed-lock/index.html +++ b/pangu-website/build/docs/advanced-guide/distributed-lock/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 分布式锁 | 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/pangu-website/build/docs/advanced-guide/distributed-transaction/index.html b/pangu-website/build/docs/advanced-guide/distributed-transaction/index.html index 9cdff5095..9905815ac 100644 --- a/pangu-website/build/docs/advanced-guide/distributed-transaction/index.html +++ b/pangu-website/build/docs/advanced-guide/distributed-transaction/index.html @@ -7,7 +7,7 @@ 盘古开发框架 | 分布式事务 | Seata | AT、TCC、SAGA 和 XA - + @@ -18,7 +18,7 @@ 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态并驱动分支事务提交或回滚。

    tip

    其中,TC 是 Seata 服务端,需要独立部署。TM、RM 是嵌入应用侧的 Seata 客户端,通过动态代理后的 DataSource@GlobalTransactional 注解实现。

    Seata 分布式事务模型

    一个分布式的全局事务,整体是『两阶段提交』的模型。如下图所示。

    虚拟业务场景设计

    Seata 为用户提供了 AT、TCC、SAGA 和 XA 四种事务模式。如下所述。

    AT 模式

    AT(Automatic Transaction Mode) 模式下,Seata 会代理数据源,在执行业务 SQL 的时候解析 SQL 并生成必要的回滚日志到 undo_log 表,如果需要回滚事务,则根据混滚日志自动生成补偿操作。

    • 一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和自动生成相应回滚日志记录。
    • 二阶段 commit 行为:成功结束,自动异步批量清理回滚日志。
    • 二阶段 rollback 行为:通过回滚日志,自动生成补偿操作,完成数据回滚。

    TCC 模式

    TCC (Manual Transaction Mode) 模式也可以简单的认为是 MT 模式,即手动模式。TCC 模式的作用范围在应用层,依赖用户自行实现的3个方法「try()、confirm()、cancel()」。本质上是实现针对某种业务逻辑的正向和反向方法,成本较大。

    • 一阶段 prepare 行为:调用自定义的 prepare 逻辑。
    • 二阶段 commit 行为:调用自定义的 commit 逻辑。
    • 二阶段 rollback 行为:调用自定义的 rollback 逻辑。

    其它模式

    本文不再对 Seata 提供的 SAGA 和 XA 事务模式进行描述。

    说明

    本质上,Seata 的3大事务模式( AT、TCC、SAGA )都是补偿型的。事务处理机制构建在框架自身或业务应用中。事务资源(数据库等)本身对分布式事务是无感知的。而在 XA 模式下,是有感知的,相应事务资源需要实现对 XA 协议的支持,以 XA 协议的机制来管理分支事务。

    建议

    目前,我们认为 Seata 框架的 AT 模式在并发性能、易用性、成熟度等方面达到了一个很好的平衡。因此,在盘古开发分布式事务场景下,我们将 AT 模式作为默认方案,把 TCC 模式作为补充方案。

    虚拟业务场景设计

    为了能直观的模拟分布式事务,我们特设计如下用户购买商品的虚拟业务场景。整个业务逻辑由如下3个微服务提供支持。

    • 仓储服务:对给定的商品扣除仓储数量。
    • 订单服务:根据采购需求创建订单。
    • 帐户服务:从用户帐户中扣除余额。

    虚拟业务调用结构图如下所示。

    虚拟业务场景设计
    public interface OrderService {
    /**
    * 创建订单
    * @param buyDto
    */
    void createOrder(BuyDto buyDto);
    }

    编程实战(AT 模式)

    如下为在盘古框架下基于 Seata 框架 AT 模式的编程实战。分别创建如下几个微服务模块。

    • pangu-examples-seata-at-api:服务接口包
    • pangu-examples-seata-at-order:订单微服务
    • pangu-examples-seata-at-account:账户微服务
    • pangu-examples-seata-at-stock:库存微服务
    • pangu-examples-seata-at-main:商品购买业务模块

    初始化数据库环境

    在真实环境中,订单服务、账户服务、库存服务有可能是分别对应不同的三个数据库。但本文范例为了简便,将使用同一个数据库。但订单、账户、库存分属不通的微服务模块,使用不通的数据源对象,来达到模拟分布式事务测试效果。

    Seata 的 AT 模式依赖回滚日志完成业务反向补偿,因此每个业务库中都需要增加一个 undo_log 回滚日志表。

    CREATE TABLE `undo_log` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `branch_id` bigint(20) NOT NULL,
    `xid` varchar(100) NOT NULL,
    `context` varchar(128) NOT NULL,
    `rollback_info` longblob NOT NULL,
    `log_status` int(11) NOT NULL,
    `log_created` datetime NOT NULL,
    `log_modified` datetime NOT NULL,
    `ext` varchar(100) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    安装相关盘古模块

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

    本地配置

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

    如下配置以 pangu-examples-seata-at-order 模块为例,其它模块类似。

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

    关键配置项说明

    • seata.service.grouplist.seata-server
      Seata Server (事务协调者 TC )的通讯地址。

    主要业务逻辑

    @Component
    public class MainBizService {

    @Reference(version = "1.0.0", group = "pangu-examples-seata-at-account")
    private AccountService accountService;
    @Reference(version = "1.0.0", group = "pangu-examples-seata-at-order")
    private OrderService orderService;
    @Reference(version = "1.0.0", group = "pangu-examples-seata-at-stock")
    private StockService stockService;

    //此注解开启全局事务管理器
    @GlobalTransactional
    public void buyItems(BuyDto buyDto){
    orderService.createOrder(buyDto);
    accountService.decreaseAccount(buyDto);
    stockService.decreaseStock(buyDto);
    }

    }

    测试

    启动 Seata 服务端( TC )

    可通过官网下载 Seata 服务端,通过如下脚本启动。

    sh seata-server.sh -p 8091

    启动微服务

    分别启动订单服务、账户服务、库存服务。需追加如下启动脚本参数。

    -Dnacos.server-addr=10.155.46.45:8888 -Dnacos.namespace=pangu-dev

    执行测试用例

    模拟提交

    模拟业务成功的正常逻辑,分支事务提交、全局事务提交。

    @Test
    public void buyItems() {
    BuyDto buyDto = new BuyDto();
    buyDto.setCount(1);
    buyDto.setMoney(10);
    buyDto.setCommodityCode("C001");
    buyDto.setUserId("U001");
    mainBizService.buyItems(buyDto);
    }

    事务成功1 事务成功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/pangu-website/build/docs/advanced-guide/gateway/index.html b/pangu-website/build/docs/advanced-guide/gateway/index.html index cd0b41885..c358bf11c 100644 --- a/pangu-website/build/docs/advanced-guide/gateway/index.html +++ b/pangu-website/build/docs/advanced-guide/gateway/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 网关系统 | Dubbo 网关 | ShenYu Admin - +

    网关系统

    网关是分布式微服务开发的重要组件,盘古框架借助 ShenYu 提供网关能力。

    tip

    在前文 《网关开发模式简介》 中,已经介绍了盘古网关开发的 2 种模式。本文讨论的网关特指第二种基于 ShenYu 的专业网关开发模式。

    网关介绍

    基于 ShenYu 网关系统,我们不需要引入服务接口包通过 Dubbo 泛化调用服务接口的方式就可以将后端 Dubbo 服务转换为 HTTP API。同时网关支持鉴权、动态限流、熔断、防火墙;支持 A/B Test,灰度发布等。

    相关名词解释

    名词
    解释
    shenyu-admin网关插件和元数据信息配置管理后台。独立 JAR,需要单独部署。
    shenyu-gateway网关模块,代理 Http 请求,泛化调用后端 Dubbo 服务。此模块负责接收 Http 请求。
    数据同步数据同步是指在 ShenYu-Admin 后台操作数据以后,使用何种策略将数据同步到 ShenYu Gateway 网关模块。ShenYu 当前支持 ZooKeeper、WebSocket、Http 长轮询、Nacos 、Etcd 和 Consul 进行数据同步。盘古开发使用的是 WebSocket 方式进行数据同步。
    插件ShenYu 使用插件化设计思想,实现插件的热插拔。内置丰富的插件,包括 RPC 代理、熔断和限流、权限认证、监控等等。
    选择器每个插件可设置多个选择器,对流量进行初步筛选。
    规则每个选择器可设置多个规则,对流量进行更细粒度的控制。

    网关调用结构图

    盘古网关系统

    caution

    上图并非盘古应用部署架构图只是简单说明一下网关的调用链结构。对于真实应用而言,我们还需要结合具体项目背景和业务场景,考虑网关模块的性能和高可用。关于部署运维的教程可以参阅 《部署指南》章节。

    ShenYu Admin图示

    ShenYu Admin 是网关的后台管理系统,能够可视化管理所有插件、选择器和规则,设置用户、角色,控制资源。它是独立 JAR,需要单独部署。如下图所示。

    Dubbo插件

    快速 QA:上述图示中的数据都需要手工去维护吗?
    不需要。在 Dubbo 服务实现类的方法上使用注解 @ShenyuDubboClient 标记,则该接口方法元数据自动上传到 ShenYu Admin 中,并根据配置自动创建选择器,最终通过同步机制会同步到 ShenYu Gateway 模块。只有图 1 的 Dubbo 插件配置需要手工维护。

    网关实战

    ShenYu 网关提供的功能非常多,这里我们只关注和盘古开发相关的功能。

    Http 请求代理

    代理前端 HTTP 请求,通过 Dubbo 泛化调用后端 Dubbo 服务。此内容已在 《如何开发网关->基于ShenYu的专业模式》 章节讲解过,这里不再赘述。

    鉴权

    Coming soon...

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/advanced-guide/layering-cache/index.html b/pangu-website/build/docs/advanced-guide/layering-cache/index.html index b35320658..537aa018d 100644 --- a/pangu-website/build/docs/advanced-guide/layering-cache/index.html +++ b/pangu-website/build/docs/advanced-guide/layering-cache/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 分布式多级缓存 | Laying Cahce - +

    分布式多级缓存

    盘古开发框架基于 Laying Cahce,提供支持分布式环境的多级缓存功能。使用 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/pangu-website/build/docs/advanced-guide/mq/index.html b/pangu-website/build/docs/advanced-guide/mq/index.html index 735af2d83..5be1df9dd 100644 --- a/pangu-website/build/docs/advanced-guide/mq/index.html +++ b/pangu-website/build/docs/advanced-guide/mq/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 消息队列 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);
    }
    }
    tip

    发送消息到 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/pangu-website/build/docs/advanced-guide/nacos-config-center/index.html b/pangu-website/build/docs/advanced-guide/nacos-config-center/index.html index 8dde030f0..0fe03bfa7 100644 --- a/pangu-website/build/docs/advanced-guide/nacos-config-center/index.html +++ b/pangu-website/build/docs/advanced-guide/nacos-config-center/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 配置中心 | 基于配置中心的日志级别热切换 | Nacos - +

    配置中心

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

    caution

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

    配置中心介绍

    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/pangu-website/build/docs/advanced-guide/nacos-regist-center/index.html b/pangu-website/build/docs/advanced-guide/nacos-regist-center/index.html index e0c8dffaf..7e8733677 100644 --- a/pangu-website/build/docs/advanced-guide/nacos-regist-center/index.html +++ b/pangu-website/build/docs/advanced-guide/nacos-regist-center/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos - +

    注册中心

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

    注册中心介绍

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

    相关名词解释

    注册中心

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

    服务注册

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

    服务发现

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

    健康检查

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

    注册中心图示

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

    注册中心实战

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

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/advanced-guide/readwrite-splitting/index.html b/pangu-website/build/docs/advanced-guide/readwrite-splitting/index.html index f7f97e1f6..8187a4b65 100644 --- a/pangu-website/build/docs/advanced-guide/readwrite-splitting/index.html +++ b/pangu-website/build/docs/advanced-guide/readwrite-splitting/index.html @@ -7,7 +7,7 @@ 盘古开发框架 | 数据治理之读写分离 | ShardingSphere-JDBC - + @@ -19,7 +19,7 @@ 通过在应用端引入组件包,代理应用普通数据源。在这种模式下,路由规则配置到应用侧,所有 SQL 请求都通过代理数据源完成 SQL 解析、SQL 路由等必要操作。

  • ORM 框架代理模式(客户端代理)
    通过 ORM 框架(Hibernate、Mybatis 等)的插件、拦截器机制实现。这只能算是特定环境下的一种实现方法,不能作为一套完整的标准化解决方案。故在此不做更多描述。

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

    盘古开发框架使用 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/pangu-website/build/docs/code-generator/index.html b/pangu-website/build/docs/code-generator/index.html index a314852a5..008facc39 100644 --- a/pangu-website/build/docs/code-generator/index.html +++ b/pangu-website/build/docs/code-generator/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 盘古代码生成器插件 - +

    代码生成器插件

    盘古代码生成器是基于 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>
    <entityPackageName>com.gitee.pulanos.pangu.showcases.crud.dao.entity</entityPackageName>
    <mapperFilePath>${project.basedir}/src/main/java/com/gitee/pulanos/pangu/showcases/crud/dao/mapper</mapperFilePath>
    <mapperPackageName>com.gitee.pulanos.pangu.showcases.crud.dao.mapper</mapperPackageName>
    </configuration>
    </plugin>

    插件参数说明

    配置项
    配置说明
    url数据库连接地址
    user数据库用户名
    password数据库密码
    tables目标数据库表,多个表用逗号分割
    author源代码文件的作者签名
    entityFilePath实体类文件输出路径
    entityPackageName实体类所在包
    mapperFilePathMapper 类文件输出路径
    mapperPackageNameMapper 类所在包
    提示
    • 上表中输出路径参数可以是基于 ${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/pangu-website/build/docs/community/index.html b/pangu-website/build/docs/community/index.html index 9b5d9e78e..5d68191e9 100644 --- a/pangu-website/build/docs/community/index.html +++ b/pangu-website/build/docs/community/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 开发者社区 | 微信交流群 | 作者Email - +

    开发者社区

    在使用盘古开发框架的过程中,如果你发现任何问题,有新的想法、建议都可以通过如下方式参与到开发者社区建设中或寻求更多帮助。

    Gitee Issues

    💯  点我进入 (推荐)

    微信交流群

    普蓝开源社区微信群

    💋  加我微信,可邀请你入群。

    作者Email

    ✉️  18616786188@qq.com

    通知

    我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:码农大熊,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/deploy-guide/index.html b/pangu-website/build/docs/deploy-guide/index.html index 4a1f2fcb7..5aafa8fc3 100644 --- a/pangu-website/build/docs/deploy-guide/index.html +++ b/pangu-website/build/docs/deploy-guide/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 部署运维指南 - +

    部署运维指南

    启动脚本

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

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

    启动参数

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

    • Nacos地址(配置中心、注册中心):-Dnacos.server-addr=127.0.0.1:8888
    • Nacos命名空间(配置中心、注册中心):-Dnacos.namespace=pangu-test
    • ShenYu网关数据同步地址:-Dshenyu.server-lists=http://127.0.0.1:9999
    • ...

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

    根据自身需求自行裁定。

    参考部署架构

    Coming soon...

    日志级别热切换

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

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

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/examples-list/index.html b/pangu-website/build/docs/examples-list/index.html index 968e76262..6b58d545f 100644 --- a/pangu-website/build/docs/examples-list/index.html +++ b/pangu-website/build/docs/examples-list/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 范例模版工程 | 获取范例代码 - +

    范例模版工程

    info

    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 服务中心。

    pangu-examples-dubbo-consumer

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

    pangu-examples-dubbo-gateway-service

    1. 如何编写 WebAPI 接口,基于 SpringMVC 调用远程 Dubbo 服务的微服务开发模式。

    pangu-examples-webapi-local-service-based

    1. 如何编写 WebAPI 接口,基于 SpringMVC 调用本地服务的传统单体分层开发模式。

    pangu-examples-webapi-gateway-based

    1. 如何编写 WebAPI 接口,基于 ShenYu 网关实现泛化调用 Dubbo 服务的微服务开发模式。

    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/pangu-website/build/docs/faq/index.html b/pangu-website/build/docs/faq/index.html index 6c6432f20..dd0554917 100644 --- a/pangu-website/build/docs/faq/index.html +++ b/pangu-website/build/docs/faq/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 常见问答 FAQ - +

    常见问答FAQ

    1. 盘古开发框架的开源协议是啥?创始初衷和目标愿景是什么?

    「盘古开发框架」基于商业友好的 Apache-2.0 协议开源发布,且是免费的,创始初衷是「分享经验-传递价值-成就你我」。目标愿景是「共建共享开源生态」,不仅做开源生态的受益者也希望成为开源生态的贡献者。

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

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

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

    没有直接关系。「盘古开发框架」基于阿里的 Nacos、Seata、Sentinel 和 Apache 的 ShenYu、Dubbo、ShardingSphere 等分布式中间件输出分布式微服务架构的能力。是一套完全独立于 Spring Cloud 生态的轻量灵活、成熟可靠的工业级分布式微服务开发和治理框架(兼容垂直单体分层架构)。

    4. 盘古开发框架可以开发前端吗?有没有现成的『通用权限管理系统』?

    不可以。盘古是纯后端的底层技术架构框架,可开发 Web API 接口、 Dubbo 接口或执行纯后台任务。目前不涉及前端UI层开发,更无所谓的『通用权限管理系统』。

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/install/index.html b/pangu-website/build/docs/install/index.html index 99107ce52..fc733d886 100644 --- a/pangu-website/build/docs/install/index.html +++ b/pangu-website/build/docs/install/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 安装 | 依赖管理模块 | 基础模块 | Dubbo模块 | JDBC模块 | 分布式事务管理模块 | 数据治理模块 | 缓存模块 | 消息队列模块 | 网关模块 | Web模块 | 代码生成插件 - +

    安装

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

    依赖管理模块

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

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

    请将版本号 latest.version.xxx 替换为当前最新版本号为,如:5.0.8

    基础模块

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

    <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>

    网关模块

    盘古网关开发自动装配模块。

    <dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-gateway-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/pangu-website/build/docs/intro/index.html b/pangu-website/build/docs/intro/index.html index 4b1126e76..f740fec50 100644 --- a/pangu-website/build/docs/intro/index.html +++ b/pangu-website/build/docs/intro/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 简介 | 架构设计范式和指导原则 | 主要功能特性| 盘古框架模块列表 | 盘古开发框架 | 盘古框架的进化史 | FAQ - +
    -

    简介

    「盘古开发框架」是完全独立于 Spring Cloud 生态的一套轻量灵活、成熟可靠的工业级分布式微服务开发和治理框架(兼容垂直单体分层架构)。它基于 Apache-2.0 协议开源发布,且是免费的。我们希望不仅是开源的受益者,也能成为开源的贡献者,与开源社区一起「共建共享开源生态」。

    架构设计范式和指导原则

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

    • 约定优于配置
      开发人员仅需在没有约定和约定不符合需要的时候自定义配置。
    • 组合优于继承
      尽量使用合成或聚合的方式,而不是继承派生关系。
    • 最佳实践
      通过大量的生产实例,总结最佳实践,沉淀复用。
    • 大道至简 Less is More
      不求大而全聚焦专而精,坚持「少即是多」的设计理念,保持架构纯洁与透明。
    • 服务优先
      「服务」是盘古框架的一等公民。我们旨在微服务和云原生范式基础上构建「以服务为中心」的现代应用架构。

    技术组件依赖图

    数据分片实现-只分表

    主要功能特性

    • 自定义的 pangu-*-spring-boot-starter 启动器,覆盖开发过程常见需求,完成各个盘古模块的自动装配。
    • 自定义的代码生成器Maven插件 pangu-generator-maven-plugin ,生成开发所需的模版代码。
    • 基于 Apache ShenYu 网关框架,实现对后端 Dubbo 服务的泛化调用;同时网关支持鉴权、动态限流、熔断、防火墙;支持 A/B Test,蓝绿发布等。
    • 基于 Apache Dubbo 框架提供面向接口代理的高性能RPC调用、智能容错和负载均衡、运行期流量调度、可视化的服务治理与运维。
    • 基于 Nacos 提供动态配置服务,以中心化、外部化和动态化的方式管理所有环境的应用配置参数;提供了对Dubbo服务的服务发现和服务监控监测等服务元数据可视化管理。
    • 基于 Mybatis-Plus 提供了强大的内置通用 Mapper CRUD 操作、支持 Lambda 表达式、内置屏蔽不通数据库方言差异的分页插件、自动填充字段值、多种主键自动生成策略、逻辑删除、乐观锁插件等功能。
    • 基于 layering-cache 提供支持分布式环境的多级缓存功能。使用 Caffeine 作为一级本地缓存, Redis 作为二级集中式缓存。
    • 基于 lock4j 提供分布式锁。支持注解声明式和 API 编程式对业务代码在分布式环境下加并发锁。
    • 基于 Seata 提供分布式事务的落地方案。
    • 基于 ShardingSphere 来提供数据治理相关功能,如:读写分离、数据分片、数据加密等。
    • 基于Sentinel 提供面向云原生微服务架构的高可用流量控制组件。
    • 应用日志输出级别动态切换、分布式日志跟踪等...

    盘古框架模块列表

    模块名称
    模块说明
    pangu-parent盘古资源依赖声明管理模块
    pangu-common盘古公共基础类库
    pangu-spring-boot-starter盘古启动、中心化配置、动态日志等基础能力自动装配模块
    pangu-dubbo-spring-boot-starter盘古微服务开发自动装配模块
    pangu-jdbc-spring-boot-starter盘古数据库持久化操作自动装配模块
    pangu-cache-spring-boot-starter盘古缓存开发自动装配模块
    pangu-gateway-spring-boot-starter盘古网关开发自动装配模块
    pangu-web-spring-boot-starter盘古 Web 应用自动装配模块
    pangu-rabbitmq-spring-boot-starterRabbitMQ 消息队列自动装配模块
    pangu-seata-spring-boot-starterSeata 分布式事务自动装配模块
    pangu-shardingsphere-spring-boot-starterShardingSphere 数据治理(读写分离、数据分片、数据加密等)自动装配模块
    pangu-generator-maven-plugin盘古代码生成器Maven插件
    pangu-website盘古项目官网和文档
    pangu-examples盘古框架模版化参考范例集

    盘古框架的进化史

    info

    科技的发展进步,如同历史潮流浩浩荡荡,势不可挡。在此期间,作者发布了多个版本的开发框架平台。当前,随着云原生范式不断深入人心,DevOPS、容器、微服务等技术趋于成熟,技术革新的同时也在刷新着我们的技术栈、系统架构、开发方法、部署运维方式。鉴于此,我们承前启后,发布了适应云原生时代,能构建「以服务为中心」现代应用架构的「盘古开发框架」。

    发布时间
    框架代号
    主要特点
    状态
    2021年-至今盘古微服务开发、分布式架构&单体架构、云原生💋 长期支持
    2017年-2020年MyCloudsLayUI、微服务开发( SpringCloud 生态)、分布式架构、通用权限系统项目终止
    2007年-2016年AOSuite自定义 JSP UI 标签库、单体架构、通用权限系统项目终止

    FAQ

    你最想了解的常见问答可能都在这里:🔜 常见问答 FAQ

    下一步

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

    - +

    简介

    「盘古开发框架」是完全独立于 Spring Cloud 生态的一套轻量灵活、成熟可靠的工业级分布式微服务开发和治理框架(兼容垂直单体分层架构)。它基于 Apache-2.0 协议开源发布,且是免费的。我们希望不仅是开源的受益者,也能成为开源的贡献者,与开源社区一起「共建共享开源生态」。

    架构设计范式和指导原则

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

    • 约定优于配置
      开发人员仅需在没有约定和约定不符合需要的时候自定义配置。
    • 组合优于继承
      尽量使用合成或聚合的方式,而不是继承派生关系。
    • 最佳实践
      通过大量的生产实例,总结最佳实践,沉淀复用。
    • 大道至简 Less is More
      不求大而全聚焦专而精,坚持「少即是多」的设计理念,保持架构纯洁与透明。
    • 服务优先
      「服务」是盘古框架的一等公民。我们旨在微服务和云原生范式基础上构建「以服务为中心」的现代应用架构。

    技术组件依赖图

    数据分片实现-只分表

    主要功能特性

    • 自定义的 pangu-*-spring-boot-starter 启动器,覆盖开发过程常见需求,完成各个盘古模块的自动装配。
    • 自定义的代码生成器Maven插件 pangu-generator-maven-plugin ,生成开发所需的模版代码。
    • 基于 Apache ShenYu 网关框架,实现对后端 Dubbo 服务的泛化调用;同时网关支持鉴权、动态限流、熔断、防火墙;支持 A/B Test,蓝绿发布等。
    • 基于 Apache Dubbo 框架提供面向接口代理的高性能RPC调用、智能容错和负载均衡、运行期流量调度、可视化的服务治理与运维。
    • 基于 Nacos 提供动态配置服务,以中心化、外部化和动态化的方式管理所有环境的应用配置参数;提供了对Dubbo服务的服务发现和服务监控监测等服务元数据可视化管理。
    • 基于 Mybatis-Plus 提供了强大的内置通用 Mapper CRUD 操作、支持 Lambda 表达式、内置屏蔽不通数据库方言差异的分页插件、自动填充字段值、多种主键自动生成策略、逻辑删除、乐观锁插件等功能。
    • 基于 layering-cache 提供支持分布式环境的多级缓存功能。使用 Caffeine 作为一级本地缓存, Redis 作为二级集中式缓存。
    • 基于 lock4j 提供分布式锁。支持注解声明式和 API 编程式对业务代码在分布式环境下加并发锁。
    • 基于 Seata 提供分布式事务的落地方案。
    • 基于 ShardingSphere 来提供数据治理相关功能,如:读写分离、数据分片、数据加密等。
    • 基于Sentinel 提供面向云原生微服务架构的高可用流量控制组件。
    • 应用日志输出级别动态切换、分布式日志跟踪等...

    盘古框架模块列表

    模块名称
    模块说明
    pangu-parent盘古资源依赖声明管理模块
    pangu-common盘古公共基础类库
    pangu-spring-boot-starter盘古启动、中心化配置、动态日志等基础能力自动装配模块
    pangu-dubbo-spring-boot-starter盘古微服务开发自动装配模块
    pangu-jdbc-spring-boot-starter盘古数据库持久化操作自动装配模块
    pangu-cache-spring-boot-starter盘古缓存开发自动装配模块
    pangu-gateway-spring-boot-starter盘古网关开发自动装配模块
    pangu-web-spring-boot-starter盘古 Web 应用自动装配模块
    pangu-rabbitmq-spring-boot-starterRabbitMQ 消息队列自动装配模块
    pangu-seata-spring-boot-starterSeata 分布式事务自动装配模块
    pangu-shardingsphere-spring-boot-starterShardingSphere 数据治理(读写分离、数据分片、数据加密等)自动装配模块
    pangu-generator-maven-plugin盘古代码生成器Maven插件
    pangu-website盘古项目官网和文档
    pangu-examples盘古框架模版化参考范例集

    盘古框架的进化史

    info

    科技的发展进步,如同历史潮流浩浩荡荡,势不可挡。在此期间,作者发布了多个版本的开发框架平台。当前,随着云原生范式不断深入人心,DevOPS、容器、微服务等技术趋于成熟,技术革新的同时也在刷新着我们的技术栈、系统架构、开发方法、部署运维方式。鉴于此,我们承前启后,发布了适应云原生时代,能构建「以服务为中心」现代应用架构的「盘古开发框架」。

    发布时间
    框架代号
    主要特点
    状态
    2021年-至今盘古微服务开发、分布式架构&单体架构、云原生💋 长期支持
    2017年-2020年MyCloudsLayUI、微服务开发( SpringCloud 生态)、分布式架构、通用权限系统项目终止
    2007年-2016年AOSuite自定义 JSP UI 标签库、单体架构、通用权限系统项目终止

    FAQ

    你最想了解的常见问答可能都在这里:🔜 常见问答 FAQ

    下一步

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

    + \ No newline at end of file diff --git a/pangu-website/build/docs/quick-start/how-to-make-architecture/index.html b/pangu-website/build/docs/quick-start/how-to-make-architecture/index.html index 882fe7336..419ec2515 100644 --- a/pangu-website/build/docs/quick-start/how-to-make-architecture/index.html +++ b/pangu-website/build/docs/quick-start/how-to-make-architecture/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 单体分层架构 VS 微服务分布式架构 | 盘古开发架构选型建议 - +

    开发架构模式对比

    tip

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

    写在前面

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

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

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

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

    盘古开发架构选型建议

    danger

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

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

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/quick-start/how-to-make-gateway-app/index.html b/pangu-website/build/docs/quick-start/how-to-make-gateway-app/index.html index 834505cd9..7b170a0ba 100644 --- a/pangu-website/build/docs/quick-start/how-to-make-gateway-app/index.html +++ b/pangu-website/build/docs/quick-start/how-to-make-gateway-app/index.html @@ -7,7 +7,7 @@ 盘古开发框架 | 网关开发模式简介 | 基于 SpringMVC 的简单网关开发 | 基于 ShenYu 的专业网关开发 | 开发模式对比 - + @@ -15,7 +15,7 @@

    网关开发模式简介

    在上文《如何开发微服务应用》中,我们已经介绍了如何开发一个微服务应用以及微服务模块之间的互相调用。在盘古框架体系下,进行网关开发(将微服务接口发布为 WebAPI )有两种方式。

    基于 SpringMVC 的简单网关开发

    依赖 Servlet 容器,需要引入服务接口包。基于 SpringMVC 通过 Controller 调用后端 Dubbo 服务。严格意义上说,这并非标准的网关,只是一种简单快速直接的将后端 Dubbo 服务通过 Controller 包装为 WebAPI 的方式。诸如鉴权一类的需求都需要自己用Web拦截器来实现。
    💥  了解更多:如何开发网关( SpringMVC )

    基于 ShenYu 的专业网关开发

    依赖 Netty 不需要 Servlet 容器,不需要引入服务接口包。基于 Webflex 非阻塞模型通过 Dubbo 泛化调用后端服务。同时网关支持鉴权、动态限流、熔断、防火墙;支持 A/B Test,灰度发布等。
    💋  了解更多:如何开发网关( ShenYu )

    开发模式对比

    -
    基于 SpringMVC基于 Apache ShenYu
    底层技术Servlet 阻塞模型,依赖 Servlet 容器Webflex 非阻塞模型,依赖 Netty
    性能一般流量配置动态化,性能极高,网关消耗在 1~2ms
    复杂度简单直接开发部署运维相对复杂
    Dubbo 集成依赖服务接口 JAR ,显式调用 Dubbo 接口不依赖服务接口 JAR,支持 Dubbo 泛化调用,还兼容其他主流 RPC 框架( gRPC、Tars 等)
    流控无或需自主开发灵活的流量筛选,能满足各种流量控制的限流需求
    其它特性无或需自主开发支持鉴权、熔断、防火墙;支持 A/B Test、灰度发布等
    caution

    上表是从不同维度简单粗暴的以定量或定性的角度给出了一些比较,结论是孤立的脱离项目背景和业务场景的,仅供参考。采用什么样的架构开发模式不能一概而论,需要大家综合当下实际情况酌情选择。

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/quick-start/how-to-make-gateway-app/shenyu-based/index.html b/pangu-website/build/docs/quick-start/how-to-make-gateway-app/shenyu-based/index.html index c134dcf4e..5acc972c8 100644 --- a/pangu-website/build/docs/quick-start/how-to-make-gateway-app/shenyu-based/index.html +++ b/pangu-website/build/docs/quick-start/how-to-make-gateway-app/shenyu-based/index.html @@ -7,7 +7,7 @@ 盘古开发框架 | 如何开发网关(ShenYu)| 基于 ShenYu 的专业网关开发 - + @@ -15,7 +15,7 @@

    如何开发网关(ShenYu)

    本文介绍基于 ShenYu 的专业网关开发模式。网关开发模式选型参考建议请看上文《网关开发模式简介》

    网关模块开发

    安装相关盘古模块

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

    基于 ShenYu 的网关开发模式不需要引入服务接口依赖包,网关会根据服务接口的元数据信息,泛化调用 Dubbo 服务接口。服务接口的元数据信息则根据 Dubbo 服务应用中的配置自动上传到 ShenYu 网关管理系统。此内容在下文会继续讲解。

    本地配置

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

    spring:
    profiles:
    active: ${spring.profiles.active:dev}
    关键配置项说明
    配置项配置说明
    shenyu.sync.websocket.urls表示网关和 ShenYu Admin 之间使用 Websocket 的方式进行数据同步,这里是配置 ShenYu Admin 的提供的 Websocket 数据同步服务的地址(支持集群,逗号分割)。
    caution

    上表中提到到 ShenYu Admin 是 ShenYu 网关框架的配置 & 元数据管理后台。这里包含了网关模块自己的配置信息也包含了后台服务接口原数据信息,这理的配置信息和元数据信息需要和网关模块同步。ShenYu 支持多种数据同步方案,Websocket 只是盘古开发选用的一种缺省方案。关于网关的更多信息,请参阅:使用指南->网关系统 章节。

    调用微服务接口

    基于 ShenYu 的网关开发模式既不需要引入服务接口 JAR,也不需要编写具体的调用代码。完全由网关根据服务接口元数据进行 Dubbo 泛化调用。

    那么问题来了,网关是如何知道 Dubbo 服务接口元数据的呢?
    • 通过 ShenYu Admin 后台系统,『基础配置->元数据管理』菜单,手工新增每一个接口的元数据,然后将数据自动同步到网关模块。(不建议,量大的话太繁琐)
    • 对Dubbo服务提供者增加 ShenYu Client 支持,通过在接口方法上使用注解 @ShenyuDubboClient 来自动采集上传接口元数据到 ShenYu Admin,然后将数据自动同步到网关模块。(盘古开发建议使用的标准姿势)如何对 Dubbo 服务提供者增加 ShenYu Client 支持请参阅下文的『 Dubbo 服务端(网关采集接口元数据)』章节。
    还有一个问题,网关要实现泛化调用是需要dubbo服务的注册中心的?
    • 没错。通过 ShenYu Admin 后台系统『基础配置->插件管理』菜单,启用 dubbo插件 并填入注册中心地址。比如,我测试用的注册中心地址:nacos://169.188.88.140:1688?namespace=pangu-dev。如下图所示。

    盘古框架网关

    启动入口

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

    Dubbo服务端(网关采集接口元数据)

    网关需要对其代理的后端 Dubbo 服务进行泛化调用,就必须知道服务接口元数据。下文就将对一个普通 Dubbo 服务应用增加 ShenYu Client 支持完成自动采集服务接口元数据功能。

    安装 ShenYu Client 依赖包

    <dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-client-apache-dubbo</artifactId>
    </dependency>

    增加配置项

    shenyu.client.register-type=http
    shenyu.client.server-lists=${shenyu.server-lists:http://localhost:9095}
    shenyu.client.props.contextPath=/dubbo
    配置项配置说明
    shenyu.client.register-type服务接口元数据采集方式,可选 http 直连模式或配置中心 zookeeper、etcd、consul 和 nacos。盘古开发采集接口元数据缺省选择 http 直接 ShenYu Admin 的方式。
    shenyu.client.server-listsShenYu Admin 地址或配置中心地址。集群时多个地址用逗号分开。
    shenyu.client.props.contextPath本服务在网关中的路由前缀,可自定义按需配置

    自动上报服务接口元数据

    在 Dubbo 服务实现类的方法上使用注解 @ShenyuDubboClient 标记,表示该接口方法元数据自动上传到 ShenYu Admin。如下代码所示。

    @Service(version = "1.0.0", group = "pangu-examples-dubbo-gateway-service")
    public class UserServiceImpl implements UserService {

    @Override
    @ShenyuDubboClient(path = "/findUserEntity", desc = "查询用户信息")
    public UserEntity findUserEntity(Long id) {
    ...
    return userEntity;
    }

    @Override
    @ShenyuDubboClient(path = "/listUserOuts", desc = "查询用户信息列表")
    public List<UserOut> listUserOuts(UserIn userIn) {
    ...
    return userOuts;
    }
    }

    重启服务提供者:

    • 进入 ShenYu Admin 后台系统的『基础配置->元数据管理』菜单,会看到自动上报的服务元数据信息。如下图所示。 盘古开发网关
    • 进入 ShenYu Admin 后台系统的『插件列表-> proxy -> dubbo』菜单,会看到自动注册的选择器和规则信息。如下图所示。 盘古开发网关

    完整请求URL及参数说明

    至此,就可以通过 http 的方式来请求我们的的 dubbo 服务了。

    请求URL

    如何确定 dubbo 服务对应的请求 url 地址呢?

    由网关模块配置文件可知网关应用端口是 9090,dubbo 服务的配置项 shenyu.client.props.contextPath 为 /dubbo,我们的 dubbo 方法通过 @ShenyuDubboClient 标记的 path 属性为:/findUserEntity。综上,dubbo 服务 UserService#findUserEntity 的完整请求地址为:http://localhost:9090/dubbo/findUserEntity。

    参数说明

    通过 http 协议,post 方式访问网关。在 http body 中传入 json 格式的参数。

    请求示例

    CURL脚本
    curl --location --request POST 'http://127.0.0.1:9090/dubbo/findUserEntity' \
    --header 'Content-Type: application/json' \
    --data '{id=1}'
    返回结果
    {
    "code": 200,
    "message": "Access to success!",
    "data": {
    "name": "云南码农大熊",
    "id": 1,
    "userType": 2,
    }
    }

    本文相关范例源码

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/quick-start/how-to-make-gateway-app/springmvc-based/index.html b/pangu-website/build/docs/quick-start/how-to-make-gateway-app/springmvc-based/index.html index 23dd6070d..5f5bfdabf 100644 --- a/pangu-website/build/docs/quick-start/how-to-make-gateway-app/springmvc-based/index.html +++ b/pangu-website/build/docs/quick-start/how-to-make-gateway-app/springmvc-based/index.html @@ -7,14 +7,14 @@ 盘古开发框架 | 如何开发网关(SpringMVC)| 基于 SpringMVC 的简单网关开发 - +

    如何开发网关(SpringMVC)

    本文介绍基于 SpringMVC 的简单网关开发模式。网关开发模式选型参考建议请看上文《网关开发模式简介》

    安装相关盘古模块

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

    基于 SpringMVC 的网关开发模式需要引入服务接口依赖包。

    本地配置

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

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

    调用微服务接口

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

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

    /**
    * 通过SpringMVC将Duboo微服务接口发布为WebAPI
    * @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);
    }
    caution

    这种通过 SpringMVC 发布 API 的模式并非盘古开发的标准姿势,只是提供这么一种开发模式选项。

    启动入口

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

    完整请求 URL 及参数说明

    至此,就可以通过 http 的方式来请求我们的的 dubbo 服务了。此种开发模式完全基于 SpringMVC,其请求地址和参数说明等信息本教程不再展开叙述。如有需要,请自行查阅 SpringMVC 请求和响应的相关教程即可。

    本文相关范例源码

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/quick-start/how-to-make-microservice-architecture-app/index.html b/pangu-website/build/docs/quick-start/how-to-make-microservice-architecture-app/index.html index 626f7991f..e61fcee42 100644 --- a/pangu-website/build/docs/quick-start/how-to-make-microservice-architecture-app/index.html +++ b/pangu-website/build/docs/quick-start/how-to-make-microservice-architecture-app/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 如何开发微服务 | 服务提供者 | 服务消费者 - +

    如何开发微服务

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

    服务提供者

    安装相关盘古模块

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

    盘古框架微服务交互基于 Dubbo 提供的面向接口代理的高性能 RPC 调用能力。因此,对于内部服务模块之间的交互调用,不管是服务的提供者还是服务消费者,都需要依赖 API 服务接口包。当然,对于网关而言,使用的是泛化调用,也就是说当网关模块作为微服务消费者的时候是不需要依赖服务提供者的接口包的。

    本地配置

    为便于理解,本文基于本地配置的方式编写。若改为标准的 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);
    }
    }

    通过 @EnableDubbo 注解开启 Dubbo 支持。由于 Dubbo 的使用 netty 作为底层网络通信,决定了盘古微服务应用启动和提供服务并不需要依赖 Servlet 容器。

    启动参数设置(如下示例)
    -Dnacos.server-addr=127.0.0.1:8848 -Dnacos.namespace=pangu-dev

    服务注册

    成功启动应用会自动像 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/pangu-website/build/docs/quick-start/how-to-make-monomer-architecture-app/index.html b/pangu-website/build/docs/quick-start/how-to-make-monomer-architecture-app/index.html index d9283c001..c7069adfa 100644 --- a/pangu-website/build/docs/quick-start/how-to-make-monomer-architecture-app/index.html +++ b/pangu-website/build/docs/quick-start/how-to-make-monomer-architecture-app/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 如何开发单体应用 - +

    如何开发单体应用

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

    安装相关盘古模块

    <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}

    启动入口

    @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/pangu-website/build/docs/tags/cache/index.html b/pangu-website/build/docs/tags/cache/index.html index 640b3f832..71c48e9c2 100644 --- a/pangu-website/build/docs/tags/cache/index.html +++ b/pangu-website/build/docs/tags/cache/index.html @@ -7,13 +7,13 @@ One doc tagged with "Cache" | 盘古开发框架 - +

    One doc tagged with "Cache"

    View All Tags
    - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/dubbo/index.html b/pangu-website/build/docs/tags/dubbo/index.html index 0a07ffa8b..f2d880206 100644 --- a/pangu-website/build/docs/tags/dubbo/index.html +++ b/pangu-website/build/docs/tags/dubbo/index.html @@ -7,13 +7,13 @@ One doc tagged with "Dubbo" | 盘古开发框架 - +

    One doc tagged with "Dubbo"

    View All Tags

    注册中心

    盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/faq/index.html b/pangu-website/build/docs/tags/faq/index.html index 628fbd298..bc486a863 100644 --- a/pangu-website/build/docs/tags/faq/index.html +++ b/pangu-website/build/docs/tags/faq/index.html @@ -7,13 +7,13 @@ One doc tagged with "FAQ" | 盘古开发框架 - +

    One doc tagged with "FAQ"

    View All Tags
    - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/index.html b/pangu-website/build/docs/tags/index.html index 2378cb1c8..6a8f95b11 100644 --- a/pangu-website/build/docs/tags/index.html +++ b/pangu-website/build/docs/tags/index.html @@ -7,13 +7,13 @@ Tags | 盘古开发框架 - + - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/my-batis-plus/index.html b/pangu-website/build/docs/tags/my-batis-plus/index.html index 5b911f870..c9b0e38b3 100644 --- a/pangu-website/build/docs/tags/my-batis-plus/index.html +++ b/pangu-website/build/docs/tags/my-batis-plus/index.html @@ -7,13 +7,13 @@ 2 docs tagged with "MyBatis-Plus" | 盘古开发框架 - +

    2 docs tagged with "MyBatis-Plus"

    View All Tags
    - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/my-batis/index.html b/pangu-website/build/docs/tags/my-batis/index.html index 1e486b35d..71e318d64 100644 --- a/pangu-website/build/docs/tags/my-batis/index.html +++ b/pangu-website/build/docs/tags/my-batis/index.html @@ -7,13 +7,13 @@ 2 docs tagged with "MyBatis" | 盘古开发框架 - +

    2 docs tagged with "MyBatis"

    View All Tags
    - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/nacos/index.html b/pangu-website/build/docs/tags/nacos/index.html index d90a708fb..1374b3f68 100644 --- a/pangu-website/build/docs/tags/nacos/index.html +++ b/pangu-website/build/docs/tags/nacos/index.html @@ -7,13 +7,13 @@ 3 docs tagged with "nacos" | 盘古开发框架 - +

    3 docs tagged with "nacos"

    View All Tags

    配置中心

    盘古开发框架 | 配置中心 | 基于配置中心的日志级别热切换 | Nacos

    注册中心

    盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/seata/index.html b/pangu-website/build/docs/tags/seata/index.html index e76f10cba..b7d4868c9 100644 --- a/pangu-website/build/docs/tags/seata/index.html +++ b/pangu-website/build/docs/tags/seata/index.html @@ -7,13 +7,13 @@ One doc tagged with "Seata" | 盘古开发框架 - +

    One doc tagged with "Seata"

    View All Tags

    分布式事务

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

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/tags/shen-yu/index.html b/pangu-website/build/docs/tags/shen-yu/index.html index 7403cf7ef..af90c61ed 100644 --- a/pangu-website/build/docs/tags/shen-yu/index.html +++ b/pangu-website/build/docs/tags/shen-yu/index.html @@ -7,13 +7,13 @@ One doc tagged with "ShenYu" | 盘古开发框架 - +

    One doc tagged with "ShenYu"

    View All Tags

    网关系统

    盘古开发框架 | 网关系统 | Dubbo 网关 | ShenYu Admin

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\344\272\213\345\212\241/index.html" "b/pangu-website/build/docs/tags/\344\272\213\345\212\241/index.html" index f622f2e4d..084d1e838 100644 --- "a/pangu-website/build/docs/tags/\344\272\213\345\212\241/index.html" +++ "b/pangu-website/build/docs/tags/\344\272\213\345\212\241/index.html" @@ -7,13 +7,13 @@ One doc tagged with "事务" | 盘古开发框架 - +

    One doc tagged with "事务"

    View All Tags

    分布式事务

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

    - + \ No newline at end of file diff --git "a/pangu-website/build/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/pangu-website/build/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 755a35fc8..10d89ad37 100644 --- "a/pangu-website/build/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/pangu-website/build/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" @@ -7,13 +7,13 @@ One doc tagged with "代码生成器插件" | 盘古开发框架 - +

    One doc tagged with "代码生成器插件"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" "b/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" index 6a32ba028..db454fbdf 100644 --- "a/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" +++ "b/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\344\272\213\345\212\241/index.html" @@ -7,13 +7,13 @@ One doc tagged with "分布式事务" | 盘古开发框架 - +

    One doc tagged with "分布式事务"

    View All Tags

    分布式事务

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

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" "b/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" index 39eb33fe6..d35c0367c 100644 --- "a/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" +++ "b/pangu-website/build/docs/tags/\345\210\206\345\270\203\345\274\217\351\224\201/index.html" @@ -7,13 +7,13 @@ One doc tagged with "分布式锁" | 盘古开发框架 - +

    One doc tagged with "分布式锁"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" "b/pangu-website/build/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" index 8f5c5e464..4ab72f5af 100644 --- "a/pangu-website/build/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" +++ "b/pangu-website/build/docs/tags/\345\244\232\347\272\247\347\274\223\345\255\230/index.html" @@ -7,13 +7,13 @@ One doc tagged with "多级缓存" | 盘古开发框架 - +

    One doc tagged with "多级缓存"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\345\274\200\345\217\221\350\200\205\347\244\276\345\214\272/index.html" "b/pangu-website/build/docs/tags/\345\274\200\345\217\221\350\200\205\347\244\276\345\214\272/index.html" index 9bcfcd3be..dde32c914 100644 --- "a/pangu-website/build/docs/tags/\345\274\200\345\217\221\350\200\205\347\244\276\345\214\272/index.html" +++ "b/pangu-website/build/docs/tags/\345\274\200\345\217\221\350\200\205\347\244\276\345\214\272/index.html" @@ -7,13 +7,13 @@ One doc tagged with "开发者社区" | 盘古开发框架 - +

    One doc tagged with "开发者社区"

    View All Tags

    开发者社区

    盘古开发框架 | 开发者社区 | 微信交流群 | 作者Email

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" "b/pangu-website/build/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" index beb31047f..4637fbadc 100644 --- "a/pangu-website/build/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" +++ "b/pangu-website/build/docs/tags/\345\277\253\351\200\237\345\274\200\345\247\213/index.html" @@ -7,13 +7,13 @@ 7 docs tagged with "快速开始" | 盘古开发框架 - +

    7 docs tagged with "快速开始"

    View All Tags

    开发架构模式对比

    盘古开发框架 | 单体分层架构 VS 微服务分布式架构 | 盘古开发架构选型建议

    网关开发模式简介

    盘古开发框架 | 网关开发模式简介 | 基于 SpringMVC 的简单网关开发 | 基于 ShenYu 的专业网关开发 | 开发模式对比

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" "b/pangu-website/build/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" index 5b42a464f..e46643eeb 100644 --- "a/pangu-website/build/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" +++ "b/pangu-website/build/docs/tags/\346\225\260\346\215\256\345\210\206\347\211\207/index.html" @@ -7,13 +7,13 @@ 2 docs tagged with "数据分片" | 盘古开发框架 - +

    2 docs tagged with "数据分片"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" "b/pangu-website/build/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" index b97ebafa4..8fec78552 100644 --- "a/pangu-website/build/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" +++ "b/pangu-website/build/docs/tags/\346\225\260\346\215\256\346\214\201\344\271\205\345\214\226/index.html" @@ -7,13 +7,13 @@ 6 docs tagged with "数据持久化" | 盘古开发框架 - +

    6 docs tagged with "数据持久化"

    View All Tags

    分布式事务

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

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" "b/pangu-website/build/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" index 5edc28139..f0cf1ce1a 100644 --- "a/pangu-website/build/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" +++ "b/pangu-website/build/docs/tags/\346\234\215\345\212\241\345\217\221\347\216\260/index.html" @@ -7,13 +7,13 @@ 2 docs tagged with "服务发现" | 盘古开发框架 - +

    2 docs tagged with "服务发现"

    View All Tags

    注册中心

    盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" "b/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" index a0b55d8b5..f473a3d27 100644 --- "a/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" +++ "b/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\262\273\347\220\206/index.html" @@ -7,13 +7,13 @@ One doc tagged with "服务治理" | 盘古开发框架 - +

    One doc tagged with "服务治理"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" "b/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" index 19f9c9a40..da317322d 100644 --- "a/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" +++ "b/pangu-website/build/docs/tags/\346\234\215\345\212\241\346\263\250\345\206\214/index.html" @@ -7,13 +7,13 @@ 2 docs tagged with "服务注册" | 盘古开发框架 - +

    2 docs tagged with "服务注册"

    View All Tags

    注册中心

    盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" "b/pangu-website/build/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" index 69854afee..b5c09ee07 100644 --- "a/pangu-website/build/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" +++ "b/pangu-website/build/docs/tags/\346\263\250\345\206\214\344\270\255\345\277\203/index.html" @@ -7,13 +7,13 @@ One doc tagged with "注册中心" | 盘古开发框架 - +

    One doc tagged with "注册中心"

    View All Tags

    注册中心

    盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" "b/pangu-website/build/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" index c49bd3581..988efb2fe 100644 --- "a/pangu-website/build/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" +++ "b/pangu-website/build/docs/tags/\346\266\210\346\201\257\351\230\237\345\210\227/index.html" @@ -7,13 +7,13 @@ One doc tagged with "消息队列" | 盘古开发框架 - +

    One doc tagged with "消息队列"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" "b/pangu-website/build/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" index fae59825f..5dd1e998e 100644 --- "a/pangu-website/build/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" +++ "b/pangu-website/build/docs/tags/\347\233\230\345\217\244\346\236\266\346\236\204/index.html" @@ -7,13 +7,13 @@ 10 docs tagged with "盘古架构" | 盘古开发框架 - +

    10 docs tagged with "盘古架构"

    View All Tags

    安装

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

    简介

    盘古开发框架 | 简介 | 架构设计范式和指导原则 | 主要功能特性| 盘古框架模块列表 | 盘古开发框架 | 盘古框架的进化史 | FAQ

    开发架构模式对比

    盘古开发框架 | 单体分层架构 VS 微服务分布式架构 | 盘古开发架构选型建议

    配置中心

    盘古开发框架 | 配置中心 | 基于配置中心的日志级别热切换 | Nacos

    网关开发模式简介

    盘古开发框架 | 网关开发模式简介 | 基于 SpringMVC 的简单网关开发 | 基于 ShenYu 的专业网关开发 | 开发模式对比

    网关系统

    盘古开发框架 | 网关系统 | Dubbo 网关 | ShenYu Admin

    注册中心

    盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" "b/pangu-website/build/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" index e48e9300f..cb92429d6 100644 --- "a/pangu-website/build/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" +++ "b/pangu-website/build/docs/tags/\347\233\230\345\217\244\347\256\200\344\273\213/index.html" @@ -7,13 +7,13 @@ 11 docs tagged with "盘古简介" | 盘古开发框架 - +

    11 docs tagged with "盘古简介"

    View All Tags

    安装

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

    简介

    盘古开发框架 | 简介 | 架构设计范式和指导原则 | 主要功能特性| 盘古框架模块列表 | 盘古开发框架 | 盘古框架的进化史 | FAQ

    开发架构模式对比

    盘古开发框架 | 单体分层架构 VS 微服务分布式架构 | 盘古开发架构选型建议

    配置中心

    盘古开发框架 | 配置中心 | 基于配置中心的日志级别热切换 | Nacos

    网关开发模式简介

    盘古开发框架 | 网关开发模式简介 | 基于 SpringMVC 的简单网关开发 | 基于 ShenYu 的专业网关开发 | 开发模式对比

    网关系统

    盘古开发框架 | 网关系统 | Dubbo 网关 | ShenYu Admin

    注册中心

    盘古开发框架 | 注册中心 | 服务注册 | 服务发现 | Nacos

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\347\275\221\345\205\263/index.html" "b/pangu-website/build/docs/tags/\347\275\221\345\205\263/index.html" index b64a28a08..902edece8 100644 --- "a/pangu-website/build/docs/tags/\347\275\221\345\205\263/index.html" +++ "b/pangu-website/build/docs/tags/\347\275\221\345\205\263/index.html" @@ -7,13 +7,13 @@ 4 docs tagged with "网关" | 盘古开发框架 - +

    4 docs tagged with "网关"

    View All Tags

    网关开发模式简介

    盘古开发框架 | 网关开发模式简介 | 基于 SpringMVC 的简单网关开发 | 基于 ShenYu 的专业网关开发 | 开发模式对比

    网关系统

    盘古开发框架 | 网关系统 | Dubbo 网关 | ShenYu Admin

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\350\201\224\347\263\273\346\226\271\345\274\217/index.html" "b/pangu-website/build/docs/tags/\350\201\224\347\263\273\346\226\271\345\274\217/index.html" index 69518c0b6..af0d61887 100644 --- "a/pangu-website/build/docs/tags/\350\201\224\347\263\273\346\226\271\345\274\217/index.html" +++ "b/pangu-website/build/docs/tags/\350\201\224\347\263\273\346\226\271\345\274\217/index.html" @@ -7,13 +7,13 @@ One doc tagged with "联系方式" | 盘古开发框架 - +

    One doc tagged with "联系方式"

    View All Tags

    开发者社区

    盘古开发框架 | 开发者社区 | 微信交流群 | 作者Email

    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" "b/pangu-website/build/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" index ae9ebe069..eb7b33c6e 100644 --- "a/pangu-website/build/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" +++ "b/pangu-website/build/docs/tags/\350\257\273\345\206\231\345\210\206\347\246\273/index.html" @@ -7,13 +7,13 @@ 2 docs tagged with "读写分离" | 盘古开发框架 - +

    2 docs tagged with "读写分离"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" "b/pangu-website/build/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" index efc0e46f2..50c9071cc 100644 --- "a/pangu-website/build/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" +++ "b/pangu-website/build/docs/tags/\351\203\250\347\275\262\350\277\220\347\273\264/index.html" @@ -7,13 +7,13 @@ One doc tagged with "部署运维" | 盘古开发框架 - +

    One doc tagged with "部署运维"

    View All Tags
    - + \ No newline at end of file diff --git "a/pangu-website/build/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" "b/pangu-website/build/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" index 19712b26f..49c656198 100644 --- "a/pangu-website/build/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" +++ "b/pangu-website/build/docs/tags/\351\205\215\347\275\256\344\270\255\345\277\203/index.html" @@ -7,13 +7,13 @@ One doc tagged with "配置中心" | 盘古开发框架 - +

    One doc tagged with "配置中心"

    View All Tags

    配置中心

    盘古开发框架 | 配置中心 | 基于配置中心的日志级别热切换 | Nacos

    - + \ No newline at end of file diff --git a/pangu-website/build/docs/thanks/index.html b/pangu-website/build/docs/thanks/index.html index 45b4f2373..6e1a32228 100644 --- a/pangu-website/build/docs/thanks/index.html +++ b/pangu-website/build/docs/thanks/index.html @@ -7,13 +7,13 @@ 盘古开发框架 | 致敬 & 鸣谢 - +

    致敬 & 鸣谢

    info

    盘古开发框架使用了很多优秀的开源项目,也正是由于站在这些开源项目的肩膀上,才有盘古开发框架诞生的可能。我们也希望不仅是开源的受益者,也能成为开源生态的贡献者。鉴于此,特单独列出如下盘古框架依赖到的开源基金会/社区组织、开源项目,为他们对开源世界所做出的卓越贡献表示致敬和感谢。

    开源基金会/社区组织

    开源项目

    • Spring Framework:A key element of Spring is infrastructural support at the application level. so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
    • Spring Boot:Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
    • Nacos:An easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
    • Apache Dubbo:A high-performance, java based open source RPC framework.Dubbo offers six key functionalities, which include transparent interface based RPC, intelligent load balancing, automatic service registration and discovery, high extensibility, runtime traffic routing, and visualized service governance.
    • MyBatis:A first class persistence framework with support for custom SQL, stored procedures and advanced mappings.
    • MyBatis Plus:A powerful enhanced toolkit of MyBatis for simplify development. This toolkit provides some efficient, useful, out-of-the-box features for MyBatis.
    • Apache ShenYu:High-performance,multi-protocol,extensible,responsive API Gateway.
    • RabbitMQ:RabbitMQ is the most widely deployed open source message broker.
    • Laying Cahce:A multi-level caching framework that supports distributed environments. It uses Caffeine as a level 1 local cache and Redis as a level 2 centralized cache.
    • ShardingSphere-JDBC:With the client end connecting directly to the database, it provides services in the form of a jar and requires no extra deployment and dependence for data sharding, readwrite-splitting, data encryption and shadow database etc.
    • Seata:Seata is an open source distributed transaction solution that delivers high performance and easy to use distributed transaction services under a microservices architecture.
    • Sentinel A powerful flow control component enabling reliability, resilience and monitoring for microservices.
    • Lock4j:Lock4j is a distributed lock component.
    • Hutool:A set of tools that keep Java sweet.
    caution

    上述列表排名不分先后,且不保证盘古框架依赖资源列表的完整性。

    下一步

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

    - + \ No newline at end of file diff --git a/pangu-website/build/index.html b/pangu-website/build/index.html index 5d8ca936f..65b04160b 100644 --- a/pangu-website/build/index.html +++ b/pangu-website/build/index.html @@ -7,13 +7,13 @@ 盘古开发框架:一套轻量灵活-成熟可靠的工业级分布式微服务开发和治理框架(兼容单体分层架构) powered by 普蓝开源社区 | 盘古开发框架 - +

    盘古开发框架

    一套轻量灵活-成熟可靠的工业级分布式微服务开发和治理框架(兼容单体分层架构)

    开箱即用、轻量灵活

    开箱即用的技术组件库、搭配自定义 SpringBoot 启动器和轻巧的代码生成 Maven 插件,可随意组合、自动装配、灵活插拔。 既能构建支持大并发高可用的互联网分布式架构也能快速搭建垂直单体分层架构。

    成熟架构、稳定可靠

    盘古技术栈融合云原生思想,在微服务、容器化、DevOps 等方面完美支持和适配。可在云原生时代构建以「服务」为中心的现代应用架构,帮助用户在云环境中更好的构建、交付和管理自己的微服务平台。

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

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

    - + \ No newline at end of file diff --git a/pangu-website/build/markdown-page/index.html b/pangu-website/build/markdown-page/index.html index ba893374b..2406c5bb5 100644 --- a/pangu-website/build/markdown-page/index.html +++ b/pangu-website/build/markdown-page/index.html @@ -7,13 +7,13 @@ Markdown page example | 盘古开发框架 - +

    Markdown page example

    You don't need React to write simple standalone pages.

    - + \ No newline at end of file diff --git a/pangu-website/docs/intro.md b/pangu-website/docs/intro.md index 085e6f7d2..b436f1756 100644 --- a/pangu-website/docs/intro.md +++ b/pangu-website/docs/intro.md @@ -74,7 +74,7 @@ pangu-examples | 盘古框架模版化参考范例集 科技的发展进步,如同历史潮流浩浩荡荡,势不可挡。在此期间,作者发布了多个版本的开发框架平台。当前,随着云原生范式不断深入人心,DevOPS、容器、微服务等技术趋于成熟,技术革新的同时也在刷新着我们的技术栈、系统架构、开发方法、部署运维方式。鉴于此,我们承前启后,发布了适应云原生时代,能构建「以服务为中心」现代应用架构的「盘古开发框架」。 ::: -|
    发布时间
    | 框架代号 |
    主要特点
    |
    状态
    +|
    发布时间
    | 框架代号 |
    主要特点
    |
    状态
    --- | --- | --- | --- 2021年-至今 | [盘古](/) | 微服务开发、分布式架构&单体架构、云原生 | :kiss: 长期支持 2017年-2020年 | [MyClouds](https://gitee.com/pulanos/myclouds/blob/master/myclouds-docs/1.1%20%E5%85%A5%E9%97%A8%20-%20%E7%AE%80%E4%BB%8B.md) | LayUI、微服务开发( SpringCloud 生态)、分布式架构、通用权限系统| 项目终止 -- GitLab