first commit

This commit is contained in:
编码猿
2024-09-27 01:14:21 +08:00
commit 5ddcc17391
52 changed files with 1176 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
node_modules
dist
package-lock.json

1
.idea/.pydio generated Executable file
View File

@@ -0,0 +1 @@
bb717b1a-1aeb-4789-82f9-c0ac0f70463d

6
.idea/jsLibraryMappings.xml generated Normal file
View 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
View 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
View 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
View 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
View 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>

1
.pydio Normal file
View File

@@ -0,0 +1 @@
750d3740-f8ec-4440-a154-b04579637877

BIN
app/.DS_Store vendored Normal file

Binary file not shown.

1
app/.pydio Normal file
View File

@@ -0,0 +1 @@
1e22f155-e4f8-4498-a130-023ea61b4d5c

22
app/package.json Normal file
View 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
View File

@@ -0,0 +1 @@
5353715f-ffba-42f8-a416-5d757bcffaec

1
app/src/config/.pydio Normal file
View File

@@ -0,0 +1 @@
7a10511f-a00c-487f-8773-a6c2d04b1577

37
app/src/config/index.ts Normal file
View 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
View 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
View File

@@ -0,0 +1 @@
bfff4b82-ae8b-4738-8507-8f4e4e217a88

31
app/src/utils/consul.ts Normal file
View 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
View 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

Binary file not shown.

1
gateway/.pydio Normal file
View File

@@ -0,0 +1 @@
7bf782e6-9f6f-4dc3-ba13-a17c02882f8b

1
gateway/config/.pydio Normal file
View File

@@ -0,0 +1 @@
e7a720b3-b16e-4dc4-b31c-a9c87709ea20

View File

@@ -0,0 +1 @@
da3d4927-dcc5-4dd3-b8e2-42b1cf9b5eaa

View 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

View 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

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

View File

@@ -0,0 +1 @@
dbd3cf03-e067-4aed-9f60-fbd5cc998830

View 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"
]
}

View 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"
]
}
]
}
}
}

View 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"
]
}

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

Binary file not shown.

1
services/.pydio Normal file
View File

@@ -0,0 +1 @@
b2008da9-e903-42cf-8482-61a5546f9320

1
services/articles/.pydio Normal file
View File

@@ -0,0 +1 @@
60e2194b-a66a-4ee3-9ff8-32721f809a26

View 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}`)
})

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

@@ -0,0 +1 @@
6673397c-c74b-40e1-ab23-c342bedb15d1

25
services/users/index.js Normal file
View 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}`)
})

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

@@ -0,0 +1 @@
1f146e28-31b5-401e-b2ed-5953a56c83a9

81
shell/config.js Normal file
View 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: '2Api 网关',
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
View 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
View 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
View File

0
shell/text Normal file
View File

20
shell/utils.js Normal file
View 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
View 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
View 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"'