/sams

SpringCloud Alibaba Micro Service System.

Primary LanguageTypeScriptMIT LicenseMIT

SAMS

Sams System (Springcloud Alibaba Micro Service) 是一个基于 SpringCloud Alibaba 搭建的微服务框架,本框架旨在帮助大家学习以及在搭建微服务系统时提供参考。

Star Fork Star Fork Language License Author

一、介绍

目前计划的功能并没有完全实现,将会持续更新。也欢迎有兴趣的朋友一起参与提交代码。 如果你觉得此项目有价值,请给我点个star,谢谢!

项目地址:https://github.com/bestaone/sams

1、目录结构

├─doc                   文档目录,架构设计、数据库设计...
├─cicd                  持续集成文件及脚本
├─apisvc-auth           认证授权业务服务
├─apisvc-mall           MALL业务服务
├─apisvc-oms            OMS(Operation Manager System)运营管理系统
├─basic-beans           通用Bean模块,API参数基类、数据实体类基类
├─basic-common          全局同样包
├─basic-core            核心包
├─basic-dependencies    基础的依赖管理
├─compsvc-gateway       网关服务
├─front-mall            MALL前端项目
├─microsvc-org          组织微服务
├─microsvc-user         用户微服务
├─starter-apisvc        业务服务的基础依赖模块,所有的业务服务都需要依赖此模块
├─starter-cache         缓存模块
├─starter-logger        日志模块
├─starter-microsvc      微服务的基础依赖模块,所有的微服务都需要依赖此模块
├─starter-mq            MQ模块
├─starter-mybatis       Mybatis模块,集成了Mybatis-plus
├─starter-pusher        推送模块,SMS、邮件、APP消息...
├─starter-route         路由模块,网关和业务服务需要依赖,微服务不需要,因为微服务不会去调用其他服务
├─starter-security      安全控制模块
├─starter-sequence      发号器模块,主键生成器
├─starter-swagger       Swagger文档模块
├─starter-utils         通用工具模块

2、功能

  • 这个项目可以帮助你快速的启动一个基于SpringCloud Alibaba技术栈的微服务框架搭建
  • 基于SpringCloud Gateway的网关系统,包括:认证、鉴权、路由、负载均衡、流控等
  • 基于AntDesignPro的登录,包括用户名密码登录、短信验证码登录,实现了图形验证码防刷功能
  • Nacos负责服务注册、配置管理
  • Sentinel负责流量控制、熔断降级、系统负载等多个维度保护服务的稳定性
  • Seata负责分布式事务管理
  • 前端使用了AntDesignPro框架,参考这个项目,你可以快速的开启集成开发
  • 基于 SpringBoot3 项目更容易集成到多个平台(K8S、Istio)
  • 演示了如何通过starter扩展功能(Doc、Route)
  • 演示了如何统一控制接口规范
  • 演示了如何规范异常处理
  • 演示了如何规范使用MybaitsMybatis-Plus、分页
  • 演示了单元测试、mock测试、测试数据回滚,包括对controller、service的测试
  • 项目分包明确,规范微服务的开发模式,使包与包之间的分工清晰
  • 链路追踪
  • ES日志管理

3、架构图(蓝色为计划实现,黄色为不打算实现)

4、功能截图

5、在线演示

二、快速启动

1、环境依赖

  • JDK 17
  • MySQL 8
  • Redis
  • NodeJS 16+
  • Yarn
  • Nacos 2.2.0
  • Sentinel 1.8.6
  • Seata 1.6.1
  • SpringBoot 3
  • SpringCloud 2022.0.0
  • SpringCloud Alibaba 2022.0.0.0

需要提前下载安装好以上内容

2、下载源码

>git clone https://github.com/bestaone/sams.git

3、创建数据库

在你的mysql8数据库中创建两个库sams_user、sams_org,并分别执行下面脚本:

sams\doc\db\sams_user.sql
sams\doc\db\sams_org.sql

4、安装配置Nacos

安装包安装 略...

Docker安装 推荐

docker run -d \
  -e MODE=standalone \
  -e JVM_XMS=256m -e JVM_XMX=256m \
  -e PREFER_HOST_MODE=hostname \
  -p 8848:8848 -p 9848:9848 -p 9849:9849 \
  --privileged=true \
  --restart=always \
  --name nacos-2.2.0 \
  nacos/nacos-server:v2.2.0

需要Nacos支持MySQL数据库,参考文档:Nacos使用

访问Nacos

http://127.0.0.1:8848/nacos
账密:nacos\nacos

导入配置

  • 进入nacos管理页面,在"命名空间"中创建命名空间sams
  • 配置管理->配置列表中,导入配置sams\doc\nacos\nacos_config_export.zip

5、安装部署Sentinel

下列两种方式任选一种

  • 下载Jar安装启动
>java -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8858 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
  • Docker安装启动
>docker run --name sentinel  -d -p 8858:8858 -p 8719:8719 -d  bladex/sentinel-dashboard:1.8.0

6、安装部署Seata

  • 创建数据库seata,导入数据doc/seata/seata-server-1.6.1.sqlseata库,导入doc/seata/seata-client-1.6.1.sqlsams_usersams_org
  • 直接部署【推荐】
#下载解压后,修改配置文件 seta-1.6.1/conf/application.yml
>cd seata-1.6.1
>./bin/seata-server.sh -h 127.0.0.1

参考 application.yml

  • Docker部署,支持自定义配置
#先启动容器
>docker run -d -p 8091:8091 -p 7091:7091  --name seata-serve seataio/seata-server:1.6.1
#将配置复制到宿主机
>docker cp seata-serve:/seata-server/resources /User/seata/config
#修改完配置,通过挂在目录的方式启动
>docker run -d --name seata-server -p 8091:8091 -p 7091:7091 -e SEATA_IP=127.0.0.1 -v /Users/zgs/Documents/install/seata-1.6.1/config/resources:/seata-server/resources seataio/seata-server:1.6.1 

如果是新手,建议用直接部署方式安装,因为Docker安装容易出现网络问题。 Docker安装的Seata,如果用的是远程Nacos,在注册到Nacos时,可能会使用Docker IP,从而导致网络不通。

参考地址:http://seata.io/zh-cn/docs/ops/deploy-by-docker.html

7、安装SkyWalking

  • 安装
# 启动服务端oap    
docker run --name oap -p 11800:11800 -p 12800:12800 -e TZ=Asia/Shanghai --restart always -d apache/skywalking-oap-server:9.3.0
# 启动UI端 
docker run --name oap-ui --link oap:oap -p 8989:8080 -e TZ=Asia/Shanghai -e SW_OAP_ADDRESS=oap:12800 --restart always -d apache/skywalking-ui:9.3.0

注:有时由于网络慢,网页会打不开,使用nginx反向代理下就行了(利用到了nginx的缓存加速)

  • 集成
java -javaagent:/agent/skywalking-agent.jar -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.158:11800 -DSW_AGENT_NAME=compsvc-gateway -jar /compsvc-gateway.jar
  • 日志 略

8、添加本地hosts配置

/etc/hosts文件中加入下列配置(Mac电脑)

xx.xx.xx.xx nacos-server
xx.xx.xx.xx redis-server
xx.xx.xx.xx mysql-server
xx.xx.xx.xx sentinel-server
#换成正确的IP

9、构建、启动

  • 构建
>cd sams
>mvn clean install
>cd front-mall
>yarn
  • 启动网关compsvc-gateway
>cd compsvc-gateway
>mvn spring-boot:run
  • 启动认证服务apisvc-auth
>cd apisvc-auth
>mvn spring-boot:run
  • 启动用户微服务microsvc-user
>cd microsvc-user/microsvc
>mvn spring-boot:run
  • 启动前端front-mall
>cd front-mall
>yarn start

10、测试验证

访问前端页面

http://127.0.0.1:8000

测试接口

  • 账号登录
>curl --location --request POST 'http://127.0.0.1:7070/apisvc-auth/api/open/auth/login/account' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "username": "admin",
    "password": "123456"
  }'
  
#返回结果
{
  "code":100000,
  "data":{
    "accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NzU1MDI3NzAsInN1YiI6IjY3ODkyMDUxOTc4MTE3MTIiLCJjcmVhdGVkIjoxNjc1NDkxOTcwOTUyfQ.SWddCcr1Se6e9lJUXlRJAfQr0zE27iNbSQs2AGwj5pY41O7vDVK6Wm11mbx86JfOBY05nTkl1hQ0S5DGQ3NQiA",
    "expireIn":10800,
    "refreshToken":"1589fea7f09f40e7af7713a4b570e8be"
  }
}
  • 获取登录用户信息
>curl --location --request POST 'http://127.0.0.1:7070/apisvc-auth/api/auth/currentUser' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NzU1MDI3MjAsInN1YiI6IjY3ODkyMDUxOTc4MTE3MTIiLCJjcmVhdGVkIjoxNjc1NDkxOTIwNTU2fQ.jHaUv6Pi48w6XXcX0rvU-8BxkGQF56hKWJDm3INdm091i8pMYacuAM6_Zkv9PxalhSgKhVlUURE9Ylr2D9RYCA'

#返回结果
{
    "code": 100000,
    "data": {
        "name": "admin",
        "avatar": "https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png"
    }
}
  • 获取短信验证码
>curl --location --request POST 'http://127.0.0.1:7070/apisvc-auth/api/open/auth/send/sms?phoneNum=13712345678'

#返回结果
{
    "code": 100000,
    "data": 244249
}
  • 短信验证码登录
>curl --location --request POST 'http://127.0.0.1:7070/apisvc-auth/api/open/auth/login/sms' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "phoneNum": "13712345678",
    "smsCode": "244249"
  }'

#返回结果
{
    "code": 100000,
    "data": {
        "accessToken": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NzU1MDM0OTgsInN1YiI6IjY3ODkyMDUxOTc4MTE3MTIiLCJjcmVhdGVkIjoxNjc1NDkyNjk4MDMwfQ.1bBFQ5G2Vl-xT880ecuUPfUSqaiNCv-q4_DlCJAIW1iU0FSk49sYHKjFJTdICOpwsOtHcxgHL20cTpltfMbHYA",
        "expireIn": 10800,
        "refreshToken": "f5e1912b338742f5aa7fafd4e50d62e0"
    }
}

accessToken即为访问接口的凭证

三、集成部署

1、Docker环境

  • 修改配置值 修改文件 sams/cicd/docker/start.sh
#将下列内容,换成你的ip
echo '192.168.0.158 nacos-server' >> /etc/hosts
echo '192.168.0.158 mysql-server' >> /etc/hosts
echo '192.168.0.158 redis-server' >> /etc/hosts
echo '192.168.0.158 sentinel-server' >> /etc/hosts
  • 构建镜像
#编译构建完后执行下列命令
>cd sams
>mkdir temp
>cp -rf ./front-mall/dist temp/
>cp -rf ./cicd/docker/* temp/
>cp ./apisvc-auth/target/apisvc-auth.jar temp/
>cp ./apisvc-mall/target/apisvc-mall.jar temp/
>cp ./compsvc-gateway/target/compsvc-gateway.jar temp/
>cp ./microsvc-user/user-microsvc/target/microsvc-user.jar temp/
>cp ./microsvc-org/org-microsvc/target/microsvc-org.jar temp/
>cd temp
>docker build -t sams:1.0 .
#完成后会生成镜像 sams:1.0
  • 启动运行
>docker run -d --name sams -p 10080:80 sams:1.0

四、授权协议

本项目执行 MIT 协议