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