spring cloud alibaba 项目从搭建到自动部署全部流程
环境
版本说明
Spring-Boot 2.2.5.RELEASE
Spring-Cloud Hoxton.SR3
Spring-Cloud-Alibaba 2.2.1.RELEASE
Java JDK1.8
组件
- 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 分布式任务调度(xxl-job-admin):提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
项目结构
业务模块结构:
-
项目名
-
一级模块
-
二级模块(实体类)
-
src目录
-
pom.xml(二级模块配置)
-
-
二级模块(提供服务)
-
src目录
-
pom.xml(二级模块配置)
-
-
pom.xml(一级模块配置)
-
-
pom.xml(主配置)
-
特殊模块:
- 项目名
- bom模块(第三方jar包统一管理)
- common(公共组件)
- gateway(网关)
maven环境配置
配置私服环境
本地的apache-maven-3.6.3安装路径下的/conf/settings.xml配置文件中配置如下:
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>releases</id>
<url>http://127.0.0.1:8080/repository/maven-releases/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<url>http://127.0.0.1:8080/repository/maven-snapshots/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>releases</id>
<url>http://127.0.0.1:8080/repository/maven-releases/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>snapshots</id>
<url>http://127.0.0.1:8080/repository/maven-snapshots/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
maven依赖关系
继承顺序从高到低: 主配置 >> bom配置 >> 一级模块配置 >> 二级模块配置
解决maven依赖重复依赖问题
首先在bom引入maven配置, 例如:
<properties>
<gson.version>2.8.5</gson.version>
</properties>
<dependencyManagement>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
</dependencyManagement>
再到需要引入gson包的服务pom配置文件中引入:
注意
- 不需要引入版本标签
- 避免冗余配置
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependencies>
maven打包
有三种打包方式:
- 一键打包所有模块, 并发布到私服, 执行顺序选择***-cloud(root): 运行clean, 再运行deploy
***-cloud(root) > clean > deploy
- 一级模块打包, 包括该模块对应的二级模块也一起打包, 并发布到私服
***-user > clean > deploy
- 二级模块打包
配置文件application.yml和bootstrap.yml
在bootstrap.yml文件中配置了端口, 环境, 应用名, dubbo相关配置, nacos注册中心和配置中心相关配置
application.yml中的配置都在配置中心配置了, 包括mysql, redis, mybatis plus, 日志等等
注册服务和服务发现
- 注册服务使用@Service注解, org.apache.dubbo.config.annotation.Service, 建议配合@Component注解一起使用
- 服务发现使用@Reference(check = false)注解, org.apache.dubbo.config.annotation.Reference, check=false表示运行服务不需要检查是否有服务提供者
如何查找对应服务的呢, 是根据上面两个注解中提供的参数配置和默认的环境配置关联的, 例如: version=1.0 则两边都要配置相同的参数值, group同理, 解决一对多接口实现方案
网关路由
统一请求路径格式 ip:port/api/v1/服务名前缀/*
监控,限流,降级和熔断
已经集成了sentinel组件, 默认所有接口都会限流, 请求的接口会在实时监控显示QPS和响应时间.
使用场景:
- 防止系统负载内存溢出, 可以通过限流平衡
- 特殊接口需要限流降级处理, 例如: 获取验证码接口, 一个用户,一分钟内只能获取一次
- 秒杀活动等, 需要限流请求访问的数量
- 限制爬虫频繁访问, 对IP或用户进行限流
动态配置规则:
- 在配置中心nacos, 持久化了配置规则, 同时可以动态修改配置规则
- 在sentinel dashboard, 修改规则暂时无法同步规则到配置中心, 但可以实现
限流和熔断后调用方法配置:
- 在controller类方法加上注解 @SentinelResource(value=“路由绝对路径(必须是唯一的值)”, blockHandler=“方法名”, blockHandlerClass= 类名)
- 上一步是埋点, 需要配置规则才能生效, 规则在配置中心配置
全局配置:
- BlockExceptionHandler 实现限流统一返回信息
- UrlCleaner 实现资源清洗, 对/getById/{id} 这样的URL, 需要配置返回为 /getById/*, 减少资源数量
自动化部署
使用jenkins配置并实现
同步执行步骤: 构建*** - 构建***-user-service(指定需要构建的服务模块)
说明
详细代码以后会附带上github链接, 见谅见谅