first commit
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
package-lock.json
|
||||||
1
.idea/.pydio
generated
Executable file
1
.idea/.pydio
generated
Executable file
@@ -0,0 +1 @@
|
|||||||
|
bb717b1a-1aeb-4789-82f9-c0ac0f70463d
|
||||||
6
.idea/jsLibraryMappings.xml
generated
Normal file
6
.idea/jsLibraryMappings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="JavaScriptLibraryMappings">
|
||||||
|
<includedPredefinedLibrary name="Node.js Core" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
12
.idea/microservices.iml
generated
Normal file
12
.idea/microservices.iml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/microservices.iml" filepath="$PROJECT_DIR$/.idea/microservices.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
101
.idea/workspace.xml
generated
Normal file
101
.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
|
</component>
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="a5fe9a7d-92a0-4b7b-9811-4836dd2a7868" name="更改" comment="">
|
||||||
|
<change afterPath="$PROJECT_DIR$/.idea/.gitignore" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/ceshi.js" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/index.html" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/shell/config.js" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/shell/index.js" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/shell/package.json" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/shell/prompts.js" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/shell/text" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/shell/utils.js" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/test.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/app/package.json" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/gateway/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/gateway/package.json" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/run.bat" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/services/articles/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/services/articles/package.json" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/笔记.txt" beforeDir="false" afterPath="$PROJECT_DIR$/笔记.txt" afterDir="false" />
|
||||||
|
</list>
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="FileTemplateManagerImpl">
|
||||||
|
<option name="RECENT_TEMPLATES">
|
||||||
|
<list>
|
||||||
|
<option value="JavaScript File" />
|
||||||
|
<option value="HTML File" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="MarkdownSettingsMigration">
|
||||||
|
<option name="stateVersion" value="1" />
|
||||||
|
</component>
|
||||||
|
<component name="PackageJsonUpdateNotifier">
|
||||||
|
<dismissed value="$PROJECT_DIR$/app/package.json" />
|
||||||
|
<dismissed value="$PROJECT_DIR$/shell/package.json" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectColorInfo"><![CDATA[{
|
||||||
|
"associatedIndex": 4
|
||||||
|
}]]></component>
|
||||||
|
<component name="ProjectId" id="2aDje8nHoXDxL3ZdeZw40EajNth" />
|
||||||
|
<component name="ProjectLevelVcsManager">
|
||||||
|
<ConfirmationsSetting value="2" id="Add" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="autoscrollFromSource" value="true" />
|
||||||
|
<option name="autoscrollToSource" value="true" />
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="openDirectoriesWithSingleClick" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
||||||
|
"DefaultHtmlFileTemplate": "HTML File",
|
||||||
|
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"WebServerToolWindowFactoryState": "false",
|
||||||
|
"git-widget-placeholder": "master",
|
||||||
|
"javascript.nodejs.core.library.configured.version": "20.9.0",
|
||||||
|
"javascript.nodejs.core.library.typings.version": "20.9.0",
|
||||||
|
"node.js.detected.package.eslint": "true",
|
||||||
|
"node.js.detected.package.tslint": "true",
|
||||||
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
|
"nodejs_package_manager_path": "npm",
|
||||||
|
"ts.external.directory.path": "/Users/bmy/Desktop/microservices/app/node_modules/typescript/lib",
|
||||||
|
"vue.rearranger.settings.migration": "true"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="RecentsManager">
|
||||||
|
<key name="MoveFile.RECENT_KEYS">
|
||||||
|
<recent name="$PROJECT_DIR$/run" />
|
||||||
|
</key>
|
||||||
|
</component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="默认任务">
|
||||||
|
<changelist id="a5fe9a7d-92a0-4b7b-9811-4836dd2a7868" name="更改" comment="" />
|
||||||
|
<created>1703860136068</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1703860136068</updated>
|
||||||
|
<workItem from="1703860137153" duration="23153000" />
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
|
<option name="version" value="3" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
BIN
app/.DS_Store
vendored
Normal file
BIN
app/.DS_Store
vendored
Normal file
Binary file not shown.
1
app/.pydio
Normal file
1
app/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1e22f155-e4f8-4498-a130-023ea61b4d5c
|
||||||
22
app/package.json
Normal file
22
app/package.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "concurrently \"npm run generate:ts\" \"npm run run:js\"",
|
||||||
|
"run:ts": "ts-node src/index.ts",
|
||||||
|
"run:js": "node-dev dist/src/index.js",
|
||||||
|
"generate:ts": "tsc -w"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"consul": "^1.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/consul": "^0.40.3",
|
||||||
|
"typescript": "^5.3.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
app/src/.pydio
Normal file
1
app/src/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
5353715f-ffba-42f8-a416-5d757bcffaec
|
||||||
1
app/src/config/.pydio
Normal file
1
app/src/config/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
7a10511f-a00c-487f-8773-a6c2d04b1577
|
||||||
37
app/src/config/index.ts
Normal file
37
app/src/config/index.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
export default {
|
||||||
|
servicesList: [
|
||||||
|
{
|
||||||
|
name: 'gateway',
|
||||||
|
id: 'gateway_id',
|
||||||
|
tags: ['Api 网关'],
|
||||||
|
address: '192.168.31.203',
|
||||||
|
port: 8080
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'user',
|
||||||
|
id: 'user_id',
|
||||||
|
tags: ['user模块', '登录'],
|
||||||
|
address: '192.168.31.203',
|
||||||
|
port: 3002,
|
||||||
|
check: {
|
||||||
|
http: 'http://192.168.31.203:3002/user/health',
|
||||||
|
interval: '10s',
|
||||||
|
timeout: '5s',
|
||||||
|
notes: '服务正常',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'articles',
|
||||||
|
id: 'articles_id',
|
||||||
|
tags: ['articles模块', '文章'],
|
||||||
|
address: '192.168.31.203',
|
||||||
|
port: 3003,
|
||||||
|
check: {
|
||||||
|
http: 'http://192.168.31.203:3003/articles/health',
|
||||||
|
interval: '10s',
|
||||||
|
timeout: '5s',
|
||||||
|
notes: '服务正常',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
18
app/src/index.ts
Normal file
18
app/src/index.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { ConsulConf } from "./utils/consul";
|
||||||
|
|
||||||
|
class Run {
|
||||||
|
|
||||||
|
initConsul!: ConsulConf;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
// 启动 Consul
|
||||||
|
this.initConsul = new ConsulConf({
|
||||||
|
host: '127.0.0.1',
|
||||||
|
port: "8500",
|
||||||
|
promisify: true, // 是否使用 promise 风格
|
||||||
|
secure: false, // 是否启用https
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new Run()
|
||||||
1
app/src/utils/.pydio
Normal file
1
app/src/utils/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
bfff4b82-ae8b-4738-8507-8f4e4e217a88
|
||||||
31
app/src/utils/consul.ts
Normal file
31
app/src/utils/consul.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import Consul, { ConsulOptions } from "consul";
|
||||||
|
import Config from "../config";
|
||||||
|
|
||||||
|
export class ConsulConf {
|
||||||
|
consulInstance!: Consul.Consul;
|
||||||
|
|
||||||
|
constructor(option: ConsulOptions) {
|
||||||
|
this.consulInstance = new Consul(option);
|
||||||
|
|
||||||
|
// 批量注册各个服务
|
||||||
|
Config.servicesList.forEach(async v => {
|
||||||
|
await this.register(v)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 服务注册
|
||||||
|
*/
|
||||||
|
async register(option: Consul.Agent.Service.RegisterOptions) {
|
||||||
|
let res = await this.consulInstance.agent.service.register(option);
|
||||||
|
console.log("res: === :", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
async list() {
|
||||||
|
return await this.consulInstance.agent.service.list();
|
||||||
|
}
|
||||||
|
|
||||||
|
async deregister(id: string) {
|
||||||
|
return await this.consulInstance.agent.service.deregister(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
109
app/tsconfig.json
Normal file
109
app/tsconfig.json
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||||
|
|
||||||
|
/* Projects */
|
||||||
|
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
|
||||||
|
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||||
|
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
|
||||||
|
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
||||||
|
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||||
|
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||||
|
|
||||||
|
/* Language and Environment */
|
||||||
|
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||||
|
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||||
|
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||||
|
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
|
||||||
|
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||||
|
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
||||||
|
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||||
|
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
|
||||||
|
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
|
||||||
|
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||||
|
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||||
|
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
||||||
|
|
||||||
|
/* Modules */
|
||||||
|
"module": "commonjs", /* Specify what module code is generated. */
|
||||||
|
"rootDir": "./", /* Specify the root folder within your source files. */
|
||||||
|
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||||
|
"baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||||
|
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||||
|
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||||
|
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
|
||||||
|
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||||
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
|
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||||
|
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
|
||||||
|
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
||||||
|
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
||||||
|
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
||||||
|
// "resolveJsonModule": true, /* Enable importing .json files. */
|
||||||
|
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
|
||||||
|
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
||||||
|
|
||||||
|
/* JavaScript Support */
|
||||||
|
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||||
|
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||||
|
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||||
|
|
||||||
|
/* Emit */
|
||||||
|
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||||
|
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||||
|
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||||
|
"sourceMap": false, /* Create source map files for emitted JavaScript files. */
|
||||||
|
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||||
|
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||||
|
"outDir": "./dist", /* Specify an output folder for all emitted files. */
|
||||||
|
// "removeComments": true, /* Disable emitting comments. */
|
||||||
|
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||||
|
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||||
|
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
|
||||||
|
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||||
|
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||||
|
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
|
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||||
|
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||||
|
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||||
|
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
|
||||||
|
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
|
||||||
|
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||||
|
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
|
||||||
|
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||||
|
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
|
||||||
|
|
||||||
|
/* Interop Constraints */
|
||||||
|
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||||
|
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
|
||||||
|
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||||
|
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
|
||||||
|
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||||
|
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||||
|
|
||||||
|
/* Type Checking */
|
||||||
|
"strict": true, /* Enable all strict type-checking options. */
|
||||||
|
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
|
||||||
|
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||||
|
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||||
|
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||||
|
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||||
|
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||||
|
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||||
|
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||||
|
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
||||||
|
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||||
|
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||||
|
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||||
|
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||||
|
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
|
||||||
|
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||||
|
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
||||||
|
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||||
|
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||||
|
|
||||||
|
/* Completeness */
|
||||||
|
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||||
|
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
gateway/.DS_Store
vendored
Normal file
BIN
gateway/.DS_Store
vendored
Normal file
Binary file not shown.
1
gateway/.pydio
Normal file
1
gateway/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
7bf782e6-9f6f-4dc3-ba13-a17c02882f8b
|
||||||
1
gateway/config/.pydio
Normal file
1
gateway/config/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
e7a720b3-b16e-4dc4-b31c-a9c87709ea20
|
||||||
1
gateway/config/backup/.pydio
Normal file
1
gateway/config/backup/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
da3d4927-dcc5-4dd3-b8e2-42b1cf9b5eaa
|
||||||
80
gateway/config/backup/gateway.config.yml
Normal file
80
gateway/config/backup/gateway.config.yml
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# https://www.express-gateway.io/docs/configuration/gateway.config.yml/
|
||||||
|
# https://www.cnblogs.com/PLM-Teamcenter/p/16388583.html
|
||||||
|
|
||||||
|
http:
|
||||||
|
port: 8080
|
||||||
|
admin:
|
||||||
|
port: 9876
|
||||||
|
host: localhost
|
||||||
|
# 指定具体的客户端 - 绑定域名和 被映射的接口地址
|
||||||
|
apiEndpoints:
|
||||||
|
api:
|
||||||
|
host: localhost
|
||||||
|
paths: '/ip'
|
||||||
|
|
||||||
|
user_client:
|
||||||
|
host: localhost
|
||||||
|
paths:
|
||||||
|
- /user
|
||||||
|
- /user/*
|
||||||
|
|
||||||
|
articles_client:
|
||||||
|
host: localhost
|
||||||
|
paths:
|
||||||
|
- /articles
|
||||||
|
- /articles/*
|
||||||
|
|
||||||
|
# 声明网关可以管理的微服务 - 被代理的地址
|
||||||
|
serviceEndpoints:
|
||||||
|
userbin:
|
||||||
|
url: 'http://127.0.0.1:3002'
|
||||||
|
|
||||||
|
articlesbin:
|
||||||
|
url: 'http://127.0.0.1:3003'
|
||||||
|
|
||||||
|
httpbin:
|
||||||
|
url: 'https://httpbin.org'
|
||||||
|
|
||||||
|
policies:
|
||||||
|
- basic-auth
|
||||||
|
- cors
|
||||||
|
- expression
|
||||||
|
- key-auth
|
||||||
|
- log
|
||||||
|
- oauth2
|
||||||
|
- proxy
|
||||||
|
- rate-limit
|
||||||
|
|
||||||
|
# 通过管道把客户端与微服务串联起来
|
||||||
|
pipelines:
|
||||||
|
|
||||||
|
default:
|
||||||
|
apiEndpoints:
|
||||||
|
- api
|
||||||
|
policies:
|
||||||
|
# Uncomment `key-auth:` when instructed to in the Getting Started guide.
|
||||||
|
# - key-auth:
|
||||||
|
# proxy;它的作用是代理/转发请求,这里指定了将 apiEndpoints 来的请求转发到前面定义了的微服务
|
||||||
|
- proxy:
|
||||||
|
- action:
|
||||||
|
serviceEndpoint: httpbin
|
||||||
|
changeOrigin: true
|
||||||
|
|
||||||
|
pipeline_user:
|
||||||
|
apiEndpoints:
|
||||||
|
- user_client
|
||||||
|
policies:
|
||||||
|
- proxy:
|
||||||
|
- action:
|
||||||
|
serviceEndpoint: userbin
|
||||||
|
changeOrigin: true
|
||||||
|
|
||||||
|
pipeline_articles:
|
||||||
|
apiEndpoints:
|
||||||
|
- articles_client
|
||||||
|
policies:
|
||||||
|
- proxy:
|
||||||
|
- action:
|
||||||
|
serviceEndpoint: articlesbin
|
||||||
|
changeOrigin: true
|
||||||
|
|
||||||
26
gateway/config/backup/system.config.yml
Normal file
26
gateway/config/backup/system.config.yml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Core
|
||||||
|
db:
|
||||||
|
redis:
|
||||||
|
emulate: true
|
||||||
|
namespace: EG
|
||||||
|
|
||||||
|
#plugins:
|
||||||
|
# express-gateway-plugin-example:
|
||||||
|
# param1: 'param from system.config'
|
||||||
|
|
||||||
|
crypto:
|
||||||
|
cipherKey: sensitiveKey
|
||||||
|
algorithm: aes256
|
||||||
|
saltRounds: 10
|
||||||
|
|
||||||
|
# OAuth2 Settings
|
||||||
|
session:
|
||||||
|
secret: keyboard cat
|
||||||
|
resave: false
|
||||||
|
saveUninitialized: false
|
||||||
|
accessTokens:
|
||||||
|
timeToExpiry: 7200000
|
||||||
|
refreshTokens:
|
||||||
|
timeToExpiry: 7200000
|
||||||
|
authorizationCodes:
|
||||||
|
timeToExpiry: 300000
|
||||||
103
gateway/config/gateway.config.json
Normal file
103
gateway/config/gateway.config.json
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
{
|
||||||
|
"http": {
|
||||||
|
"port": 8080
|
||||||
|
},
|
||||||
|
"admin": {
|
||||||
|
"port": 9876,
|
||||||
|
"host": "localhost"
|
||||||
|
},
|
||||||
|
"apiEndpoints": {
|
||||||
|
"api": {
|
||||||
|
"host": "localhost",
|
||||||
|
"paths": "/ip"
|
||||||
|
},
|
||||||
|
"user_client": {
|
||||||
|
"host": "localhost",
|
||||||
|
"paths": [
|
||||||
|
"/user",
|
||||||
|
"/user/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"articles_client": {
|
||||||
|
"host": "localhost",
|
||||||
|
"paths": [
|
||||||
|
"/articles",
|
||||||
|
"/articles/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"serviceEndpoints": {
|
||||||
|
"userbin": {
|
||||||
|
"url": "http://127.0.0.1:3002"
|
||||||
|
},
|
||||||
|
"articlesbin": {
|
||||||
|
"url": "http://127.0.0.1:3003"
|
||||||
|
},
|
||||||
|
"httpbin": {
|
||||||
|
"url": "https://httpbin.org"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"policies": [
|
||||||
|
"basic-auth",
|
||||||
|
"cors",
|
||||||
|
"expression",
|
||||||
|
"key-auth",
|
||||||
|
"log",
|
||||||
|
"oauth2",
|
||||||
|
"proxy",
|
||||||
|
"rate-limit"
|
||||||
|
],
|
||||||
|
"pipelines": {
|
||||||
|
"default": {
|
||||||
|
"apiEndpoints": [
|
||||||
|
"api"
|
||||||
|
],
|
||||||
|
"policies": [
|
||||||
|
{
|
||||||
|
"proxy": [
|
||||||
|
{
|
||||||
|
"action": {
|
||||||
|
"serviceEndpoint": "httpbin",
|
||||||
|
"changeOrigin": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pipeline_user": {
|
||||||
|
"apiEndpoints": [
|
||||||
|
"user_client"
|
||||||
|
],
|
||||||
|
"policies": [
|
||||||
|
{
|
||||||
|
"proxy": [
|
||||||
|
{
|
||||||
|
"action": {
|
||||||
|
"serviceEndpoint": "userbin",
|
||||||
|
"changeOrigin": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pipeline_articles": {
|
||||||
|
"apiEndpoints": [
|
||||||
|
"articles_client"
|
||||||
|
],
|
||||||
|
"policies": [
|
||||||
|
{
|
||||||
|
"proxy": [
|
||||||
|
{
|
||||||
|
"action": {
|
||||||
|
"serviceEndpoint": "articlesbin",
|
||||||
|
"changeOrigin": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
gateway/config/models/.pydio
Normal file
1
gateway/config/models/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
dbd3cf03-e067-4aed-9f60-fbd5cc998830
|
||||||
16
gateway/config/models/applications.json
Normal file
16
gateway/config/models/applications.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"$id": "http://express-gateway.io/models/applications.json",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"redirectUri": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uri"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"name"
|
||||||
|
]
|
||||||
|
}
|
||||||
85
gateway/config/models/credentials.json
Normal file
85
gateway/config/models/credentials.json
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
{
|
||||||
|
"$id": "http://express-gateway.io/models/credentials.json",
|
||||||
|
"type": "object",
|
||||||
|
"definitions": {
|
||||||
|
"credentialBase": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"autoGeneratePassword": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"scopes": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"array"
|
||||||
|
],
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"autoGeneratePassword"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"basic-auth": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/credentialBase"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"passwordKey": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "password"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"passwordKey"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key-auth": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"scopes": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"array"
|
||||||
|
],
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jwt": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {}
|
||||||
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/credentialBase"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"passwordKey": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "secret"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"passwordKey"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
28
gateway/config/models/users.json
Normal file
28
gateway/config/models/users.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"$id": "http://express-gateway.io/models/users.json",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"firstname": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"lastname": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "email"
|
||||||
|
},
|
||||||
|
"redirectUri": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uri"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"username",
|
||||||
|
"firstname",
|
||||||
|
"lastname"
|
||||||
|
]
|
||||||
|
}
|
||||||
27
gateway/config/system.config.json
Normal file
27
gateway/config/system.config.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"db": {
|
||||||
|
"redis": {
|
||||||
|
"emulate": true,
|
||||||
|
"namespace": "EG"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"crypto": {
|
||||||
|
"cipherKey": "sensitiveKey",
|
||||||
|
"algorithm": "aes256",
|
||||||
|
"saltRounds": 10
|
||||||
|
},
|
||||||
|
"session": {
|
||||||
|
"secret": "keyboard cat",
|
||||||
|
"resave": false,
|
||||||
|
"saveUninitialized": false
|
||||||
|
},
|
||||||
|
"accessTokens": {
|
||||||
|
"timeToExpiry": 7200000
|
||||||
|
},
|
||||||
|
"refreshTokens": {
|
||||||
|
"timeToExpiry": 7200000
|
||||||
|
},
|
||||||
|
"authorizationCodes": {
|
||||||
|
"timeToExpiry": 300000
|
||||||
|
}
|
||||||
|
}
|
||||||
15
gateway/package.json
Normal file
15
gateway/package.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "gateway",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "server.ts",
|
||||||
|
"scripts": {
|
||||||
|
"start": "ts-node server.ts"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"express-gateway": "^1.16.11"
|
||||||
|
}
|
||||||
|
}
|
||||||
15
gateway/server.ts
Normal file
15
gateway/server.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
const path = require('path');
|
||||||
|
import { join } from "path";
|
||||||
|
import gateway from "express-gateway";
|
||||||
|
// const gateway = require('express-gateway');
|
||||||
|
|
||||||
|
class run {
|
||||||
|
constructor () {
|
||||||
|
//@ts-ignore
|
||||||
|
gateway()
|
||||||
|
.load(join(__dirname, 'config'))
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new run()
|
||||||
109
gateway/tsconfig.json
Normal file
109
gateway/tsconfig.json
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||||
|
|
||||||
|
/* Projects */
|
||||||
|
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
|
||||||
|
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||||
|
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
|
||||||
|
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
||||||
|
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||||
|
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||||
|
|
||||||
|
/* Language and Environment */
|
||||||
|
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||||
|
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||||
|
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||||
|
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
|
||||||
|
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||||
|
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
||||||
|
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||||
|
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
|
||||||
|
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
|
||||||
|
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||||
|
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||||
|
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
||||||
|
|
||||||
|
/* Modules */
|
||||||
|
"module": "commonjs", /* Specify what module code is generated. */
|
||||||
|
"rootDir": "./", /* Specify the root folder within your source files. */
|
||||||
|
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||||
|
"baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||||
|
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||||
|
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||||
|
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
|
||||||
|
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||||
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
|
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||||
|
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
|
||||||
|
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
||||||
|
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
||||||
|
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
||||||
|
// "resolveJsonModule": true, /* Enable importing .json files. */
|
||||||
|
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
|
||||||
|
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
||||||
|
|
||||||
|
/* JavaScript Support */
|
||||||
|
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||||
|
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||||
|
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||||
|
|
||||||
|
/* Emit */
|
||||||
|
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||||
|
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||||
|
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||||
|
"sourceMap": false, /* Create source map files for emitted JavaScript files. */
|
||||||
|
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||||
|
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||||
|
"outDir": "./dist", /* Specify an output folder for all emitted files. */
|
||||||
|
// "removeComments": true, /* Disable emitting comments. */
|
||||||
|
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||||
|
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||||
|
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
|
||||||
|
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||||
|
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||||
|
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
|
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||||
|
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||||
|
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||||
|
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
|
||||||
|
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
|
||||||
|
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||||
|
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
|
||||||
|
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||||
|
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
|
||||||
|
|
||||||
|
/* Interop Constraints */
|
||||||
|
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||||
|
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
|
||||||
|
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||||
|
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
|
||||||
|
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||||
|
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||||
|
|
||||||
|
/* Type Checking */
|
||||||
|
"strict": true, /* Enable all strict type-checking options. */
|
||||||
|
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
|
||||||
|
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||||
|
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||||
|
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||||
|
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||||
|
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||||
|
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||||
|
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||||
|
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
||||||
|
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||||
|
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||||
|
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||||
|
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||||
|
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
|
||||||
|
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||||
|
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
||||||
|
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||||
|
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||||
|
|
||||||
|
/* Completeness */
|
||||||
|
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||||
|
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||||
|
}
|
||||||
|
}
|
||||||
10
index.html
Normal file
10
index.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Title</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<input placeholder="">
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
services/.DS_Store
vendored
Normal file
BIN
services/.DS_Store
vendored
Normal file
Binary file not shown.
1
services/.pydio
Normal file
1
services/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
b2008da9-e903-42cf-8482-61a5546f9320
|
||||||
1
services/articles/.pydio
Normal file
1
services/articles/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
60e2194b-a66a-4ee3-9ff8-32721f809a26
|
||||||
23
services/articles/index.js
Normal file
23
services/articles/index.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
const express = require('express')
|
||||||
|
const app = express()
|
||||||
|
const port = 3003
|
||||||
|
|
||||||
|
app.get('/articles/list', (req, res) => {
|
||||||
|
res.json({
|
||||||
|
code: 200,
|
||||||
|
message: '文章服务'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.get('/articles/health', (req, res) => {
|
||||||
|
res.end('OK!');
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`articles service run http://127.0.0.1:${port}`)
|
||||||
|
})
|
||||||
15
services/articles/package.json
Normal file
15
services/articles/package.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "articles",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node-dev index.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
services/users/.pydio
Normal file
1
services/users/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
6673397c-c74b-40e1-ab23-c342bedb15d1
|
||||||
25
services/users/index.js
Normal file
25
services/users/index.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const express = require('express')
|
||||||
|
const app = express()
|
||||||
|
const port = 3002
|
||||||
|
|
||||||
|
app.get('/user/list', (req, res) => {
|
||||||
|
console.log("参数:", req.query);
|
||||||
|
let { id } = req.query
|
||||||
|
res.json({
|
||||||
|
code: 200,
|
||||||
|
message: `用户服务 ${id}`
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.get('/user/health', (req, res) => {
|
||||||
|
res.end('OK!');
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`user service run http://127.0.0.1:${port}`)
|
||||||
|
})
|
||||||
15
services/users/package.json
Normal file
15
services/users/package.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "users",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node-dev index.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
shell/.pydio
Normal file
1
shell/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1f146e28-31b5-401e-b2ed-5953a56c83a9
|
||||||
81
shell/config.js
Normal file
81
shell/config.js
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
const utils = require('./utils');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
home: {
|
||||||
|
type: 'select',
|
||||||
|
name: 'value',
|
||||||
|
message: '请单选你需要的服务:',
|
||||||
|
hint: '- 空格选择、回车提交',
|
||||||
|
warn: '不可选',
|
||||||
|
choices: [
|
||||||
|
{
|
||||||
|
title: '--------基础模块-----------',
|
||||||
|
disabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '1:服务注册&发现',
|
||||||
|
description: '启动服务注册中心,启动后各服务将自动连接',
|
||||||
|
value: 'app'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2:Api 网关',
|
||||||
|
description: '各微服务模块,将通过Api网关统一处理客户端请求',
|
||||||
|
value: 'gateway'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '--------业务模块-----------',
|
||||||
|
disabled: true
|
||||||
|
},
|
||||||
|
...utils.getDirList("../services").map((v,i) => {
|
||||||
|
return {
|
||||||
|
title: `${i+1}:${v} 微服务模块`,
|
||||||
|
description: `${v} 相关的业务模块`,
|
||||||
|
value: v
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
title: '--------批量操作-----------',
|
||||||
|
disabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '1:全部 启/停',
|
||||||
|
description: '启动 或 停止 所有项目',
|
||||||
|
value: "operate_all"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2:单个 启/停',
|
||||||
|
description: '启动 或 停止 单个项目',
|
||||||
|
value: "operate_single"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3:终止端口',
|
||||||
|
description: '结束指定的端口',
|
||||||
|
value: "operate_kill"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
actionList: {
|
||||||
|
type: 'select',
|
||||||
|
name: 'value',
|
||||||
|
message: '请单选你需要的操作',
|
||||||
|
hint: '- 空格选择、回车提交',
|
||||||
|
warn: '不可选',
|
||||||
|
choices: [
|
||||||
|
{
|
||||||
|
title: '1:安装依赖',
|
||||||
|
description: '执行 npm i 初始化依赖',
|
||||||
|
value: 'install'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2:删除依赖',
|
||||||
|
description: '输入或粘贴需要 删除 的依赖包名称',
|
||||||
|
value: 'uninstall'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3:更新依赖',
|
||||||
|
description: '输入或粘贴需要 更新 的依赖包名称',
|
||||||
|
value: 'update'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
38
shell/index.js
Normal file
38
shell/index.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
const prompts = require('prompts');
|
||||||
|
const config = require('./config');
|
||||||
|
const utils = require('./utils');
|
||||||
|
|
||||||
|
class run {
|
||||||
|
constructor() {
|
||||||
|
this.showHome()
|
||||||
|
}
|
||||||
|
|
||||||
|
async showHome() {
|
||||||
|
const homeRes = await prompts([ config.home ])
|
||||||
|
if (!utils.checkActionType(homeRes.value)) {
|
||||||
|
// console.log("非批量操作")
|
||||||
|
const actionListRes = await prompts([ config.actionList ])
|
||||||
|
console.log("response: ", homeRes)
|
||||||
|
console.log("actionListRes: ", actionListRes)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// console.log("批量操作")
|
||||||
|
}
|
||||||
|
// const response = await prompts([
|
||||||
|
// {
|
||||||
|
// type: 'select',
|
||||||
|
// name: 'value',
|
||||||
|
// message: 'Pick a color',
|
||||||
|
// choices: [
|
||||||
|
// { title: 'Red', description: 'This option has a description', value: '#ff0000' },
|
||||||
|
// { title: 'Green', value: '#00ff00', disabled: true },
|
||||||
|
// { title: 'Blue', value: '#0000ff' }
|
||||||
|
// ],
|
||||||
|
// initial: 1
|
||||||
|
// }
|
||||||
|
// ])
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new run();
|
||||||
16
shell/package.json
Normal file
16
shell/package.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "shell",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"prompts": "^2.4.2",
|
||||||
|
"yargs": "^17.7.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
0
shell/prompts.js
Normal file
0
shell/prompts.js
Normal file
0
shell/text
Normal file
0
shell/text
Normal file
20
shell/utils.js
Normal file
20
shell/utils.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
const { readdirSync} = require("fs");
|
||||||
|
const { join } = require("path");
|
||||||
|
|
||||||
|
class Utils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取指定路径下的第一级文件夹目录
|
||||||
|
* @param dirName
|
||||||
|
* @returns {string[]}
|
||||||
|
*/
|
||||||
|
static getDirList (dirName) {
|
||||||
|
return readdirSync(`${join(__dirname, dirName)}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
static checkActionType(v) {
|
||||||
|
return v.includes("operate_")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Utils
|
||||||
21
test.js
Normal file
21
test.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
const {spawn} = require('child_process');
|
||||||
|
const fs = require('fs');
|
||||||
|
const spawnObj = spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
|
||||||
|
spawnObj.stdout.on('data', function(chunk) {
|
||||||
|
console.log(chunk.toString());
|
||||||
|
});
|
||||||
|
spawnObj.stderr.on('data', (data) => {
|
||||||
|
console.log(data);
|
||||||
|
});
|
||||||
|
spawnObj.on('close', function(code) {
|
||||||
|
console.log('close code : ' + code);
|
||||||
|
})
|
||||||
|
spawnObj.on('exit', (code) => {
|
||||||
|
console.log('exit code : ' + code);
|
||||||
|
fs.close(fd, function(err) {
|
||||||
|
if(err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
41
笔记.txt
Normal file
41
笔记.txt
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
node-schedule
|
||||||
|
|
||||||
|
|
||||||
|
https://senecajs.org/getting-started/
|
||||||
|
|
||||||
|
|
||||||
|
consul
|
||||||
|
一个提供服务发现,健康检测,K/V 存储,支持分布式高可用多数据中心
|
||||||
|
|
||||||
|
To start hashicorp/tap/consul now and restart at login:
|
||||||
|
brew services start hashicorp/tap/consul
|
||||||
|
Or, if you don't want/need a background service you can just run:
|
||||||
|
/usr/local/opt/consul/bin/consul agent -dev -bind 127.0.0.1
|
||||||
|
==> Summary
|
||||||
|
🍺 /usr/local/Cellar/consul/1.17.1: 5 files, 165.4MB, built in 6 seconds
|
||||||
|
==> Running `brew cleanup consul`...
|
||||||
|
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
|
||||||
|
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
|
||||||
|
|
||||||
|
|
||||||
|
faibo
|
||||||
|
简单配置能够让 consul 部署的应用快速支持 http 的负载均衡路由
|
||||||
|
|
||||||
|
在 Node.js 中,您可以使用 http-proxy 软件包简单地代理对特定服务的请求,也可以使用更多丰富功能的 express-gateway 来创建 API 网关。
|
||||||
|
|
||||||
|
查找端口
|
||||||
|
netstat -aon|findstr "3002"
|
||||||
|
结束端口
|
||||||
|
taskkill -pid 20300 -f
|
||||||
|
|
||||||
|
consul agent -server -ui -bind 192.168.31.203 -client 0.0.0.0 -bootstrap-expect=1
|
||||||
|
|
||||||
|
consul agent -dev -ui
|
||||||
|
|
||||||
|
consul 中文文档:
|
||||||
|
https://kingfree.gitbook.io/consul/getting-started/ui
|
||||||
|
|
||||||
|
|
||||||
|
apiEndpoints 上接收 API 请求,然后将它们代理到下游微服务 serviceEndpoints 指定的 URL
|
||||||
|
|
||||||
|
osascript -e 'tell application "Terminal" to do script "npm -v"'
|
||||||
Reference in New Issue
Block a user