commit 5ddcc173918c014f4433fcda6173759a0789ccdb Author: 编码猿 Date: Fri Sep 27 01:14:21 2024 +0800 first commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..9c176f4 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16acd49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +package-lock.json diff --git a/.idea/.pydio b/.idea/.pydio new file mode 100755 index 0000000..83278f4 --- /dev/null +++ b/.idea/.pydio @@ -0,0 +1 @@ +bb717b1a-1aeb-4789-82f9-c0ac0f70463d \ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml new file mode 100644 index 0000000..d23208f --- /dev/null +++ b/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/microservices.iml b/.idea/microservices.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/microservices.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c25437d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..69bfb3a --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1703860136068 + + + + + + \ No newline at end of file diff --git a/.pydio b/.pydio new file mode 100644 index 0000000..bd4f2f9 --- /dev/null +++ b/.pydio @@ -0,0 +1 @@ +750d3740-f8ec-4440-a154-b04579637877 \ No newline at end of file diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000..35fa8a2 Binary files /dev/null and b/app/.DS_Store differ diff --git a/app/.pydio b/app/.pydio new file mode 100644 index 0000000..03bafbb --- /dev/null +++ b/app/.pydio @@ -0,0 +1 @@ +1e22f155-e4f8-4498-a130-023ea61b4d5c \ No newline at end of file diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000..709c1f2 --- /dev/null +++ b/app/package.json @@ -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" + } +} \ No newline at end of file diff --git a/app/src/.pydio b/app/src/.pydio new file mode 100644 index 0000000..9779141 --- /dev/null +++ b/app/src/.pydio @@ -0,0 +1 @@ +5353715f-ffba-42f8-a416-5d757bcffaec \ No newline at end of file diff --git a/app/src/config/.pydio b/app/src/config/.pydio new file mode 100644 index 0000000..a5c70b3 --- /dev/null +++ b/app/src/config/.pydio @@ -0,0 +1 @@ +7a10511f-a00c-487f-8773-a6c2d04b1577 \ No newline at end of file diff --git a/app/src/config/index.ts b/app/src/config/index.ts new file mode 100644 index 0000000..bf0f628 --- /dev/null +++ b/app/src/config/index.ts @@ -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: '服务正常', + } + } + ] +} \ No newline at end of file diff --git a/app/src/index.ts b/app/src/index.ts new file mode 100644 index 0000000..c70efbc --- /dev/null +++ b/app/src/index.ts @@ -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() \ No newline at end of file diff --git a/app/src/utils/.pydio b/app/src/utils/.pydio new file mode 100644 index 0000000..b59c3cf --- /dev/null +++ b/app/src/utils/.pydio @@ -0,0 +1 @@ +bfff4b82-ae8b-4738-8507-8f4e4e217a88 \ No newline at end of file diff --git a/app/src/utils/consul.ts b/app/src/utils/consul.ts new file mode 100644 index 0000000..e3332ef --- /dev/null +++ b/app/src/utils/consul.ts @@ -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); + } +} \ No newline at end of file diff --git a/app/tsconfig.json b/app/tsconfig.json new file mode 100644 index 0000000..874945e --- /dev/null +++ b/app/tsconfig.json @@ -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 ''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. */ + } +} diff --git a/gateway/.DS_Store b/gateway/.DS_Store new file mode 100644 index 0000000..a747677 Binary files /dev/null and b/gateway/.DS_Store differ diff --git a/gateway/.pydio b/gateway/.pydio new file mode 100644 index 0000000..034387e --- /dev/null +++ b/gateway/.pydio @@ -0,0 +1 @@ +7bf782e6-9f6f-4dc3-ba13-a17c02882f8b \ No newline at end of file diff --git a/gateway/config/.pydio b/gateway/config/.pydio new file mode 100644 index 0000000..fa7d75a --- /dev/null +++ b/gateway/config/.pydio @@ -0,0 +1 @@ +e7a720b3-b16e-4dc4-b31c-a9c87709ea20 \ No newline at end of file diff --git a/gateway/config/backup/.pydio b/gateway/config/backup/.pydio new file mode 100644 index 0000000..61ca152 --- /dev/null +++ b/gateway/config/backup/.pydio @@ -0,0 +1 @@ +da3d4927-dcc5-4dd3-b8e2-42b1cf9b5eaa \ No newline at end of file diff --git a/gateway/config/backup/gateway.config.yml b/gateway/config/backup/gateway.config.yml new file mode 100644 index 0000000..f246e19 --- /dev/null +++ b/gateway/config/backup/gateway.config.yml @@ -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 + diff --git a/gateway/config/backup/system.config.yml b/gateway/config/backup/system.config.yml new file mode 100644 index 0000000..c200899 --- /dev/null +++ b/gateway/config/backup/system.config.yml @@ -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 diff --git a/gateway/config/gateway.config.json b/gateway/config/gateway.config.json new file mode 100644 index 0000000..1c42d46 --- /dev/null +++ b/gateway/config/gateway.config.json @@ -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 + } + } + ] + } + ] + } + } + } \ No newline at end of file diff --git a/gateway/config/models/.pydio b/gateway/config/models/.pydio new file mode 100644 index 0000000..9aaaf7b --- /dev/null +++ b/gateway/config/models/.pydio @@ -0,0 +1 @@ +dbd3cf03-e067-4aed-9f60-fbd5cc998830 \ No newline at end of file diff --git a/gateway/config/models/applications.json b/gateway/config/models/applications.json new file mode 100644 index 0000000..8b9c248 --- /dev/null +++ b/gateway/config/models/applications.json @@ -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" + ] +} diff --git a/gateway/config/models/credentials.json b/gateway/config/models/credentials.json new file mode 100644 index 0000000..3762505 --- /dev/null +++ b/gateway/config/models/credentials.json @@ -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" + ] + } + ] + } + } +} diff --git a/gateway/config/models/users.json b/gateway/config/models/users.json new file mode 100644 index 0000000..0ad047f --- /dev/null +++ b/gateway/config/models/users.json @@ -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" + ] +} diff --git a/gateway/config/system.config.json b/gateway/config/system.config.json new file mode 100644 index 0000000..a267809 --- /dev/null +++ b/gateway/config/system.config.json @@ -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 + } +} \ No newline at end of file diff --git a/gateway/package.json b/gateway/package.json new file mode 100644 index 0000000..f26a3ff --- /dev/null +++ b/gateway/package.json @@ -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" + } +} \ No newline at end of file diff --git a/gateway/server.ts b/gateway/server.ts new file mode 100644 index 0000000..8ea528d --- /dev/null +++ b/gateway/server.ts @@ -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() diff --git a/gateway/tsconfig.json b/gateway/tsconfig.json new file mode 100644 index 0000000..874945e --- /dev/null +++ b/gateway/tsconfig.json @@ -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 ''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. */ + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..55dabf2 --- /dev/null +++ b/index.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/services/.DS_Store b/services/.DS_Store new file mode 100644 index 0000000..5489dfa Binary files /dev/null and b/services/.DS_Store differ diff --git a/services/.pydio b/services/.pydio new file mode 100644 index 0000000..8b78928 --- /dev/null +++ b/services/.pydio @@ -0,0 +1 @@ +b2008da9-e903-42cf-8482-61a5546f9320 \ No newline at end of file diff --git a/services/articles/.pydio b/services/articles/.pydio new file mode 100644 index 0000000..afac076 --- /dev/null +++ b/services/articles/.pydio @@ -0,0 +1 @@ +60e2194b-a66a-4ee3-9ff8-32721f809a26 \ No newline at end of file diff --git a/services/articles/index.js b/services/articles/index.js new file mode 100644 index 0000000..598a679 --- /dev/null +++ b/services/articles/index.js @@ -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}`) +}) diff --git a/services/articles/package.json b/services/articles/package.json new file mode 100644 index 0000000..b5cc05f --- /dev/null +++ b/services/articles/package.json @@ -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" + } +} \ No newline at end of file diff --git a/services/users/.pydio b/services/users/.pydio new file mode 100644 index 0000000..570bcb7 --- /dev/null +++ b/services/users/.pydio @@ -0,0 +1 @@ +6673397c-c74b-40e1-ab23-c342bedb15d1 \ No newline at end of file diff --git a/services/users/index.js b/services/users/index.js new file mode 100644 index 0000000..bdfe329 --- /dev/null +++ b/services/users/index.js @@ -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}`) +}) diff --git a/services/users/package.json b/services/users/package.json new file mode 100644 index 0000000..a327a55 --- /dev/null +++ b/services/users/package.json @@ -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" + } +} diff --git a/shell/.pydio b/shell/.pydio new file mode 100644 index 0000000..12ea8a0 --- /dev/null +++ b/shell/.pydio @@ -0,0 +1 @@ +1f146e28-31b5-401e-b2ed-5953a56c83a9 \ No newline at end of file diff --git a/shell/config.js b/shell/config.js new file mode 100644 index 0000000..10629d1 --- /dev/null +++ b/shell/config.js @@ -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' + }, + ] + } +} \ No newline at end of file diff --git a/shell/index.js b/shell/index.js new file mode 100644 index 0000000..9c2594f --- /dev/null +++ b/shell/index.js @@ -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(); \ No newline at end of file diff --git a/shell/package.json b/shell/package.json new file mode 100644 index 0000000..820009c --- /dev/null +++ b/shell/package.json @@ -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" + } +} \ No newline at end of file diff --git a/shell/prompts.js b/shell/prompts.js new file mode 100644 index 0000000..e69de29 diff --git a/shell/text b/shell/text new file mode 100644 index 0000000..e69de29 diff --git a/shell/utils.js b/shell/utils.js new file mode 100644 index 0000000..df88797 --- /dev/null +++ b/shell/utils.js @@ -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 \ No newline at end of file diff --git a/test.js b/test.js new file mode 100644 index 0000000..469875e --- /dev/null +++ b/test.js @@ -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); + } + }); +}); + diff --git a/笔记.txt b/笔记.txt new file mode 100644 index 0000000..e57e7e0 --- /dev/null +++ b/笔记.txt @@ -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"' \ No newline at end of file