# lu-cloud-stack **Repository Path**: ShowLuu/lu-cloud-stack ## Basic Information - **Project Name**: lu-cloud-stack - **Description**: 一个万能的脚手架,分布式微服务、云服务、saas,多租户等等。这里有,成熟的解决方案,有趣的设计理念,丰富的技术组件,技术痛点的解决方案(横向对比)。 让小白快速上手; 让感兴趣的人了解架构设计的理念和技术细节; 让熟悉的人有额外收获; 沉淀、分享、成长,让自己和他人都能有所收获! - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-02-02 - **Last Updated**: 2023-09-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: SpringCloud ## README # 一、概述 ## 1.技术组件版本 | 技术组件 | 版本 | 描述 | | --------------------------- | -------------- | -------------- | | Java | 8 | | | MySql | 8 | | | Nacos | 2.1.2 | | | Sentinel | 1.8.5 | 待集成 | | Seata | 1.5.2 | 待集成 | | shardingsphere | | 分库分表待集成 | | Spring boot | 2.3.12.RELEASE | | | Spring cloud | Hoxton.SR12 | | | Spring cloud-alibaba | 2.2.9.RELEASE | | | Mybatis-plus | 3.3.0 | | | baomidou.dynamic.datasource | 2.5.4 | 多数据源待集成 | | Hutool | 5.5.8 | | | | | | ## 2.参考,软件项目版本 - **开发期** **--** **Alpha**(α):**预览版**,或者叫内部测试版;一般不向外部发布,会有很多Bug;一般只有测试人员使用。 **-- Beta**(β):**测试版**,或者叫公开测试版;这个阶段的版本会一直加入新的功能;在 Alpha版之后推出。 **-- RC**(Release Candidate):**最终测试版本**;可能成为最终产品的候选版本,如果未出现问题则可发布成为正式版本 - **完成期** -- **Stable**:**稳定版**;来自预览版本释出使用与改善而修正完成。 -- **GA**(General Availability):正式发布的版本;在国外都是用[GA](https://so.csdn.net/so/search?q=GA&spm=1001.2101.3001.7020)来说明**release版本**的。 -- **RTM**(Release to Manufacturing):给生产商的**release版本**;RTM版本并不一定意味着创作者解决了软件所有问题;仍有可能向公众发布前更新版本。 另外一种RTM的称呼是**RTW**(Release To Web),表示正式版本的软件发布到Web网站上供客户免费下载。 -- **RTL**(Retail):**零售版**;是真正的正式版,正式上架零售版。 - **其他表述** -- **OEM**(Original Equipment Manufacturer):原始设备制造商;是给计算机厂商随着计算机贩卖的,也就是**随机版**; 只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。 -- **RVL**:号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。 -- **EVAL**:而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。 ## 3.产品功能结构 ![产品功能结构图](./docs/images/产品功能结构图.jpg) ## 4.系统架构 ![系统架构设计](./docs/images/系统架构设计.png) ## 5.服务列表 | 服务名称 | 端口 | 说明 | | ------------------------------------------------- | ---- | ------------------------------------------------- | | lu-business | | 业务领域模块 | | lu-integrate | | 系统服务集成 | | **\|-** lu-integrate-gateway | 8088 | 微服务网关 | | **\|-** lu-integrate-message-center | 8003 | 消息中心 | | lu-component | | 公共组件库SDK | | **\|-** lu-component-rpc-proxy | | rpc代理请求框架 | | **\|-\|-** lu-component-http-proxy | | 基于http SDK | | **\|-\|-** lu-component-grpc-proxy | | 基于netty SDK | | **\|-\|-** lu-component-rpc-spring-boot-starter | | 与springboot集成 | | **\|-\|-** lu-component-rpc-spring-cloud-starter | | 与springcloud集成,基于服务注册中心的负载均衡请求 | | lu-stack | | 研究中 | | **\|-** lu-stack-nacos | 8001 | A业务领域 | | **\|-** lu-stack-common | | A业务领域模型 | | **\|-** lu-stack-api | 8002 | B业务领域 | | **\|-** lu-stack-rpc-proxy | | rpc代理请求框架 | # 二、核心组件搭建 ## 1.Nacos注册中心配置中心 ### (1).服务端安装 - [下载](https://github.com/alibaba/nacos/releases/tag/2.2.0) ### (2).集群部署 #### 1>. 配置 - [集群配置][集群配置] - [mysql初始化脚本][mysql初始化脚本],创建database `lu_cloud_stack_nacos_config` - [application.properties配置][application.properties配置],增加了mysql持久化配置 `line-index:33~43` #### 2>.集群启动 ```shell 28844 启动 sh soft/nacos2.1.2-28844/bin/startup.sh 查看日志 tail -f soft/nacos2.1.2-28844/logs/start.out 关闭 sh soft/nacos2.1.2-28844/bin/shutdown.sh 28846 启动 sh soft/nacos2.1.2-28846/bin/startup.sh 查看日志 tail -f soft/nacos2.1.2-28846/logs/start.out 关闭 sh soft/nacos2.1.2-28846/bin/shutdown.sh 28848 启动 sh soft/nacos2.1.2-28848/bin/startup.sh 查看日志 tail -f soft/nacos2.1.2-28848/logs/start.out 关闭 sh soft/nacos2.1.2-28848/bin/shutdown.sh sh soft/nacos2.1.2-28844/bin/startup.sh; sh soft/nacos2.1.2-28846/bin/startup.sh; sh soft/nacos2.1.2-28848/bin/startup.sh; sh soft/nacos2.1.2-28844/bin/shutdown.sh; sh soft/nacos2.1.2-28846/bin/shutdown.sh; sh soft/nacos2.1.2-28848/bin/shutdown.sh; sh soft/nacos2.2.0-28844/bin/shutdown.sh; sh soft/nacos2.2.0-28846/bin/shutdown.sh; sh soft/nacos2.2.0-28848/bin/shutdown.sh; curl -X POST 'http://192.168.192.4:28848/nacos/v1/auth/login' -d 'username=equity-market-dev-admin&password=111111'; http://49.65.123.31:8088/staticImg/equitymarket/itemmedia/20230306100210_602707.jpg curl -X GET 'http://127.0.0.1:28848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJlcXVpdHktbWFya2V0LWRldi1hZG1pbiIsImV4cCI6MTY3Nzg0MzM2NX0.wCzCmxjyZ3lzsKsGPwZt7F8G6Hr9MJ_tY8X58fM8MwI&dataId=equity-market-shared.yml&group=dev&tenant=8e3477d3-dd1c-4cf2-99d5-f4698f0a5337' ``` #### 3>.管理端 - 访问链接:http://127.0.0.1:28848/nacos - 初始账号:`nacos`,密码:`nacos` - [开启服务端管理鉴权](https://nacos.io/zh-cn/docs/v2/guide/user/auth.html) `修改application.properties配置文件nacos.core.auth.enabled=true` - 禁用tomcat日志,`修改application.properties配置文件server.tomcat.accesslog.enabled=false` #### 4>.FAQ - 异常`org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grpcSdkServer': Invocation of init method failed; nested exception is java.io.IOException: Failed to bind` [参考-新版本部署](https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-compatibility.html),实际上是部署时,grpc自动偏移启动的端口与操作系统冲突了 ### (3).SpringBoot客户端开发 #### 1>.约定 - 环境规约 - dev:开发环境 - 默认,不启动注册中心,开发可以连接测试环境的应用服务 - 若本地需要启动很多项目调试,也可以通过修改[lu-cloud.stack.pom文件](./pom.xml),`dev -> spring.cloud.alibaba.nacos.discovery.register.enabled=true`,以ip分组,加入注册中心 - test:测试环境,开启注册中心 - prod:生产环境,开启注册中心 #### 2>.配置 - [pom](./lu-stack/lu-stack-nacos/pom.xml) - bootstrap.yml - springboot配置的加载顺序:`bootstrap -> application -> application-${env}` - nacos配置加载顺序 `A.编码 - 修改[`NacosServiceRegistry`源码](/lu-stack/lu-stack-common/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java),应用服务注册中心以ip分组组,核心代码如下 ```java /** * 自定义策略 */ String registerEnabled = SpringUtil.getProperty("spring.cloud.nacos.discovery.register-enabled"); String active = SpringUtil.getProperty("spring.profiles.active"); if (ObjectUtil.isNotEmpty(active) && active.equalsIgnoreCase("dev") && ObjectUtil.isNotEmpty(registerEnabled) && registerEnabled.equalsIgnoreCase("true")) { group = HostNameUtil.getIp() + "@" + active; nacosDiscoveryProperties.setGroup(group); } ``` ## 2.openfeign负载均衡与降级熔断 ### (1).概述 - [openfeign](https://docs.spring.io/spring-cloud-openfeign/docs/2.2.9.RELEASE/reference/html/index.html)负责rpc调用,负载均衡 - openfeign支持三种[断路器](https://blog.csdn.net/lizz861109/article/details/103581742),分别是`sentinel、Resilience4j(spring官网推荐)、hystrix`,本架构采用hystrix,后续集成sentinel ### (2).配置 - 开启feign客户端`@EnableFeignClients(basePackages = {"com.lu.stack"})` - yml中配置openfeign和hystrix,这里将其放入了nacos共享配置中`lu-cloud-stack.yml` - 编写[FeignClient服务](./lu-stack/lu-stack-common/src/main/java/com/lu/stack/nacos/feign/FeignArticleService.java) ### (3).优化方向 - openfeign 3.x版本以上支持动态刷新配置,后续通过编码实现 - yml配置梳理优化 - 集成sentinel管控 ## 3.网关Gateway ### (1)、概述 - 能力:动态路由、黑白名单、负载均衡、容灾切换、权限校验、签名校验、流量保护 - 技术细节:配置于nacos上且动态更新配置;全局过滤器-解析请求参数,自定义全局应用过滤器,编写业务(黑白名单、安全管控、流量保护等等);监控 ### (2)、约定 - 配置全部存于nacos上,且支持配置的动态刷新 - 是否需要开启访日志,用于监控,nginx可以做到更好的效果 - 网关请求访问超时时间全局固定的,不变 - 全局过滤器,处理通用的功能;自定义过滤器,处理应用的功能 - 自带的过滤器,根据需要再配置,因为是动态刷新,即开即用 - 是否需要开启统计监控 - 限流采用redis ### (3)、配置 - nacos配置文件 `lu-stack-gateway.yml` - [nacos动态配置](./lu-core/lu-stack-gateway/src/main/java/com/lu/stack/gateway/config/NacosDynamicRouteService.java) - [全局请求处理过滤器](./lu-core/lu-stack-gateway/src/main/java/com/lu/stack/gateway/filter/global/LogGlobalFilter.java):body参数解析 - [自定义全局过滤器](./lu-core/lu-stack-gateway/src/main/java/com/lu/stack/gateway/filter/factory/ApiGatewayFilterFactory.java):业务代码 ### (4)、功能型过滤器 #### 1>. [限流过滤器](./lu-core/lu-stack-gateway/src/main/java/com/lu/stack/gateway/filter/factory/CustomRequestRateLimiterGatewayFilterFactory.java) - 参考源码重新封装,对限流响应进行包装`org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory` - 基于 `config`配置,增加业务修饰,`支持了允许打印的日志级别` - 支持动态的切换限流key,目前集成了,`ip限流`和`uri限流` ## 4.XXL-JOB分布式定时任务 ### (1)、概述 - 单机部署 - 调度平台是一个jar服务,执行器需要引入到业务代码里,这里全部采用http调用的方式 - 调度平台与执行器都写到xxl-job-admin中 ### (2)、配置 #### 1>.基础搭建 - 获取源码: - [远程地址](https://www.xuxueli.com/xxl-job/) - [本地位置](/reference/xxl-job-2.3.1.zip) - [db初始化](./reference/xxl-job-2.3.1/doc/db/tables_xxl_job.sql) #### 2>.xxl-job-admin配置改造 - [修改application.properties](./reference/xxl-job-2.3.1/xxl-job-admin/src/main/resources/application.properties),`数据库配置,端口配置,日志文件地址` #### 3>.服务端客户端一体化改造 - [修改application.properties](./reference/xxl-job-2.3.1/xxl-job-admin/src/main/resources/application.properties),`自定义配置-配置执行调度服务端` ```yaml ### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; xxl.job.admin.addresses=http://127.0.0.1:${server.port}${server.servlet.context-path} ### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 xxl.job.executor.appname=xxl-job-executor-talent-operation-lt ### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 xxl.job.executor.address= xxl.job.executor.ip= ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; xxl.job.executor.port=9999 ### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; xxl.job.executor.logretentiondays=30 ``` - `xxl.job.executor.appname`必须配置对应上,否则不会通过`xxl.job.admin.addresses`自动注册 #### 4>.跨平台Http任务开发&源码集成 - `xxl-job-core`源码改造,增加执行器上下文参数`triggerParam`,http请求读取超时时间 - [XxlJobContext](./reference/xxl-job-2.3.1/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java) - [JobThread](./reference/xxl-job-2.3.1/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java) - [http执行器开发](./reference/xxl-job-2.3.1/xxl-job-admin/src/main/java/com/xxl/job/admin/core/client/HttpRequestHanlder.java),接收三个参数 - url - method - data,请求参数 ```shell url: http://127.0.0.1:8002/test/t4 method: get | post data: ``` #### 5>.验证 - 创建任务,选择好执行器 - `JobHandler`写死这个值`httpJobHandler` - 配置任务参数,url、method、data - 配置任务调度,业务读取超时时间... ## 5.skywalking分布式链路追踪 ### (1)、apm分析平台和应用程序性能管理系统平台 #### 1>.快速开始 - h2内存数据库启动 ```shell sh soft/skywalking/skywalking-apm-9.1.0/bin/startup.sh tail -f soft/skywalking/skywalking-apm-9.1.0/logs/skywalking-oap-server.log sh skywalking/skywalking-apm-8.3.0/bin/startup.sh tail -f skywalking/skywalking-apm-8.3.0/logs/skywalking-oap-server.log ``` ### (2)、java-agent # 三、应用集成开发 # 四、拓展开发调研 ## 1.Mybatis-plus代码生成插件 - [功能概述 ](https://gitee.com/kancy666/mybatisplus-plugin/tree/master) [idea插件安装包](./soft/idea-plugins/mybatisplus-plugin-v0.0.3.zip) - 可以根据源码获取参数上下文,自定义freemark模版 # 联系我 ###### 沉淀、分享、成长,让自己和他人都能有所收获!你也可以添加本站作者小卢哥的微信 —— 加入作者技术交流群 ###### ![image-20230202153028332](./docs/images/wx.jpg) [集群配置]: ./soft/nacos2.1.2/conf/cluster.conf [mysql初始化脚本]: ./soft/nacos2.1.2/conf/mysql-schema.sql [application.properties配置]: ./soft/nacos2.1.2/conf/application.properties