- 微信公众号:【后端研发Marion】加微信进JAVA技术交流群
微信公众号 |
微信群(备注:加群) |
【Marion-Micro】
微服务模版框架
一、目标
1. 作为传统单体服务改造成微服务架构的模板项目
2. 参考目前主流的模板项目开发
3. 技术栈全面可插拔式引入网关、RPC、服务注册发现、链路追踪、ELK、监控告警、定时任务等
4. 多模块开发,领域驱动设计、设计模式
二、技术选型
1. 开发语言:JAVA / JDK11
2. 数据库:MySQL | Redis | ElasticSearch
3. 开发框架:SpringBoot
4. 开发工具:Gradle/Maven私服
5. 项目部署:Docker/Jinkens/K8s
6. 开源组件:SpringCloud Gateway | OpenFeign | Nacos | Apollo | Sentinel | Sleuth + Zipkin | ELK | XXL-Job | Kafka
7. 性能压测:Jemter | 全链路压测
三、项目结构
技术栈
- maven
- gitee
1. 目录设计
- 父模块定义
- 子模块定义
- 公用依赖和版本控制
- springboot版本
- 2.2.2.RELEASE
- lombok版本
- 1.8.22
- mysql驱动版本
- 8.0.21
- JPA版本或者Mybatis-Plus
- JPA-2.2.2.RELEASE
- redis版本
- 2.2.2.RELEASE
- spring-cloud版本
- Hoxton.SR1
- nacos注册中心版本
- 2.2.1.RELEASE
- nacos配置中心版本
- 2.2.1.RELEASE
- 微服务端口定义
- gatway:10000
- amin: 10010
- app: 10020
- web: 10030
- 公用模块-common
- 目的
- 管理每一个微服务公用的依赖、工具类、错误类、常量、验证错误,方便定位错误项目以及减少工具类的复制粘贴,微服务之间的RPC接口
- 依赖
- 父子模块依赖如何定义
- 父模块定义统一版本,子模块不需要声明版本
- 子模块定义
- 定义微服务公用的依赖
- 子目录
- RPC接口
- 工具类
- 错误类
- RPC接口类
- 优缺点
- 优点:统一管理
- 缺点:修改需要更新版本
- 核心模块-core
- 目的
- 参考Spring-Core设计思路,IO操作、反射操作
- 只有部分微服务项目依赖
- 子目录
- 核心工具类
- 分布式ID
- 加解密算法
- Jwt令牌
- 优缺点
- 优点:代码复用
- 缺点:新增需要发包,其他包可能不需要
- 网关模块-gateway
- 目的
- 鉴权、限流、负载均衡、统一入口、服务注册发现
- 技术选型-SpringCloud Gateway
- 问题
- 启动依赖报错问题,解决不兼容问题
- 依赖说明
- 集成nacos注册中心与配置中心
- 注册中心
- 添加依赖
- 在 application.properties 中配置 Nacos server 的地址
- server.port=8070
- spring.application.name=service-provider
- spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
- 配置中心
- web和webflux不能一起使用
- 添加依赖
- 配置nacos sever地址
- 定义配置名称
- @RefreshScope实现配置自动更新
- 测试配置是否生效
- 定义controller
- curl -X POST “http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true”
- 定义环境local/dev/prod
- 测试路由转发
- 转发报错:java.lang.NoClassDefFoundError: reactor/util/retry/Retry
- Hoxton.SR1和2.2.2
- 定义路由转发规则
- /admin -> marion-micro-admin
- 后台管理-admin
- 目的
- 前后端分离的后台管理项目Vue开发
- 依赖说明
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web mysql mysql-connector-java org.springframework.boot spring-boot-starter-data-jpa
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
org.springframework.boot spring-boot-starter-test test
- App接口-app
- 目的
- 提供给APP端接口
- 该模块可以拆分成多个微服务模块替换-api
- 依赖说明
- Web接口-web
- 目的
- 提供给Web端接口
- 依赖说明
- 公用模块
- 短信模块-sms
- 搜索模块-search
- 公用三方服务-third-party
2. 项目新建
- 新建springboot多模块项目,定义父子模块
3. 依赖管理
- 接入OpenFeign负载均衡
- web请求admin
- rpc请求错误:Could not extract response
- 加入依赖
- @EnableFeignClients
- 返回String成功
- 请求测试
- curl http://localhost:10030/rpc/user
- curl http://localhost:10030/rpc/user/vo
- 测试服务注册发现
- 赋值一个admin启动10011
- 停止10011
- 接入降级
- 接入Redis
- 测试Redis
- curl http://localhost:10030/redis/set?key=user&val=1
- curl http://localhost:10030/redis/get?key=user
- 接入链路追踪
- 加入依赖
- 启动zipkin
- 配置yml
- 定义日志
- 持久化到MySQL
- 接入Kafka消息中间件
- 接入ELK,做日志系统
- 接入Prometheus+Grafana监控告警
- 接入xxl-job分布式定时任务框架
四、代码设计
1. 全局异常定义与捕获,定义公共错误返回
- @RestControllerAdvice
- SpringBoot全局异常,返回JSON数据
- @ExceptionHandler
- 定义错误类ResponseException
- 自定义异常extends RuntimeException
- 定义400错误返回,200正常返回
- Junit5单元测试和MockMvc测试接口
- SpringBoot 测试及 MockMvc的使用
2. 整合swagger接口文档
- 【CSDN】java集成Swagger的详细步骤
- 总结错误 No mapping for GET /swagger-ui.html
- 什么是swagger,一篇带你入门
3. 配置线程池,异步线程池
- 【CSDN】springboot配置多个线程池
- SpringBoot 线程池 配置使用
- @EnableAsync
- 创建ThreadPoolTaskExecutor
- 线程池调优
4. 数据主从配置,Durid数据库连接池配置与监控
- 【github】Druid Spring Boot Starter
- maven配置阿里云镜像的两种方式
- druid监控配置
5. 数据库操作工具类,查询分页类公共库封装
6. 整理Kafka消息中间件
- 【CSDN】Springboot整合kafka
- kafka启动命令
- zookeeper-server-start -daemon /opt/homebrew/etc/kafka/zookeeper.properties & kafka-server-start /opt/homebrew/etc/kafka/server.properties
- kafka控制台创建topic
- kafka 命令行命令大全
- 查看topic
- kafka-topics --bootstrap-server :9092 topic --list
- 创建topic
- kafka-topics --bootstrap-server :9092 --create --replication-factor 1 --partitions 1 --topic demo
- 删除topic
7. 集成sentinel
- 参考文档
- sentinel
- 操作流程
- 启动sentinel命令:
- nohup java -server -Xms64m -Xmx256m -Dserver.port=8849 -Dcsp.sentinel.dashboard.server=localhost:8849 -Dproject.name=sentinel-dashboard -jar /opt/www/spring-cloud-alibaba/sentinel-dashboard/sentinel-dashboard-1.8.0.jar &
- 引入pom
- yml配置
- 控制台对接口限流测试
- 限流规则持久化
8. 集成Prometheus+Grafana实现监控告警
9. 集成xxl-job
- 参考资料
- XXL-JOB中文文档
- XXL-JOB的使用(详细教程)
- 操作流程
- 下载源码
- 创建数据库
- 启动后台
- 启动执行器
五、业务设计
1. 微服务模块拆分、领域驱动设计DDD
2. 数据库ER建模,代码生成器
六、数据中台
七、项目部署
1. 测试多模块打包
- 子模块不能加
- clean and package
- 运行测试
2. docker部署
3. 代码发布
- 发布到私服
- 2.发布到Gitee
4. Jinkens部署
5. K8S部署