Coder Social home page Coder Social logo

cellbang / malagu Goto Github PK

View Code? Open in Web Editor NEW
690.0 21.0 59.0 75.41 MB

Malagu is a Serverless First, componentized, platform-independent progressive application framework based on TypeScript. Malagu 是基于 TypeScript 的 Serverless First、组件化、平台无关的渐进式应用框架。

Home Page: https://malagu.naily.cc

License: MIT License

JavaScript 3.55% TypeScript 96.07% HTML 0.03% Vue 0.16% CSS 0.15% SCSS 0.01% Dockerfile 0.03%
serverless serverless-framework faas bff orm microapp microservice typescript platform-independent dependency-injection

malagu's Introduction

English | 简体中文

Malagu Logo

GitHub license npm version npm downloads Build Status star

Cloud Studio Template

Malagu is a Serverless First, componentized, platform-independent progressive application framework based on TypeScript.

Features

  • Convention over configuration, zero configuration, ready to use out of the box
  • Spring Boot for TypeScript
  • Serverless First
  • The platform is not locked
  • Support front-end and back-end integration, and the front-end frame is not locked
  • Support microservices
  • Componentization, progressive
  • Pluginization of command line tools
  • Dependency injection
  • Aspect Oriented Programming (AOP)
  • Integrate with popular ORM framework and use decorator declarative transaction management
  • Support OIDC certification
  • Support OAuth2 authorization
  • Use rxjs to manage status
  • Provides two interface styles, REST and RPC

The origin of Malagu's name: In my hometown, the homophonic "Ma Lagu" means small stones. The small stones can be piled up to build high-rise buildings, roads and bridges, and the arrangement of Malagu components can realize ever-changing applications.

Quick start

# Install command-line tools
npm install -g @malagu/cli

# Initialization
malagu init -o project-name
cd project-name # Enter the project root directory

# Running
malagu serve

# Deployment
malagu deploy -m scf      # Deploy to Tencent Cloud Function(SCF)
malagu deploy -m fc       # Deploy to Alibaba Cloud Function Compute(FC)
malagu deploy -m lambda   # Deploy to AWS Lambda

Quick Start

Samples

Documentation

Dependency injection

// Class object injection
@Component()
export class A {

}

@Component()
export class B {
    @Autowired()
    protected a: A;
}

// Configuration property injection
@Component()
export class C {
    @Value('foo') // Support EL expression syntax, such as @Value('obj.xxx'), @Value('arr[1]') etc.
    protected foo: string;
}

Database operations

import { Controller, Get, Param, Delete, Put, Post, Body } from '@malagu/mvc/lib/node';
import { Transactional, OrmContext } from '@malagu/typeorm/lib/node';
import { User } from './entity';
@Controller('users')
export class UserController {
    
    @Get()
    @Transactional({ readOnly: true })
    list(): Promise<User[]> {
        const repo = OrmContext.getRepository(User);
        return repo.find();
    }
    @Get(':id')
    @Transactional({ readOnly: true })
    get(@Param('id') id: number): Promise<User | undefined> {
        const repo = OrmContext.getRepository(User);
        return repo.findOne(id);
    }
    @Delete(':id')
    @Transactional()
    async remove(@Param('id') id: number): Promise<void> {
        const repo = OrmContext.getRepository(User);
        await repo.delete(id);
    }
    @Put()
    @Transactional()
    async modify(@Body() user: User): Promise<void> {
        const repo = OrmContext.getRepository(User);
        await repo.update(user.id, user);
    }
    @Post()
    @Transactional()
    create(@Body() user: User): Promise<User> {
        const repo = OrmContext.getRepository(User);
        return repo.save(user);
    }
}

Discuss group

群二维码.png

Status

Alt

malagu's People

Contributors

2234839 avatar bingtsingw avatar chaozwn avatar coderyqy avatar coreybin avatar dependabot[bot] avatar jerrywu1234 avatar lccf avatar linlzis avatar linxiaowu66 avatar lzy2014love avatar muxiangqiu avatar vangie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

malagu's Issues

阿里云自定义服务名,函数名失败

我按照 自定义部署规则 配置了 malagu.yml

malagu:
  faas-adapter:
    service:
      name: my
    function:
      name: myfun1

生成dist中的malagu.backend.yml文件如下

malagu:
  name: Malagu Framework
  hostDomId: malagu-root
  annotation:
    Component:
      proxy: false
  aop:
    enabled: true
  logger:
    level: info
  tenant:
    enabled: false
  session:
    autoCommit: true
    maxAge: 86400000
    sessionIdKey: malagu:sessionId
    sessionKey: malagu:session
  server:
    path: /2016-08-15/proxy/malagu.test/malagu/
    port: 3000
    endpoint: https://{aid}.cn-shanghai.fc.aliyuncs.com
    _domain: http://
  trace:
    requestField: X-Malagu-Trace-ID
    responseField: X-Malagu-Trace-ID
  web:
    route:
      cacheSize: 500
    validationPipeOptions:
      detailedOutputDisabled: false
      transformEnabled: true
  client:
    config:
      withCredentials: true
      headers:
        X-Requested-With: XMLHttpRequest
  mvc:
    path: /*
    defaultViewName: json
    baseFileDir: assets
  mustache:
    cache: false
    baseViewDir: assets/views
  cloud:
    name: alibaba
    faas:
      function:
        name: malagu
        handler: backend/index.handler
        codeUri: {}
        memorySize: 512
        timeout: 15
        serviceName: malagu
        instanceConcurrency: 10
        runtime: custom
        bootstrap: node backend/index.js
      alias:
        name: test
        serviceName: malagu
      secure: true
      internal: false
      timeout: 600000
      service:
        name: malagu
      trigger:
        name: malagu-test
        qualifier: test
        functionName: malagu
        serviceName: malagu
        triggerType: http
        triggerConfig:
          authType: anonymous
          methods:
            - GET
            - POST
            - PUT
            - DELETE
            - HEAD
            - PATCH
      customDomain:
        protocol: HTTP
        certConfig:
          privateKey: ssl/domain.key
          certificate: ssl/domain.pem
        routeConfig:
          routes:
            - path: /*
              serviceName: malagu
              qualifier: test
              functionName: malagu
      account:
        id: {aid}
      region: cn-shanghai
    profilePath: alibaba/profile.yml
    regions:
      - cn-qingdao
      - cn-beijing
      - cn-zhangjiakou
      - cn-hangzhou
      - cn-shanghai
      - cn-shenzhen
      - cn-huhehaote
      - cn-hongkong
      - ap-southeast-1
      - ap-southeast-2
      - ap-northeast-1
      - us-west-1
      - us-east-1
      - eu-central-1
      - ap-south-1
  faas-adapter:
    service:
      name: my
    function:
      name: myfun1
  cookies:
    keys:
      - abcdef
propsHooks: []
stage: test
targets:
  - backend
mode:
  - remote
  - test

阿里云fc仍然是创建 服务名 malagu 函数名 malagu 的函数 .

支持任务调度和消息队列

  1. 支持任务调度,设计可以参考 spring 的 @schedule,要求传统任务调度和 Serverless 时间触发器两者之间无缝切换。
  2. 支持消息队列,设计可以参考 spring 的 @JmsListener,要求传统任务调度和 Serverless 消息触发器两者之间无缝切换。

vue 模版, 无法部署到阿里云, 安装 fc-adapter 和 fc-plugin, 但 cli程序 却 非要向 腾讯云部署..

image

==========================================
都是 malagu init vue-app , 没动过什么, 只是添加了 fc-adapter 和 fc-plugin.

这是 package

{
  "name": "vue-app",
  "keywords": [
    "malagu-component"
  ],
  "version": "0.0.0",
  "license": "MIT",
  "files": [
    "lib",
    "src"
  ],
  "dependencies": {
    "@malagu/cli-service": "^2.10.2",
    "@malagu/core": "latest",
    "@malagu/fc-adapter": "^2.10.2",
    "@malagu/rpc": "latest",
    "@malagu/serve-static": "latest",
    "@malagu/vue": "latest",
    "vue": "^3.0.11",
    "vue-router": "^4.0.8"
  },
  "devDependencies": {
    "@malagu/cli": "latest",
    "@malagu/fc-plugin": "^2.10.2"
  },
  "scripts": {
    "clean": "rimraf lib dist .malagu",
    "build": "malagu build",
    "start": "malagu serve",
    "deploy": "malagu deploy -m test",
    "deploy:test": "malagu deploy -m test",
    "deploy:pre": "malagu deploy -m pre",
    "deploy:prod": "malagu deploy -m prod"
  }
}

==========
这是命令行


cuiluming@RaisdeAir vue-app % npm run clean

> [email protected] clean /Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app
> rimraf lib dist .malagu

cuiluming@RaisdeAir vue-app % yarn run deploy
yarn run v1.22.17
warning ../package.json: No license field
$ malagu deploy -m test

                   ___
 /'\_/`\          /\_ \
/\      \     __  \//\ \      __       __   __  __
\ \ \__\ \  /'__`\  \ \ \   /'__`\   /'_ `\/\ \/\ \
 \ \ \_/\ \/\ \L\.\_ \_\ \_/\ \L\.\_/\ \L\ \ \ \_\ \
  \ \_\\ \_\ \__/.\_\/\____\ \__/.\_\ \____ \ \____/
   \/_/ \/_/\/__/\/_/\/____/\/__/\/_/\/___L\ \/___/
                                       /\____/
                   @malagu/[email protected]  \_/__/

╭──────────────────────────────────────────────────╮
│      Serverless First Development Framework      │
│                 Runtime<malagu>                  │
╰──────────────────────────────────────────────────╯

🏔   malagu stage - test
🏷   malagu mode - remote
🏷   malagu mode - test
🏷   malagu mode - auto
🏷   malagu mode - scf-adapter
🏷   malagu mode - scf
🎯  malagu target - backend
🎯  malagu target - frontend
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/cli-service@^2.10.2
🧱  malagu component - @malagu/fc-adapter@^2.10.2
🧱  malagu component - @malagu/rpc@latest
🧱  malagu component - @malagu/serve-static@latest
🧱  malagu component - @malagu/vue@latest
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/[email protected]
🧱  malagu component - @malagu/fc-plugin@^2.10.2
🧱  malagu component - [email protected]
backend build [====================] 98% (3.3 seconds) DONE  Compiled successfully in 3316ms                                                          11:55:27

 I  The backend code output to /Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/.malagu/dist/backend 🎉

Build completed in 3.533s

frontend build [==================  ] 92% (6.4 seconds) DONE  Compiled successfully in 6387ms                                                          11:55:34

 I  The frontend code output to /Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/.malagu/dist/frontend 🎉

frontend build [====================] 99% (6.5 seconds) DONE  Compiled successfully in 6387ms                                                          11:55:34

 I  The frontend code output to /Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/.malagu/dist/frontend 🎉

 DONE  Compiled successfully in 6387ms                                                          11:55:34

 I  The frontend code output to /Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/.malagu/dist/frontend 🎉

frontend build [====================] 99% (6.6 seconds) DONE  Compiled successfully in 6387ms                                                          11:55:34

 I  The frontend code output to /Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/.malagu/dist/frontend 🎉

Build completed in 6.64s


Deploying vue-app to the cn-hangzhou region of alibaba cloud...
- Profile: 
    - AccountId: 1236284087205882
    - Region: cn-hangzhou
- SCF:
TencentCloudSDKHttpException [Error]: The SecretId is not found, please ensure that your SecretId is correct.
    at Client.parseResponse (/Users/cuiluming/.malagu/runtimes/2.10.2/default/node_modules/tencentcloud-sdk-nodejs/tencentcloud/common/abstract_client.js:134:33)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at Client.request (/Users/cuiluming/.malagu/runtimes/2.10.2/default/node_modules/tencentcloud-sdk-nodejs/tencentcloud/common/abstract_client.js:65:28)
    at getNamespace (/Users/cuiluming/.malagu/runtimes/2.10.2/default/node_modules/@malagu/scf-plugin/src/hooks/utils.ts:209:36)
    at createOrUpdateNamespace (/Users/cuiluming/.malagu/runtimes/2.10.2/default/node_modules/@malagu/scf-plugin/src/hooks/deploy.ts:130:27)
    at Object.exports.default (/Users/cuiluming/.malagu/runtimes/2.10.2/default/node_modules/@malagu/scf-plugin/src/hooks/deploy.ts:40:5)
    at HookExecutor.doRequire (/Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/node_modules/@malagu/cli-common/src/hook/hook-executor.ts:70:24)
    at HookExecutor.doExecuteHooks (/Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/node_modules/@malagu/cli-common/src/hook/hook-executor.ts:111:33)
    at exports.default (/Users/cuiluming/Nextcloud/dev_chaoway/js/vue-app/node_modules/@malagu/cli-service/src/deploy/deploy.ts:33:9) {
  requestId: '4258a483-31f4-47d1-ac1b-d381eead25a8',
  code: 'AuthFailure.SecretIdNotFound'
}
error Command failed with exit code 255.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

【文档完善】补充一个多环境隔离原理图

背景:未来保证项目的质量,一般会有多套运行环境,一般三套:测试、预发和线上。测试环境主要给开发人员测试验证用的,数据库一般是测试数据库;预发环境是一个非常接近线上的一个环境,预发验证没有问题后,就可以发布到线上环境了。

Malagu 框架通过组件属性的覆盖和运行模式,以及对 el 表达式支持,能够很容易做到多环境的隔离部署。

malagu cli 目前需要改进的点

  1. 对于命令 malagu -v, malagu -h 也需要 load cli context,需要等一点时间才能看到结果
  2. 对于不支持的框架使用 malagu deploy 命令,提示Unknown command deploy, 可以增加 malagu support list,malagu support 查看malagu 支持的框架和检测当前项目是否支持 malagu 部署
  3. 对于部署在 scf web 函数的用户, 要提醒或者文档显眼说明注意点。
  • 只能监听 9000 固定端口和地址 0.0.0.0
  • 只有 /tmp 目录可读可写, 读写其他目录文件不没有权限
  1. 增加命令 malagu deploy -c 或者 malagu deploy -config 指定部署配置,可以是json 文件和 js 文件(这两种前端项目比较常用),配置项可以有 部署平台, 部署模式, 自定义支持框架,添加环境变量 等。

TypeError: Cannot read properties of undefined (reading 'intercept')

当malagu init项目后,运行malagu serve就出现这个情况
frontend build [ ] 0% (0.0 seconds)TypeError: Cannot read properties of undefined (reading 'intercept')
at /Users/vincent_pun/Desktop/test/sample-app/node_modules/webpack/lib/ProgressPlugin.js:242:30
at Array.forEach ()
at /Users/vincent_pun/Desktop/test/sample-app/node_modules/webpack/lib/ProgressPlugin.js:239:24
at Hook.eval (eval at create (/Users/vincent_pun/Desktop/test/sample-app/node_modules/tapable/lib/HookCodeFactory.js:19:10), :104:1)
at Hook.CALL_DELEGATE [as _call] (/Users/vincent_pun/Desktop/test/sample-app/node_modules/tapable/lib/Hook.js:14:14)
at Compiler.newCompilation (/Users/vincent_pun/Desktop/test/sample-app/node_modules/@malagu/cli-service/node_modules/webpack/lib/Compiler.js:1055:26)
at /Users/vincent_pun/Desktop/test/sample-app/node_modules/@malagu/cli-service/node_modules/webpack/lib/Compiler.js:1099:29
at Hook.eval [as callAsync] (eval at create (/Users/vincent_pun/Desktop/test/sample-app/node_modules/tapable/lib/HookCodeFactory.js:33:10), :6:1)
at Hook.CALL_ASYNC_DELEGATE [as _callAsync] (/Users/vincent_pun/Desktop/test/sample-app/node_modules/tapable/lib/Hook.js:18:14)
at Compiler.compile (/Users/vincent_pun/Desktop/test/sample-app/node_modules/@malagu/cli-service/node_modules/webpack/lib/Compiler.js:1094:28)
λ ~/Desktop/test/sample-app/ npm install -g @malagu/cli

malagu文档存在的一些问题

malagu文档存在的一些问题

一、目录需要完善

目录偏重于教程,建议对文档目录进行完善。参考方案有两个

  1. vue文档目录
  • 教程
  • API
  • 风格指南
  • 示例
  • Cookbook

2.k8s文档目录

  • 主页
  • 入门
  • 概念
  • 任务
  • 教程
  • 参考
  • 贡献

这两个都是比较成功的开源项目,具有借鉴意义。

二、欠缺 api 参考

没有api参考,有限的示例过于简单,难以灵活掌握框架各项功能。一些api的用法在教程内容中目录较深找查不便,需要整理专门的api文档供参考查找。

三、示例过于简单

示例内容更象模板项目的一个归类,没有对示例用到的模块、用法进行说明。也没有相关配置项的说明。

四、缺少针对社区开发者的指引文档

没有针对整个框架代码结构及执行流程的说明文档,新的参与者如果想要参与贡献代码要从头熟悉源码,消耗大量时间和热情。社区贡献者大多是利用零散时间,提供相应的文档让有意原贡献的人快速上手可以提升效率。

五、总结

当前需补齐的内容主要为以下两块

  1. api参考、模块参考、模块配置参考
  2. 针对开发者的指引文档

建议的文档目录

  • 介绍
  • 概念(可选,如果内容量不是很多可以并入教程中,k8s中的概念特别多,所以使用了专门的章节)
  • 教程(当前文档的主要内容)
  • 参考(包含api参考、模块参考、模块配置参考等)
  • 示例&Cookbook(示例中针对template的说明可以更细化一些,可以添加一个相对完整的blog或者cms系统开发示例)
  • 贡献指南(针对社区开发者的文档及协作指引)

配置文件动态更新

场景

开发过程中一些针对业务的配置经常需要修改调试,当前配置文件在服务启动后无法更新,需要手动重启。

方案参考

  • 1.为配置模块添加hook,可以在代码中动态修改配置,通过代码的热更实现配置更新。开发时将需要频繁调整的配置集成在代码中,发布前迁移到yml文件中。
  • 2.侦测yml文件的更新,利用webpack的hmr动态更新配置。
  • 3.开发模式侦测到yml文件变更后自动重启当前服务。

说明:方案1实现相对简单,可满足场景需求。方案2体验好,实现复杂。方案3体验差。

hello

I will continue to focus on this framework

框架重名命名(方便记忆和传播)

目前想到的一个名字是 Cell,单元的意思,与 Malagu 框架的组件概念有异曲同工之妙。也方便识别和记忆。npm 发布的 package 名字可以使用 celljs,例如 @celljs/core 等等。

期望runtime可按需安装

问题描述:
当前执行malagu cli命令时会默认安装runtime中sfc-adapter、cil-service、sfc-plugin三个组件。

期望:
通指定参数控制是否自动安装runtime

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.