项目作者: lomofu

项目描述 :
An Cloud Native application
高级语言: Vue
项目地址: git://github.com/lomofu/ben.git
创建时间: 2020-06-01T07:13:10Z
项目社区:https://github.com/lomofu/ben

开源协议:

下载


Ben

An cloud native application

一款云原生应用

简介

这是一个以排班推送为主要功能的管理saas应用,支持公告推送,排班推送,权限管理等。本应用意在探索云原生应用为软件开发带来的全新开发形式。同时对于微服务,devops等也有实践。

预览

首页

首页

登录

Ben.-登录

个人看板

APP.-个人看板

APP.-个人看板

我的排班

APP.-我的排班

团队管理

FireShot Capture 006 - APP. - 团队列表 - app.lomofu.com

项目详情

APP.-项目详情

排班管理

APP.-排班管理

APP.-排班管理1

设置中心

FireShot Capture 012 - APP. - 设置中心 - app.lomofu.com

暗黑模式

FireShot Capture 013 - APP. - 个人看板 - app.lomofu.com.png)

软件架构

微服务架构(前后端分离)

Ben 微服务架构

本应用采用的是微服务架构风格,同时开发模式也是前后端分离。前端由vue构建的,后端是由java和nodejs两种语言构建的服务。

云原生应用架构

Ben 云原生应用架构

技术清单

开发框架

  • Vue.js

  • Spring Boot

  • Spring Cloud中组件(Feign,Spring Cloud Gateway)

  • Koa2

应用服务

  • MySql

  • MongoDB

  • Redis

  • RocketMQ

  • Seata

  • ELK

运维服务

  • Docker

  • Kubernetes

  • Istio

  • Rancher

  • Jenkins

  • Sonar Qube

环境准备

由于本应用是云原生应用,所以支持一键部署到容器云环境,支持kubernetes环境。可以自行搭建kubernetes环境,或者借助云厂商的kubernetes环境。笔者这里以esc云服务器为基础硬件,同时搭建rancher来创建kubernetes环境进行。

硬件准备

这里给出我的硬件服务器配置,根据kubernetes以及rancher官方的推荐。单节点最低配置为 2 Core,运存最少4GB。

节点 配置 操作系统 Docker
Master 2Core 8GB 40GB Centos 7.6 18.6.3
Node1 4Core 8GB 40GB Centos 7.6 18.6.3
Node2 4Core 8GB 40GB Centos 7.6 18.6.3
Node3 2Core 4GB 40GB Centos 7.6 18.6.3

部署rancher

1 准备Linux主机

准备一台已安装64位Ubuntu 16.04或18.04的Linux主机(或其他Rancher所支持的Linux发行版),要求至少4GB内存。在该主机上安装Rancher支持的Docker版本

2 运行Server

在主机上执行以下Docker命令,完成Rancher的安装与运行:

  1. sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 -v <主机路径>:/var/lib/rancher/ rancher/rancher:stable

之后,打开浏览器,输入https://<安装容器的主机名或IP地址>,您即可以访问Rancher Server的UI了。跟随用户界面给您的引导,即可设置完成您的第一个Rancher集群。

创建Kubernetes集群

rancher已经将创建Kubernetes做的非常简单,只需要点击页面上的创建集群,根据选项最后生成的命令在每个节点的主机上运行即可。详情可以参考官方文档

其他环境准备

配置文件

因为采用docker容器的方式,所以需要提前构建好docker镜像并上传到镜像仓库。

Account服务

该服务由java编写,采用SpringBoot框架。account服务主要负责应用中账户,角色权限相关服务。对应代码为模块 account-apiaccount-svc

数据库

  • MySql

    创建ben_account数据库运行数据库脚本,位于db/account/ben_account.sql

  • MongoDB

    创建ben文档

分布式事务Seata

修改account-svc/src/main/resources/file.conf。这里修改的是seata中的事务管理器地址。

  1. service {
  2. vgroupMapping.ben-tx-group = "default"
  3. //这里改成你部署的seata事务管理器
  4. default.grouplist = "seata.seata:8091"
  5. enableDegrade = false
  6. disableGlobalTransaction = false
  7. }

分布式锁

修改account-svc/src/main/resources/redisson-对应环境-config.yml。需要注意的是,这里提供了两个环境的配置文件,如果你使用其中一个需要修改对应的环境的配置文件即可。

  1. singleServerConfig:
  2. # 你的redis服务地址
  3. address: "redis://redis:6379"
  4. # 对应的密码
  5. password: xxxx

Oss存储

本项目中oss主要用于头像存储功能,采用的是阿里云oss,如果无特殊需求,可以不用开启修改。

后续

只需要通过maven构建SpringBoot应用,并通过account-svc/Dockerfile 构建docker镜像即可。


Company服务

该服务由java编写,采用SpringBoot框架。company服务主要负责公司,团队,项目,消息相关服务。对应代码为模块 company-apicompany-svc

数据库

创建ben_company数据库运行数据库脚本,位于db/company/ben_company.sql

分布式事务Seata

修改company-svc/src/main/resources/file.conf。这里修改的是seata中的事务管理器地址。

  1. service {
  2. vgroupMapping.ben-tx-group = "default"
  3. //这里改成你部署的seata事务管理器
  4. default.grouplist = "seata.seata:8091"
  5. enableDegrade = false
  6. disableGlobalTransaction = false
  7. }

分布式锁

修改company-svc/src/main/resources/redisson-对应环境-config.yml。需要注意的是,这里提供了两个环境的配置文件,如果你使用其中一个需要修改对应的环境的配置文件即可。

  1. singleServerConfig:
  2. #你的redis服务地址
  3. address: "redis://redis:6379"
  4. #对应的密码
  5. password: xxxx

后续

只需要通过maven构建SpringBoot应用,并通过company-svc/Dockerfile 构建docker镜像即可。


Bot服务

该服务由java编写,采用SpringBoot框架。bot服务主要负责消息推送相关服务,与消息中间件对接。对应代码为模块 bot-apibot-svc

后续

只需要通过maven构建SpringBoot应用,并通过bot-svc/Dockerfile 构建docker镜像即可。


SMS服务

该服务由java编写,采用SpringBoot框架。SMS服务主要负责消息推送中短信发送的实现。对应代码为模块 sms-apisms-svc

需要注意的是,由于某些原因,应用在构建的时候采用了两家的短信服务。一家是京东短信,主要负责短信登录验证码的发送,或者登录错误次数过多的发送。另一个负责推送相关的发送。当然修改为统一一家也十分简单,位于com/ben/sms/service/impl/SmeServiceImpl.java这个类下,参考即可修改。

后续

只需要通过maven构建SpringBoot应用,并通过account-svc/Dockerfile 构建docker镜像即可。


www服务

该服务由Node.js编写,采用Koa2框架。www服务主要负责新账户的注册相关服务。对应代码为模块 www-svc

api调用

修改www-svc/config/env/对应环境.js

  1. api: {
  2. get accountSvcBaseApi() {
  3. return "http://account-svc:8080/api/accounts";
  4. },
  5. get botSvcBaseApi() {
  6. return "http://bot-svc:8080/api/bot";
  7. }
  8. }

如果api无特殊需求不建议修改,这里罗列出来方便查寻。寻址是通过kubernetes的服务发现。

MongoDB

修改www-svc/config/env/对应环境.js

  1. mongodb_config: {
  2. //你的mongodb地址
  3. connect: "mongodb://mongodb.mongodb:27017/ben"
  4. }

这里修改你的mongodb的连接地址

后续

只需要通过npm安装相关依赖,并通过www-svc/Dockerfile 构建docker镜像即可。


Mail服务

该服务由Node.js编写,采用Koa2框架。www服务主要负责邮件发送的具体实现。对应代码为模块 mail-svc

api调用

修改mail-svc/config/环境/EndPoint.js

  1. //这里修改为你前端对应的域名或者ip地址
  2. base: {
  3. get url() {
  4. //ex: https://www.lomofu.com
  5. return "域名/ip";
  6. }
  7. },
  8. register: {
  9. get url() {
  10. //ex: https://www.lomofu.com/register
  11. return "域名/ip/register";
  12. }
  13. },
  14. employee: {
  15. get url() {
  16. //ex: https://www.lomofu.com/employee
  17. return "域名/ip/employee";
  18. }
  19. },
  20. reset: {
  21. get url() {
  22. //ex: https://www.lomofu.com/reset
  23. return "域名/ip/reset";
  24. }
  25. }

smtp

修改对应你的smtp服务器用来发送邮件。位于mail-svc/config/SMTP.js

  1. get server() {
  2. //ex :163 支持的sevice名单 https://nodemailer.com/smtp/well-known/
  3. return "xxx";
  4. },
  5. get user() {
  6. //ex : example@example.com
  7. return "xxx@xxxx.com";
  8. },
  9. get pass() {
  10. //ex: 邮箱授权码 这里用base64加密后的
  11. return "xxxxx";
  12. },
  13. get logo() {
  14. //ex: 邮箱末尾的logo 如果你有http服务器可以填写相对应的logo地址
  15. return "xxxxx";
  16. }

token

这个是用来做服务验证的。位于mail-svc/config/Token.js

  1. get SECRET() {
  2. return "YzA0ODM3ZGY2MWYzNmJhNjg0NjYwOWFlNmI4MTQxZDg5NmQ5NmNiOGJkMjJiYzI1OTU3ZDBmY2ViMDYxNjY5NjIwOTkxYjQ5MDdkMzEzZWQ0NTY4MzRkY2YxNzJhZDA2NDMxNzEyMDc5MjUyOWExY2RkZjE4OGVjYTRlMDMzYWM="
  3. }

这里的密文对应着account 服务中的secret,当然不改也可以,暂时不启用该校验。

后续

只需要通过npm安装相关依赖,并通过mail-svc/Dockerfile 构建docker镜像即可。


前端

ben

这是未注册或未登录下的单页spa,位于frontend/ben下,是一个vue工程。

部署url

修改位于frontend/ben/.env.环境名

  1. //环境名
  2. VUE_APP_NAME="DEV"
  3. //app运行端口
  4. VUE_APP_PORT = 8080
  5. //app 未登录域名
  6. VUE_APP_URL = "http://www.lomofu.com"
  7. //app 已登录域名
  8. VUE_APP_CENTER = "http://app.lomofu.com"

https

上线需要https支持,所以修改frontend/ben/nginx.conf

  1. //如果需要https 开启
  2. listen 443 ssl;
  3. //服务名 ex: www.lomofu.com
  4. server_name xxxxx;
  5. ssl_session_timeout 5m;
  6. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  7. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  8. //ssl证书位置 ex:/usr/cert/xxxxxx.pem;
  9. ssl_certificate your certificate path;
  10. //ssl秘钥位置 ex:/usr/cert/xxxxxxx.key
  11. ssl_certificate_key your certificate path;
  12. ssl_prefer_server_ciphers on;

app

这是登录后的单页spa,位于frontend/app下,是一个vue工程。

部署url

修改位于frontend/ben/.env.环境名

  1. //环境名
  2. VUE_APP_NAME="DEV"
  3. //app运行端口
  4. VUE_APP_PORT = 8080
  5. //app 未登录域名
  6. VUE_APP_URL = "http://www.lomofu.com"
  7. //app 已登录域名
  8. VUE_APP_CENTER = "http://app.lomofu.com"
  9. //api 后端网关域名
  10. VUE_APP_GATEWAY="https://api.lomofu.com"

https

上线需要https支持,所以修改frontend/ben/nginx.conf

  1. //如果需要https 开启
  2. listen 443 ssl;
  3. //服务名 ex: app.lomofu.com
  4. server_name xxxxx;
  5. ssl_session_timeout 5m;
  6. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  7. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  8. //ssl证书位置 ex:/usr/cert/xxxxxx.pem;
  9. ssl_certificate your certificate path;
  10. //ssl秘钥位置 ex:/usr/cert/xxxxxxx.key
  11. ssl_certificate_key your certificate path;
  12. ssl_prefer_server_ciphers on;

Kubernetes部署文件

部署这里推荐使用rancher的可视化界面完成,非常简单

rancher控制界面

部署文件参考位于k8s/test

ConfigMap

为了更好配置和管理应用的配置,采用的是configmap统一管理,通过环境变量注入

configmap配置

需要configmap支持的服务的配置文件位于k8s/test/config下,该文件中用xxxxxxx的都需要修改

例如:k8s/test/config/bot-config.yaml

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: bot-config
  5. data:
  6. UNDERTOW_IO_THREADS: 8
  7. UNDERTOW_WORKER_THREADS: 64
  8. UNDERTOW_BUFFER_SIZE: 1024
  9. UNDERTOW_MAX_POST: 1000
  10. MAIL_SERVICE_ENDPOINT: http://mail-svc:3001
  11. ASYNC_CORE_POOL: 10
  12. ASYNC_MAX_POOL: 30
  13. ASYNC_QUEUE_CAPACITY: 100
  14. ASYNC_WAIT_FOR_COMPLETE: true
  15. ASYNC_KEEP_ALIVE: 60
  16. #redis host ex: redis-proxy-nlb.jvessel-open-sh.jdcloud.com
  17. REDIS_HOST: xxxxxxx
  18. REDIS_PORT: 6379
  19. REDIS_TIMEOUT: 3000
  20. #redis password
  21. REDIS_PASSWORD: xxxxxxx
  22. #go easy websocket host 参考:https://www.goeasy.io/
  23. WEBSOCKET_HOST: http://rest-hangzhou.goeasy.io/publish
  24. #go easy key
  25. WEBSOCKET_KEY: BC-696d48c8c9794fb6a2ad85230c12365a
  26. #rocketmq 服务器地址
  27. ROCKETMQ_NAME_SERVER: xxxxxxx
  28. #rocketmq 组 可自行配置 ex:bot-producer-dev
  29. ROCKETMQ_GROUP: xxxxxxx

Istio

如果启用服务网格进行服务治理,请务必确认单节点配置不得2core,4GB否则会安装失败。istio的配置文件位于k8s/test/mesh下。

注意:

这里给出的配置文件仅为参考,我在本应用中主要配置了ben,app,gateway三个mesh配置。如果其余服务想要通过mesh治理,参考配置即可。

流量拓扑图

Kiali-Console

指标监控

Grafana

后续

本应用属于本人毕设作品,因服务器原因,在部分情况没有考虑hpa。但是都可以参考kubernetes的网上资料进行部署。关于devops相关实践,稍后会在这里更新。