电商系统 活跃维护

digota

digota/digota

电子商务微服务

522
Stars 标星
86
Forks 分支
27
Watchers 关注
12
Open Issues
Go
主要语言
MIT
开源协议
13.1 MB
仓库大小
5 年前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:digota/digota
git clone https://github.com/digota/digota.git
git clone git@github.com:digota/digota.git
README.md master

英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。

Digota - 电子商务微服务

Digota 是一个电子商务微服务,旨在成为现代电子商务系统的标准。它基于 grpc、protocol-buffers 和 http2 提供了干净、强大且安全的 RPC 接口。

我们的目标是提供覆盖大部分电子商务流程的最佳技术,让您只专注于业务逻辑,而不是电子商务逻辑。

TLDR; 可扩展的电子商务微服务.

加入我们的社区 gitter !

入门

前提条件

  • Go > 1.8
  • 数据库
    • mongodb > 3.2
    • redis(待定)
    • postgresql(待定 - #2)
  • 锁服务器(默认是内存锁)
    • zookeeper
    • redis !!(感谢 @Gerifield)
    • etcd(待定 - #3)

安装

从源代码

$ go get -u github.com/digota/digota

来自 Docker Hub

$ docker pull digota/digota:0.1

跑

$ docker run digota/digota:0.1

或者带旗子

$ docker run digota/digota:0.1 bash -c "digota --version"

查看更多详情,请查看此 docker-compose。

标志:
--info Set log level to info
--debug Set log level to debug
--help, -h show help
--version, -v print the version

跨语言

使用 gRPC 的主要好处是对主要语言的原生支持(C++、Java、Python、Go、Ruby、Node.js、C#、Objective-C、Android Java 和 PHP)。在这里学习如何正确编译你的客户端,你也可以使用你的 Makefile。

已编译的客户端:

  1. php

灵活的支付网关

无论你使用哪个支付网关都没关系,这只是注册时的配置问题。

目前支持的网关:

  1. Stripe
  2. Braintree

你是支付提供商吗?
只需实现以下 接口 并提交 PR 你的更改。

认证与安全

我们非常重视安全问题,请随时报告安全问题。

Digota 完全使用 TLS 进行加密(端到端)。这个事实还被用于基于客户端证书在本地证书颁发机构前进行身份验证。基本上,我们正在创建 CA,并使用同一个 CA 签署我们想要批准的任何证书。

撤销证书怎么办?这里的 CRL 方法是白名单而不是黑名单,只需从配置中移除客户端序列号即可。

Create CA
$ certstrap init --common-name "ca.company.com"
创建客户端证书
$ certstrap request-cert --domain client.company.com
签署证书
$ certstrap sign --CA "ca.company.com" client.company.com
批准证书

获取证书序列号,并将序列号和权限范围(WRITE、READ、WILDCARD)附加到你的配置中

$ openssl x509 -in out/client.com.crt -serial | grep -Po '(?<=serial=)\w+'
output: A2FF9503829A3A0DDE9CB87191A472D4

按照这些步骤创建您的CA和证书。

货币与资金

在涉及金钱时,浮点数很棘手,我们不想损失金钱,因此这里选择的货币表示基于最小货币单位。例如:4726 表示 $47.26。

分布式锁

所有重要的数据使用的是 Exclusively Guaranteed,这意味着你不需要担心不同节点之间的任何并发数据竞争。典型的数据访问如下:

Client #1 GetSomething -> TryLock -> [lock accuired] ->  DoSomething -> ReleaseLock -> Return Something 
                                                                                 \ 
Client #2 GetSomething -> TryLock -> --------- [wait for lock] -------------------*-----> [lock accuired] -> ...

Client #3 GetSomething -> TryLock -> -------------------- [wait for lock] ---> [accuire error] -> Return Error

核心服务

付款

service Payment {
    rpc Charge  (chargeRequest) returns (charge)        {}
    rpc Refund  (refundRequest) returns (charge)        {}
    rpc Get     (getRequest)    returns (charge)        {}
    rpc List    (listRequest)   returns (chargeList)    {}
}

全服务 定义。

支付服务用于信用卡/借记卡扣费和退款,同时它也支持多种支付提供商。通常如果您使用的是 order 功能,外部并不需要使用此服务。

订单

service Order {
    rpc New     (newRequest)    returns (order)         {}
    rpc Get     (getRequest)    returns (order)         {}
    rpc Pay     (payRequest)    returns (order)         {}
    rpc Return  (returnRequest) returns (order)         {}
    rpc List    (listRequest)   returns (listResponse)  {}
}

完整服务 定义.

订单服务帮助您处理结构化采购,即 order。自然地,订单是可购买产品、折扣、发票和基本客户信息的集合。

产品

service Product {
    rpc New     (newRequest)    returns (product)       {}
    rpc Get     (getRequest)    returns (product)       {}
    rpc Update  (updateRequest) returns (product)       {}
    rpc Delete  (deleteRequest) returns (empty)         {}
    rpc List    (listRequest)   returns (productList)   {}
}

完整服务 定义。

产品服务帮助您管理您的产品,产品代表可购买项目(SKU)的集合,可以是实体或数字。

库存单位

service Sku {
    rpc New     (newRequest)    returns (sku)           {}
    rpc Get     (getRequest)    returns (sku)           {}
    rpc Update  (updateRequest) returns (sku)           {}
    rpc Delete  (deleteRequest) returns (empty)         {}
    rpc List    (listRequest)   returns (skuList)       {}
}

完整服务 定义。

SKU 服务帮助您管理您的产品库存单位(SKU),SKU 代表特定的产品配置,例如属性、货币和价格。

例如,一个产品可能是 football ticket,而一个特定的 SKU 则代表体育场的某个区域。

Sku 也用于管理其库存,并在库存类型为 Finite 的情况下防止超卖。

使用示例

最终目标是让客户端的生活更轻松,这里有一个用 Golang 创建订单并支付的例子……就这么简单。

创建新订单

order.New(context.Background(), &orderpb.NewRequest{
    Currency: paymentpb.Currency_EUR,
    Items: []*orderpb.OrderItem{
        {
            Parent:   "af350ecc-56c8-485f-8858-74d4faffa9cb",
            Quantity: 2,
            Type:     orderpb.OrderItem_sku,
        },
        {
            Amount:      -1000,
            Description: "Discount for being loyal customer",
            Currency:    paymentpb.Currency_EUR,
            Type:        orderpb.OrderItem_discount,
        },
        {
            Amount:      1000,
            Description: "Tax",
            Currency:    paymentpb.Currency_EUR,
            Type:        orderpb.OrderItem_tax,
        },
    },
    Email: "yaron@digota.com",
    Shipping: &orderpb.Shipping{
        Name:  "Yaron Sumel",
        Phone: "+972 000 000 000",
        Address: &orderpb.Shipping_Address{
            Line1:      "Loren ipsum",
            City:       "San Jose",
            Country:    "USA",
            Line2:      "",
            PostalCode: "12345",
            State:      "CA",
        },
    },
})

支付订单


order.Pay(context.Background(), &orderpb.PayRequest{
    Id:                "bf350ecc-56c8-485f-8858-74d4faffa9cb",
    PaymentProviderId: paymentpb.PaymentProviderId_Stripe,
    Card: &paymentpb.Card{
        Type:        paymentpb.CardType_Visa,
        CVC:         "123",
        ExpireMonth: "12",
        ExpireYear:  "2022",
        LastName:    "Sumel",
        FirstName:   "Yaron",
        Number:      "4242424242424242",
    },
})          

贡献

发展

捐赠

许可证

// Digota <http://digota.com> - eCommerce microservice
// Copyright (c) 2018 Yaron Sumel <yaron@digota.com>
//
// MIT License
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

您可以在 这里 找到完整的许可证文件,如有关于许可证的任何问题,请 联系我们。

联系

如有任何问题或咨询,请联系 yaron@digota.com

本站来源与版权声明
  • 本文标题:digota - 电子商务微服务
  • 本文链接:https://www.cn121.com/shop/digota-digota.html
  • 原项目:digota/digota 版权归原作者 digota 及贡献者所有
  • 收录信息:本站于 2026-10-25 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
  • 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。
  • 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 digota/digota。
  • 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出,仅将二级标题译为中文,便于按栏目定位;标题原文可在下方原仓库中查看),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
  • 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
  • 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。