创业吧,趁年轻!
告别了上一段的创业之旅,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
创业路上,感谢有你