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