一.项目基本介绍
1.功能架构:平台主要业务如下
功能解释
1.管理功能:组织机构管理,角色管理,权限管理,数据字典,系统设置,后台登录。
2.用户中心:VIP购买,个人中心,实名认证,资料完善。
3.认证中心:统一认证授权中心,前后台用户统一登录。
4.文件管理: 分布式文件管理中心,基于OSS对象存储。
5.课程中心:讲师管理,课程管理,文件上传,课程发布,课程下架。
6.媒体数据:视频分片上传,云服务器推流,视频云点播。
7.消息系统:短信消息,邮件发送,站内信,系统消息,广告消息。
8.订单中心:VIP购买下单,课程购买下单,账户充值下单。
9.支付系统:支付宝支付,微信支付
10.课程秒杀:秒杀课程发布,课程秒杀
2.应用划分
项目分为:管理端,门户端,移动端
二.项目架构设计
1.应用架构
项目采用主流的前后端分离
模式,前端分为:系统管理前端,门户前端
2.技术栈
1.系统管理前端:Node.js,Vue.js,Npm,WebPack,Vue Cli ,Element UI ,Easy Mock等等。
2.门户网站前端:Html ,css,js ,jquery等等。
3.后端采用微服务架构:按照功能拆分N多个服务,每个服务可以独立技术选型,独立开发,独立部署,独立运维.,单个服务使用基于ssm的springboot,服务间通过spring cloud协调.技术包括:
SpringCloud/Alibaba(Eureka/Nacos,Zuul/Gateway,Config/Nacos,Feign,Hystrix/Sentinel,Seluth,Zipkin) + MyBatisPlus + SpringBoot + SpringMVC + Velocity
数据存储:Mysql + Redis + Alicoud OSS + ElasticSearch +RocketMQ
运维方面:阿里云服务器,Docker,Jenkins,K8S等等
日志收集:Logstash + ElasticSearch + Kibana [二期]
监控报警:Metrics + Prometheus + Grafana +Aalertmanager [二期]
3.项目架构
项目架构图
架构说明
负载层 : Nginx+lvs
网关 : Spring Cloud Gateway
服务通信 : OpenFeign
服务熔断&降级&限流 :Sentinel
服务发现&配置管理:Nacos
链路追踪 : Zipkin+Seluth
认证授权:Security+Oauth2+JWT
日志收集: ELK
分布式缓存:Redis
消息队列:RocketMQ
全文搜索:ElasticSearch
CI/DI :jenkins+docker+k8s
三.项目架构搭建
1.项目规划
1.1.服务划分
后端服务
服务名 | 端口 | 备注 |
---|---|---|
ymcc-service-gateway | 10010 | 服务网关 |
ymcc-service-system | 10020 | 管理中心 |
ymcc-service-user | 10030 | 用户中心 |
ymcc-service-uaa | 10040 | 认证授权 |
ymcc-service-course | 10050 | 课程中心 |
ymcc-service-file | 10060 | 媒体数据 |
ymcc-service-media | 10070 | 文件管理 |
ymcc-service-search | 10080 | 搜索服务 |
ymcc-service-message | 10090 | 消息服务 |
ymcc-service-order | 10100 | 订单中心 |
ymcc-service-pay | 10110 | 支付中心 |
ymcc-service-kill | 10120 | 秒杀服务 |
前端服务
服务名 | 端口 | 备注 |
---|---|---|
ymcc-ui-system | 6001 | 系统管理前端 |
ymcc-ui-course | 6002 | 门户课程站点 |
ymcc-ui-user | 6003 | 门户用户站点 |
1.2.项目结构
【特别注意
】项目搭建完成之后做如下检查
项目采用pom父子模块进行构建,在一级pom中管理springboot和springcloud依赖以及公共依赖
二级不做pom管理,不导入任何依赖
三级导入项目本身需要的依赖
一级和二级的pom的packaging应该是pom,三级的packaging应该是jar
2.Cloud基础服务
2.1.父项目
父项目负责聚合子项目,以及管理依赖,具体pom如下
<!--打包方式:pom,代表这个项目只是做pom管理,不写代码-->
<packaging>pom</packaging>
<!--公共的一些配置-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<ymcc.version>1.0-SNAPSHOT</ymcc.version>
</properties>
<!--SpringBoot-->
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--SpringCloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--公共的依赖-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.50</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
2.2.网关(gateway)搭建
1.导入依赖(gateway网关、nacos-discovery服务发现、nacos-config配置管理)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.启动类
增加:@EnableDiscoveryClient 注册到Nacos
3.yml配置
server:
port: 11000
spring:
application:
name: service-user #服务名
cloud: #注册到Nacos
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: false #开放服务名访问方式
lower-case-service-id: true #服务名小写
routes: #路由配置
- id : application-user #指定服务名
uri: lb://service-user #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/user/** #服务访问路径
filters:
- StripPrefix=2
- id: application-uaa #指定服务名
uri: lb://service-uaa #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/uaa/** #服务访问路径
filters:
- StripPrefix=2
- id: application-course #指定服务名
uri: lb://service-course #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/course/** #服务访问路径
filters:
- StripPrefix=2
- id: application-system #指定服务名
uri: lb://service-system #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/system/** #服务访问路径
filters:
- StripPrefix=2
- id: application-search #指定服务名
uri: lb://service-search #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/search/** #服务访问路径
filters:
- StripPrefix=2
- id: application-pay #指定服务名
uri: lb://service-pay #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/pay/** #服务访问路径
filters:
- StripPrefix=2
- id: application-order #指定服务名
uri: lb://service-order #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/order/** #服务访问路径
filters:
- StripPrefix=2
- id: application-media #指定服务名
uri: lb://service-media #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/media/** #服务访问路径
filters:
- StripPrefix=2
- id: application-kill #指定服务名
uri: lb://service-kill #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/kill/** #服务访问路径
filters:
- StripPrefix=2
- id: application-common #指定服务名
uri: lb://service-common #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/ymcc/common/** #服务访问路径
filters:
- StripPrefix=2
globalcors: #跨域配置
cors-configurations:
'[/**]':
allowedOrigins: "*"
allow-credentials: true
allowed-headers: "*"
allowedMethods:
- GET
- POST
- DELETE
- PUT
- PATCH
- OPTIONS
- HEAD
- CONNECT
- TRACE
#允许Bean覆盖
main:
allow-bean-definition-overriding: true
2.4.Nacos配置中心
1.Nacos控制台创建配置文件
2.创建bootstrap.yml
spring:
main:
allow-bean-definition-overriding: true
profiles:
active: dev
application:
name: service-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #注册中心
config:
server-addr: localhost:8848 #配置中心
file-extension: yaml #配置文件格式
prefix: application-gateway #配置前缀 ,默认使用sring.application.name
group: DEFAULT_GROUP
2.5.基础模块
创建基础模块ymcc-basic-common,拷贝BaseQuery,JSONResult,PageLis 到模块中