创业

创业吧,趁年轻!


告别了上一段的创业之旅,Toby 正在修身养性,准备开启下一段未知的旅程。

从这篇文章开始,Toby 将带领大家一起直面创业的困难与挑战,写下一些浅薄的经验和思考,与大家共勉,共同学习成长。

目前大概会从这几个方面展开:

  • 创业路上之基础实践篇
  • 创业路上之个人成长篇
  • 创业路上之职业技能篇 - 技术 - 服务端及运维(本篇)
  • 创业路上之职业技能篇 - 技术 - 大前端
  • 创业路上之职业技能篇 - 产品
  • 创业路上之职业技能篇 - 运营
  • 创业路上之管理入门篇
  • 创业路上之商业思考篇 - 社交赛道
  • 创业路上之商业思考篇 - 商业模式
  • 创业路上之商业思考篇 - 融资及股权

架构概览

主流互联网企业的服务端架构图

创业

Toby 花了好几个小时才画好这张图,简直不能更复杂了!


俗话说得好:“脱离企业规模谈架构就是耍流氓”。今天 Toby 并不打算展开探讨这个复杂的服务端架构,而是简单探讨一下10万日活以下的初创互联网企业,如何搭建一个经济实用的服务端架构。

云计算

近年来云计算的飞速发展,极大地降低了企业的技术门槛以及商业成本。初创企业通过使用云计算厂商的各种商用服务,可以快速实现各种复杂的业务需求,并减少运维成本。

01 购买及初始化云服务器

这里以阿里云的 CentOS 7.x 为例,初始化如下:

# 修改服务器主机名为 fewper
hostnamectl set-hostname fewper
# 更新系统
yum -y update
# 第三方软件仓库
yum install -y https://dl.fedoraproject.org/pub/epel
/epel-release-latest-7.noarch.rpm
# 修改字符集、语言、地区、时间
echo "export LANG=en_US.UTF-8" >> /etc/profile
echo "export LANGUAGE=en_US:en" >> /etc/profile
echo "export LC_ALL=en_US.UTF-8" >> /etc/profile
source /etc/profile
set -x \
    && rm -f /etc/localtime \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && rm -f /etc/sysconfig/clock \
    && echo "ZONE=\"Asia/Shanghai\"" >> /etc/sysconfig/clock \
    && echo "UTC=false" >> /etc/sysconfig/clock \
    && echo "ARC=false" >> /etc/sysconfig/clock \
    && echo "SRM=false" >> /etc/sysconfig/clock
# 安装一些必要软件
yum install -y vim \
    htop \
    wget \
    tar 
# 新建用户 toby 并修改密码
useradd toby
passwd toby
# toby 权限
visudo
toby   ALL=(ALL)       NOPASSWD:ALL
# SSH Key 登录(禁用root用户登录)
mkdir ~/.ssh
vim ~/.ssh/authorized_keys
chmod 700  ~/.ssh
chmod 644  ~/.ssh/authorized_keys

vim /etc/ssh/sshd_config
PubkeyAuthentication yes
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
02 安装 Docker 环境及管理面板 Portainer
# 安装 Docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo 
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker-ce
systemctl enable docker
systemctl start docker
# 将 toby 加入到 Docker 管理组
usermod -aG docker toby
# 安装 Docker 管理面板 Portainer
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 
--name=portainer --restart=always -v 
/var/run/docker.sock:/var/run/docker.sock 
-v portainer_data:/data portainer/portainer
# Toby 日常使用的自定义 Docker 镜像已经托管到 https://hub.docker.com/u/gorkor
# 1.1 版本是 CentOS 8.x 的镜像
# 1.0 版本是 CentOS 7.x 的镜像
docker pull gorkor/centos-nginx:1.1
docker pull gorkor/centos-mysql:1.1
docker pull gorkor/centos-redis:1.1
docker pull gorkor/centos-rabbitmq:1.1
docker pull gorkor/centos-mongodb:1.1
docker pull gorkor/centos-mongodb-mongod:1.1
docker pull gorkor/centos-jdk:1.1
03 购买其他必要的云计算服务
  • 云数据库(MySQL、Redis、MongoDB等)
  • 域名及云解析
  • 云存储 OSS 及 CDN
  • 短信
  • 消息队列

搭建简单的服务端架构(基于 Gorkor APP 服务端架构)

少废话,直接上图:

创业

暂时去掉了ELK日志系统,并简化了配置中心和注册中心


01 自研基于 RabbitMQ 和 Spring-Boot 的轻量级 RPC 框架
# Simple-RPC
非常轻量级的 RPC 调用框架,基于 RabbitMQ 消息队列,使用 Spring-Boot 开发。

# 开源地址
https://github.com/thinktkj/simple-rpc

# Spring-Boot Dependency
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

# Simple-RPC Dependency
<dependency>
    <groupId>vip.toby.rpc</groupId>
    <artifactId>simple-rpc</artifactId>
    <version>1.1.9.RELEASE</version>
</dependency>

# RpcServer Demo
@RpcServer(value="rpc-queue-name", type = {RpcType.SYNC, RpcType.ASYNC})
public class Server {

    @RpcServerMethod
    public ServerResult methodName1(JSONObject params) {
        String param1 = params.getString("param1");
        int param2 = params.getIntValue("param2");

        JSONObject result = new JSONObject();
        result.put("param1", param1);
        result.put("param2", param2);
        result.put("result", param1 + param2);

        return ServerResult.build(OperateStatus.SUCCESS).result(result)
.message("ok");
    }

    @RpcServerMethod("methodName2-alias")
    public ServerResult methodName2(JSONObject params) {
        return ServerResult.build(OperateStatus.FAILURE)
.message("失败").errorCode(233);
    }

}

# RpcClient Demo
@RpcClient(value = "rpc-queue-name", type = RpcType.SYNC)
public interface SyncClient {

    @RpcClientMethod
    RpcResult methodName1(@Param("param1") String param1,
 @Param("param2") int param2);

    @RpcClientMethod("methodName2-alias")
    RpcResult methodName2(@Param("param1") String param1,
 @Param("param2") int param2);

}

@RpcClient(value = "rpc-queue-name", type = RpcType.ASYNC)
public interface AsyncClient {

    @RpcClientMethod
    void methodName1(@Param("param1") String param1, 
@Param("param2") int param2);

    @RpcClientMethod("methodName2-alias")
    void methodName2(@Param("param1") String param1, 
@Param("param2") int param2);

}

# application.yml 配置
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: admin
    virtual-host: default_vs

# 许可证
使用 Apache License - Version 2.0 协议开源。
02 自研基于 Vert.x 和 MongoDB 的异步文件服务(兼容阿里云OSS服务)
# Simple-File
非常轻量级的异步文件服务,基于 Vert.x 和 MongoDB,使用 Spring-Boot 开发。

# 开源地址
https://github.com/thinktkj/simple-file(暂未开源,还在整理中...)

# 许可证
使用 Apache License - Version 2.0 协议开源。
03 自研基于 Ext-JS 和 Spring-Boot 的后台管理系统
# Simple-CMS
非常轻量级的 CMS 后台管理系统,使用 Spring-Boot 开发。

# 开源地址
https://github.com/thinktkj/simple-cms

# Spring-Boot Dependency
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

# 数据库初始化
1. 新建一个 utf8 编码的数据库名为 cms
2. 将 sql/cms.sql 中的 heart 替换成数据库的用户名
3. 再执行SQL完成初始化

# application.yml 配置
# 是否启用超级管理员
requireAdmin: true
# 超级管理员登录名
superUserName: heart2020
# 超级管理员密码
superUserPwd: heart2020
# 是否为开发模式
isDevelopment: false
# 登录错误次数上限
errorLoginCount: 3
# 登录错误超过错误次数上限,用户锁定时间(分钟)
lockTime: 1
# 保存标签的开启/关闭
saveLabel: false
# 提示时间
tipTime: 7

# 许可证
使用 Apache License - Version 2.0 协议开源。

创业

功能截图


04 部分微服务介绍

创业

Docker 管理面板截图


权限服务 gk-auth
主要接口:获取验证码,注册,登录,退出
重点:防止短信轰炸策略,安全校验等

敏感词检测 gk-filter
重点:所有用户输入的接口都将通过检测,DFA 算法,
支持在线编辑本地敏感词库,支持动态接入第三方检测功能

创建服务 gk-create
主要接口:创建短信,初始化数据,创建邮票,创建信件钥匙,创建积分,创建信纸
重点:阿里云短信API调用

投递服务 gk-deliver
主要接口:投递信件,投递时光机信件

动态定时任务 gk-job
主要接口:投递信件定时任务,时光机定时任务
重点:QuartzJob 动态执行

信件服务 gk-letter
主要接口:信件相关,信纸相关
重点:新人信件推荐逻辑

基础服务 gk-server
主要接口:积分,活跃记录,建议与反馈,版本,年度总结,用户信息,用户推送设置等
重点:无

API网关 gk-web
主要接口:主域名下页面鉴权及参数整理
重点:各客户端(Android,iOS,WEB,WX)等权限验证,跨域解决,微信授权

邮票服务 gk-stamp
主要接口:集邮册,新邮票,邮票故事
重点:批量生成邮戳,Google 缓存

推送 gk-message
主要接口:更新设备绑定信息,推送消息
重点:优化了极光的 http 包,尽量不要更新此 jar 包,设备更新绑定策略

运营任务 gk-scheduling
主要功能:每日用户数据统计,每日清空过客岛图片,每日清空聊天室内容,时光机信件推送,
免打扰信息补发,次日赠送道具,商城数据统计,注册用户引导信件等
重点:动态运营任务(发杂志,发推送,修补数据等)

安卓在线推送 gk-mqtt
主要功能:推送消息,设备的鉴权,连接,断开等

文件服务器 gk-file
重点:Vert.x 异步,MongoDB 异步优化,Http 协议状态码封装,图片压缩参数,
跨域实现,第三方框架 vertx-mongo-streams 使用

后台管理 gk-cms
主要框架:ExtJS4.x,Paoding-Rose,Spring-Boot
重点:IDataBaseService,DataBaseService 实现,多数据源,
权限封装,三权分立,前端 ExtJS 封装,MVVM 架构

公共库 gk-common
重点:公共字段枚举,通用消息队列处理,活跃记录,通用方法封装,
缓存字段,通用正则匹配,关键词过滤,网络请求封装,基本公共服务,通用返回封装等

过客岛 gk-group
主要接口:过客岛,过客岛动态,过客岛回复,过客岛积分等
重点:Vert.x 异步 Socket 连接,Vert.x 权限验证,
Vert.x 的 eventBus 原理及使用,
Vert.x 与 Redis、MQ 等中间件的结合使用,通过 Aspect 和注解实现权限验证,
Spring-JPA 多数据源使用,多层 Redis 缓存实践,通过枚举实现默认设置

道具 gk-prop
重点:Vert.x 异步 Socket 连接,Vert.x 权限验证,
Vert.x 与 Redis,MQ 等中间件的结合使用,
通过Aspect和注解实现权限验证,Spring-JPA 多数据源使用

商城 gk-store
重点:支付及回调原理,微信支付,微信 H5 支付,支付宝支付,数据库事务一致性

运维

安全及升级 每三个月做一次系统升级并重启。云服务器厂商也会不定期的发布危险预警,根据需要修复安全漏洞即可。
Https 证书 通过 Let's Encrypt 官方的 acme 工具可以免费生成泛域名证书(这里以 fewper.com 为例),目前只支持到二级域名,而且最多只能申请到90天有效期的证书。

# 安装 acme.sh
curl  https://get.acme.sh | sh
# 申请阿里云 Accesskey
export Ali_Key="xxx"
export Ali_Secret="xxx"
# 申请证书
cd ~/.acme.sh/
acme.sh --issue --dns dns_ali -d *.fewper.com 
-d fewper.com --keylength ec-256

创业路上,感谢有你