Ahezime Introduction
关于 Ahezime
Ahezime.com是一个用户可以在上面写博客和发帖分享知识、传播正能量的博客和社区平台网站。 平台前端基于响应式布局设计开发,能同时自适应PC端和移动端。
PC首页显示
移动设备首页显示
注册 & 登录
为了能为用户便于使用平台和带来较好的体验,在使用平台前要先注册成为平台的用户,注册用户只需要一个您经常使用的有效电子邮箱。
注册
登录
平台
平台架构
总体架构
平台系统在一开始就基于微服务(Microservice)架构开发,将传统的单一系统解耦成多个服务,每个服务负责实现平台中特定的功能;并且,每个服务可以启动多个实例,为平台的稳定、高性能运行提供最基础的保障。
详细架构
平台由Nginx作为暴露在网络上的前端、平台API Gateway(API网关)、服务注册和服务发现中心(Agenble)、服务这几个大块组成。
Nginx
Nginx负责静态内容资源文件服务和整合HTTPS保护内容网络传输安全。
服务注册和服务发现中心Agenble
Agenble是自主开发的微服务注册和服务发现中心中间件。当服务进程启动后会主动注册到Agenble,Agenble在服务注册完成后会发送TCP连接请求来做服务健康检查(Health Check),当检测到服务不在线时,主动移除注册的服务,保证服务的可用性。已注册服务也会主动向Agenble发送心跳,当服务被Agenble移除后,Agenble会根据服务的心跳来确定是否注册服务。这样,Agenble和服务间的双向互动在最大程度上保证服务的高可用性。
平台API网关
负责反向代理(Reverse Proxy)、负载均衡(LB: Load Balancing)、Rate Limiting、权限验证和API统计分析等。
API网关提供反向代理和负载均衡的服务——API网关定时请求Agenble服务注册中心,拉取已注册服务的实时信息,当得知注册中心的服务发生变更时,及时更新本地缓存的服务信息,并根据服务发送给注册中的心跳信息,找到最优的服务为下次客户端请求服务,高效地响应客户端的请求。
平台状态
运行的服务状态
运行的服务实例的实时状态
Ahezime.com分前端网站和后端平台两部分。前端网站当前主要提供博客文章写作、社区互动和其他简单的信息查询。 后端平台主要提供用户的基本信息查看、修改和相应服务的复杂设置、分析,根据用户角色权限的不同决定用户可用的功能。后端平台尽量使用当前流行的新技术,使平台具备数据可视化,对繁杂的数据综合分析,进而做到化繁为简。
服务进程(服务实例)管理
为了实现服务进程生命周期的完全控制,自主研发ahzprocess服务进程管理工具。
服务进程管理工具系统服务状态
查看服务进程状态
代码示例
// Start service process :
func (ps *ProcessService) start(svc *ProcessService) (*os.Process, error) {
ps.Lock()
defer ps.Unlock()
logFile, err := os.OpenFile(svc.LogFilePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
logErrFile, err := os.OpenFile(svc.LogErrFilePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
svc.LogFile = logFile // put log file to process service
svc.LogErrFile = logErrFile
procAttr := &os.ProcAttr{
// Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
Files: []*os.File{nil, svc.LogFile, svc.LogErrFile},
Sys: &syscall.SysProcAttr{
Setpgid: true,
},
}
ip := network.GetOutboundIP().String()
// We obtain network port here to avoid port resource race condition.
port, err := network.ObtainAvailablePort(20000, 30000)
if err != nil {
log.Errorf("start process error, service name => %s, exiting...", svc.Name)
syscall.Kill(os.Getpid(), syscall.SIGKILL)
}
args := []string{svc.BinPath, svc.Name, ip, strconv.Itoa(port)}
log.Infof("start process of service %s", svc.Name)
proc, err := os.StartProcess(svc.BinPath, args, procAttr)
if err != nil {
log.Error(err)
svc.LogFile.Close()
svc.LogErrFile.Close()
if proc != nil {
proc.Kill()
return nil, err
}
}
svc.Process = proc
svc.StartTime = time.Now()
serviceMap[svc.Name] = svc
log.Info("process started")
return proc, nil
}
Dashboard
服务器状态监控
对服务器做了基本的硬件实时可视化状态监控,让运维人员能实时查看服务器的运行状态,及时对紧急情况做出响应。
平台安全
API访问频率控制
除了基本的状态监控,对于API攻击做了基本的访问频率控制,当用户恶意访问平台相关API时,如果超过设定的阀值,用户访问将会受到限制。
进入平台
如上图,登录后将鼠标悬停在首页的右上角用户头像上,弹出菜单,点击平台
即可。
平台首页
平台首页展示当前登录用户的基本信息和用户平台使用的关键信息。
修改个人信息
用户可以到设置->用户设置
来更新或完善用户信息。
用户主页
用户主页显示用户的简介信息,用户写作的博客文章、帖子和收藏。用户可以到平台->我的
管理我的主页
博客
博客首页
移动端显示效果
博客文章详情
移动端显示效果
写文章
用户可以自由在平台上写博客文章,文章内容为markdown格式,如果堆markdown格式不熟悉,可参考
英文 https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet
文章写作界面(显示相关设置)。
文章写作界面(隐藏相关设置)。
社区
社区为平台上用户间互动的最重要纽带,用户可以分享任何(法律范围内)想要分享的新闻、知识、经验等等。用户可以点赞、收藏、转发、评论社区帖子和回复其他用户。