谷粒商城笔记合集
四、整合 SpringCloud Alibaba
4.1 简介
4.1.1 概述
Github:https://github.com/alibaba/spring-cloud-alibaba
Github中文文档:https://github.com/alibaba/spring-cloud-alibaba/tree/2021.x/spring-cloud-alibaba-docs/src/main/asciidoc-zh
Github入门案例:https://github.com/alibaba/spring-cloud-alibaba/tree/2021.x/spring-cloud-alibaba-examples
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
4.1.2 为什么要使用 ?
SpringClouid的痛点
- SpringCloud部分组件停止维护和更新,给开发带来不便;
- SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
- SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba的优势
- 阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
- 成套的产品搭配完善的可视化界面给开发运维带来极大的便利
- 搭建简单,学习曲线低。
结合SpringCloud Alibaba我们最终的技术搭配方案
- SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册)
- SpringCloud Alibaba- Nacos: 配置中心 (动态配置管理)
- SpringCloud - Ribbon: 负载均衡
- SpringCloud - Feign: 声明式HTTP客户端(调用远程服务)
- SpringCloud Alibaba - Sentinel: 服务容错(限流、降级、熔断)
- SpringCloud - Gateway: API 网关 (webflux 编程模式)
- SpringCloud - Sleuth:调用链监控
- SpringCloud Alibaba - Seata: 原Fescar, 即分布式事务解决方案
4.1.3 版本选择
如何建造
https://github.com/alibaba/spring-cloud-alibaba/tree/2.2.x
- 2020.0 分支:对应 Spring Cloud 2020 & Spring Boot 2.4.x。支持 JDK 1.8 或更高版本。
- master 分支:对应 Spring Cloud Hoxton & Spring Boot 2.2.x。支持 JDK 1.8 或更高版本。
- greenwich 分支:对应于 Spring Cloud Greenwich & Spring Boot 2.1.x。支持 JDK 1.8 或更高版本。
- finchley 分支:对应于 Spring Cloud Finchley & Spring Boot 2.0.x。支持 JDK 1.8 或更高版本。
- 1.x分支:对应Spring Cloud Edgware & Spring Boot 1.x,支持JDK 1.7及以上版本。
版本控制指南
https://github.com/alibaba/spring-cloud-alibaba/tree/2.2.x
项目版本号的形式为xxx,x为数字,从0开始,不限于0~9范围。当项目处于孵化器阶段时,版本号为0.xx
由于 Spring Boot 1 和 Spring Boot 2 的接口和注解在 Actuator 模块中发生了较大的变化,spring-cloud-commons 从 1.xx 到 2.0.0 也发生了较大的变化,因此我们采用相同的版本规则SpringBoot 版本号。
- 1.5.x 用于 Spring Boot 1.5.x
- 2.0.x 用于 Spring Boot 2.0.x
- 2.1.x 用于 Spring Boot 2.1.x
- 2.2.x 用于 Spring Boot 2.2.x
- 2020.x 用于 Spring Boot 2.4.x
版本说明
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
由于 Spring Boot 2.4+ 和以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 2.4 为分界线,同时维护 2.2.x 和 2021.x 两个分支迭代。 为了规避相关构建过程中的依赖冲突问题,我们建议可以通过 云原生应用脚手架 进行项目创建。
-
2021.x 分支
适配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记): (注意,该分支 Spring Cloud Alibaba 版本命名方式进行了调整,未来将对应 Spring Cloud 版本,前三位为 Spring Cloud 版本,最后一位为扩展版本,比如适配 Spring Cloud 2021.0.1 版本对应的 Spring Cloud Alibaba 第一个版本为:2021.0.1.0,第个二版本为:2021.0.1.1,依此类推)
Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version 2021.0.4.0* Spring Cloud 2021.0.4 2.6.11 2021.0.1.0 Spring Cloud 2021.0.1 2.6.3 2021.1 Spring Cloud 2020.0.1 2.4.2 -
2.2.x 分支
适配 Spring Boot 为 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version 2.2.9.RELEASE* Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2.2.8.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2.2.7.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2.2.6.RELEASE Spring Cloud Hoxton.SR9 2.3.2.RELEASE 2.2.1.RELEASE Spring Cloud Hoxton.SR3 2.2.5.RELEASE 2.2.0.RELEASE Spring Cloud Hoxton.RELEASE 2.2.X.RELEASE 2.1.4.RELEASE Spring Cloud Greenwich.SR6 2.1.13.RELEASE 2.1.2.RELEASE Spring Cloud Greenwich 2.1.X.RELEASE 2.0.4.RELEASE(停止维护,建议升级) Spring Cloud Finchley 2.0.X.RELEASE 1.5.1.RELEASE(停止维护,建议升级) Spring Cloud Edgware 1.5.X.RELEASE -
组件版本关系
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示(注意,Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进):
Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version 2.2.9.RELEASE 1.8.5 2.1.0 4.9.4 ~ 1.5.2 2021.0.4.0 1.8.5 2.0.4 4.9.4 ~ 1.5.2 2.2.8.RELEASE 1.8.4 2.1.0 4.9.3 ~ 1.5.1 2021.0.1.0 1.8.3 1.4.2 4.9.2 ~ 1.4.2 2.2.7.RELEASE 1.8.1 2.0.3 4.6.1 2.7.13 1.3.0 2.2.6.RELEASE 1.8.1 1.4.2 4.4.0 2.7.8 1.3.0 2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE 1.8.0 1.4.1 4.4.0 2.7.8 1.3.0 2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE 1.8.0 1.3.3 4.4.0 2.7.8 1.3.0 2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE 1.7.1 1.2.1 4.4.0 2.7.6 1.2.0 2.2.0.RELEASE 1.7.1 1.1.4 4.4.0 2.7.4.1 1.0.0 2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE 1.7.0 1.1.4 4.4.0 2.7.3 0.9.0 2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE 1.6.3 1.1.1 4.4.0 2.7.3 0.7.1
4.1.4 项目中的依赖
https://spring.io/projects/spring-cloud-alibaba#overview
本工程使用的版本搭配:Spring cloud Greenwich.SR3、Spring Cloud Alibaba 2.1.0.RELEASE、Spring Boot 2.1.8.RELEASE
在 公共服务 中引入 Spring Cloud Alibaba 2.1.0.RELEASE
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4.2 Nacos [作为注册中心]
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,他是使用 java 编写的,需要依赖 java 环境
4.2.1 配置服务注册
Nacos 入门案例文档:https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md
服务注册:以优惠卷服务为例,其他服务自行注册
-
修改云服务器安全组开放对应端口、关闭云服务器内部防火墙(systemctl stop firewalld)
-
下载安装 Nacos:https://github.com/alibaba/nacos/releases
注意对应版本为:1.1.3
[root@tencent bin]# tar -zxvf nacos-server-1.1.3.tar.gz
-
启动 Nacos:注意需要先安装jdk
[root@tencent bin]# sh startup.sh -m standalone
-
在公共服务中引入依赖
<!-- Spring Cloud Alibaba-Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在对应服务中注册 Nacos discovery:修改配置文件 application.yaml
spring: cloud: nacos: discovery: server-addr: 114.132.162.129:8848 #nacos地址 application: name: bilimall-coupon #服务名
-
在对应服务中开启服务注册发现功能,在 bilimall-coupon 的主启动类上添加注解:
@EnableDiscoveryClient
-
启动并查看服务:访问 http://114.132.162.129:8848/nacos
初始用户名 nacos、初始密码 nacos
4.2.2 配置远程调用
以用户服务调用优惠卷服务为例
-
调用方引入依赖
<!-- OpenFeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
在 优惠卷服务(被调用方) 中编写可供调用的测试接口
/** * 测试远程调用 * @return */ @RequestMapping("/testOpenFeign") public R testOpenFeign(){ CouponEntity couponEntity = new CouponEntity(); couponEntity.setCouponName("满100减10"); return new R().ok().put("coupons",Arrays.asList(couponEntity)); }
-
在 用户服务(调用方) 中声明要调用的远程服务接口:使用 @FeignClient 远程客户端注解
@FeignClient("bilimall-coupon") public interface CouponFeignService { @RequestMapping("/coupon/coupon/testOpenFeign") public R testOpenFeign(); }
-
在 用户服务(调用方) 主启动类中开启远程调用功能
@EnableFeignClients(basePackages = "cn.lzwei.bilimall.member.feign")
-
在 用户服务(调用方) 中编写测试接口调用远程服务
@Autowired private CouponFeignService couponFeignService; @RequestMapping("/testOpenFeign") public R testOpenFeign(){ MemberEntity memberEntity = new MemberEntity(); memberEntity.setNickname("小明"); R r = couponFeignService.testOpenFeign(); return R.ok().put("member",memberEntity).put("coupons",r.get("coupons")); }
-
启动相关服务进行调用测试
4.3 Nacos [作为配置中心]
应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。假设我们通过 Nacos 配置中心保存 Nacos 的部分配置,有以下例子:
- BeanAutoRefreshConfigExample: 通过将配置信息配置为bean,支持配置变自动刷新的例子
- ConfigListenerExample: 监听配置信息的例子
- DockingInterfaceExample: 对接 nacos 接口,通过接口完成对配置信息增删改查的例子
- ValueAnnotationExample: 通过 @Value 注解进行配置信息获取的例子
- SharedConfigExample: 共享配置的例子
- ExtensionConfigExample: 扩展配置的例子
配置中心特点
- 与服务中配置存在相同配置时,以nacos配置中心的为主
4.3.1 配置配置中心
以优惠卷服务为例
-
修改云服务器安全组开放对应端口、关闭云服务器内部防火墙(systemctl stop firewalld)
-
下载安装 Nacos:https://github.com/alibaba/nacos/releases
注意对应版本为:1.1.3
[root@tencent bin]# tar -zxvf nacos-server-1.1.3.tar.gz
-
启动 Nacos:注意需要先安装jdk
[root@tencent bin]# sh startup.sh -m standalone
-
在公共服务中引入依赖
<!-- Spring Cloud Alibaba-Nacos-config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
在**对应服务中配置 Nacos Config **:修改配置文件 bootstrap.properties
spring.application.name=bilimall-coupon spring.cloud.nacos.config.server-addr=114.132.162.129:8848
4.3.2 使用配置中心
使用前:修改配置信息需要重新打包部署
-
在 优惠卷服务 配置文件 application.properties 中 添加配置信息
coupon.name=zhangsan coupon.age=18
-
在 优惠卷服务 中 编写接口 从配置文件 application.properties 中 获取配置信息:使用注解 @Value
@Value("${coupon.name}") private String name; @Value("${coupon.age}") private String age; /** * 测试配置中心:修改配置中心的配置文件是否会实时变化 * @return */ @RequestMapping("/testConfig") public R testConfig(){ return R.ok().put("name",name).put("age",age); }
-
启动 优惠卷服务 ,获取配置信息
使用后:修改配置信息直接实时获取
服务启动时从nacos中加载配置文件,配置文件默认格式为 服务名.properties
-
在 nacos配置中心中 添加默认配置文件并发布:bilimall-coupon.properties
-
在 优惠卷服务 需要刷新配置中心配置文件的Controller上加上自动刷新的注解
@RefreshScope
-
重新启动 优惠卷服务 ,获取配置信息
与 优惠卷服务 中配置存在相同配置时,以nacos配置中心的为主
-
修改并发布 配置中心的配置信息
-
获取配置信息,发现 实时同步
4.3.3 进阶
1)核心概念
命名空间:用于进行粗粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 DatalD 的配置。
-
配置方式
#必须使用id指定 spring.cloud.nacos.config.namespace=a7b0f870-8dea-4ed2-98da-9d28023eb693
-
场景一:不同环境的配置的区分隔离,例如 开发、测试、生产环境的资源(如配置、服务)隔离等。
-
场景二:每一个微服务之间的配置相互隔离。每一个微服务都创建自己的命名空间,值加载自己命名空间下的所有配置
配置集:所有的配置信息的集合。
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
配置集ID:Data ID,类似文件名。
Nacos 中的某个配置集的 ID,配置集 ID 是组织划分配置的维度之一,Data ID 通常用于组织划分系统的配置集,一个系统或者应用可以包含多个配置集,一个系统应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识,Data ID 通常采用类 Java 包 如 ( com.taobao.tc.refund.log.level ) 的命名规则保证全局唯一性,此命名规则非强制
配置分组:用于进行细粒度的配置隔离,默认所有的配置集都属于 DEFAULT_GROUP。
Nacos 中的一组配置集,是组织配置的维度之一,通过一个有意义的字符串,(如 Buy 或 Trade ) 对配置集进行分组,从而区分 Data ID 相同的配置集,当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用,DEFAULT_GROUP 配置分组的常见场景,不同的应用或组件采用了相同的配置类型,如 database_url 配置和 MQ_topic 配置
-
配置方式
spring.cloud.nacos.config.group=dev
-
使用场景:在命名空间中细粒度区分开发环境
2)多配置集 使用
- 微服务任何配置信息,任何配置文件都可以放在配置中心中
- 甚至我们只需要在应用中创建 bootstrap.properties 配置nacos配置中心的信息,说明加载配置中心哪些配置文件即可
- 以前SpringBoot任何方法从配置文件中获取值,都能使用:@Value、@ConfigurationProperties
- 配置中心有的优先使用配置中心的
配置例子:以 优惠卷服务 为例
-
在 nacos配置中心 中创建其他配置集
-
在 优惠卷服务 的 bootstrap.properties 中配置加载配置中心哪些配置文件
spring.application.name=bilimall-coupon spring.cloud.nacos.config.server-addr=114.132.162.129:8848 spring.cloud.nacos.config.namespace=a7b0f870-8dea-4ed2-98da-9d28023eb693 #命名空间中,默认配置文件的分组:服务名.properties spring.cloud.nacos.config.group=dev #命名空间中,其他配置集[0] spring.cloud.nacos.config.ext-config[0].data-id=datasource.yaml spring.cloud.nacos.config.ext-config[0].group=dev spring.cloud.nacos.config.ext-config[0].refresh=true #命名空间中,其他配置集[1] spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yaml spring.cloud.nacos.config.ext-config[1].group=dev spring.cloud.nacos.config.ext-config[1].refresh=true #命名空间中,其他配置集[2] spring.cloud.nacos.config.ext-config[2].data-id=other.yaml spring.cloud.nacos.config.ext-config[2].group=dev spring.cloud.nacos.config.ext-config[2].refresh=true
4.4 OSS 云服务 [来自9.3、9.4]
4.4.1 简介
对象存储服务 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
4.4.2 云存储上传方式
1)普通上方式
用户提交文件到服务器,服务器将文件提交到 OSS 对象存储
和数据直传到OSS相比,以上方法有三个缺点:
- 上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。
- 扩展性差:如果后续用户多了,应用服务器会成为瓶颈。
- 费用高:需要准备多台应用服务器。由于OSS上传流量是免费的,如果数据直传到OSS,不通过应用服务器,那么将能省下几台应用服务器。
2)服务端签名后上传
采用JavaScript客户端直接签名(参见JavaScript客户端签名直传)时,AccessKey ID和AcessKey Secret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。
Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。服务端签后直传
4.4.3 创建阿里云OSS相关服务
-
创建OSS存储桶
-
创建RAM用户
-
给创建的RAM用户添加OSS管理权限
4.4.4 创建第三方服务模块💡
-
创建 第三方服务模块:bilimall-third-party
-
在 第三方服务 中修改 pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 1、修改 SpringBoot 版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> </parent> <!-- 2、修改描述信息 --> <description>第三方服务</description> <properties> <java.version>17</java.version> <!-- 3、修改 SpringCloud 版本 --> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties> <dependencies> <!-- 4、引入 Spring Cloud Alibaba Oss --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alicloud-oss</artifactId> </dependency> <!-- 5、引入 公共依赖 --> <dependency> <groupId>cn.lzwei.bilimall</groupId> <artifactId>bilimall-common</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <!-- 6、剔除 MybatisPlus 依赖 --> <exclusion> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- 7、引入 Spring cloud alibaba --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
-
在 第三方服务 中创建配置文件配置nacos注册中心、oss、服务端口:application.yaml
spring: cloud: nacos: discovery: server-addr: 114.132.162.129:8848 alicloud: access-key: LTAI5t9sqxLYEuj8ShZ4km9b secret-key: UN7Bl1u9wj4mOK4qzni7YeKc3xgvOr oss: endpoint: oss-cn-guangzhou.aliyuncs.com application: name: bilimall-third-party server: port: 30000
-
在 nacos服务 中为 第三方服务 创建命名空间:third-party
-
在 nacos服务third-party命名空间 中添加 OSS配置文件:oss.yaml
spring: cloud: alicloud: access-key: LTAI5t9sqxLYEuj8ShZ4km9b secret-key: UN7Bl1u9wj4mOK4qzni7YeKc3xgvOr oss: endpoint: oss-cn-guangzhou.aliyuncs.com
-
在 第三方服务 创建配置文件配置nacos配置中心:bootstrap.properties
spring.application.name=bilimall-third-party spring.cloud.nacos.config.server-addr=114.132.162.129:8848 spring.cloud.nacos.config.namespace=1185ba57-96ae-4b78-ba83-cc4e5f1ae05a #命名空间中,默认配置文件的分组:服务名.properties spring.cloud.nacos.config.group=dev #命名空间中,其他配置集[0] spring.cloud.nacos.config.ext-config[0].data-id=oss.yaml spring.cloud.nacos.config.ext-config[0].group=dev spring.cloud.nacos.config.ext-config[0].refresh=true
-
在 第三方服务 的主启动类上开启 服务发现与注册 功能
@EnableDiscoveryClient
4.4.5 API:OSS服务端签名💡
-
在 第三方服务 中创建 cn.lzwei.bilimall.thirdparty.controller.OssController
package cn.lzwei.bilimall.thirdparty.controller; @RestController public class OssController { @Resource OSS ossClient; @Value("${spring.cloud.alicloud.access-key}") private String accessId; @Value("${spring.cloud.alicloud.oss.endpoint}") private String endpoint; @Value("${spring.cloud.alicloud.oss.bucket}") private String bucket; @RequestMapping("/oss/policy") public R policy(){ // 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。 String dir = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDate.now())+"/"; String host= "https://" + bucket + "." + endpoint; Map<String, String> respMap = null; try { long expireTime = 30; long expireEndTime = System.currentTimeMillis() + expireTime * 1000; Date expiration = new Date(expireEndTime); PolicyConditions policyConds = new PolicyConditions(); policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir); String postPolicy = ossClient.generatePostPolicy(expiration, policyConds); byte[] binaryData = postPolicy.getBytes("utf-8"); String encodedPolicy = BinaryUtil.toBase64String(binaryData); String postSignature = ossClient.calculatePostSignature(postPolicy); respMap = new LinkedHashMap<String, String>(); respMap.put("accessId", accessId); respMap.put("policy", encodedPolicy); respMap.put("signature", postSignature); respMap.put("dir", dir); respMap.put("host", host); respMap.put("expire", String.valueOf(expireEndTime / 1000)); // respMap.put("expire", formatISO8601Date(expiration)); } catch (Exception e) { // Assert.fail(e.getMessage()); System.out.println(e.getMessage()); } return R.ok().put("data",respMap); } }
-
在 第三方服务 中添加配置信息:
spring: cloud: alicloud: oss: bucket: bilimall-20221226
-
在 网关服务bilimall-gateway 中添加路由规则:注意规则顺序,越具体的匹配路径优先级越高
spring: cloud: gateway: routes: - id: thir_party_route uri: lb://bilimall-third-party predicates: - Path=/api/thirdparty/** filters: - RewritePath=/api/thirdparty/?(?<segment>.*),/$\{segment}
-
启动 第三方服务 ,查看访问效果
五、整合SpringCloud
5.1 Feign [声明式远程调用]
5.1.1 简介
Feign 是一个声明式的 HTTP 客户端,他的目的就是让远程调用更加简单,Feign提供了 HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好的 HTTP 请求参数、格式、地址等信息
Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显示地使用这两个组件
SpringCloud - Feign,在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 SpringCloud - Ribbon 自行封装服务调用客户端的开发量。
5.1.2 使用
以用户服务调用优惠卷服务为例
-
调用方引入依赖
<!-- OpenFeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
在 优惠卷服务(被调用方) 中编写可供调用的测试接口
/** * 测试远程调用 * @return */ @RequestMapping("/testOpenFeign") public R testOpenFeign(){ CouponEntity couponEntity = new CouponEntity(); couponEntity.setCouponName("满100减10"); return new R().ok().put("coupons",Arrays.asList(couponEntity)); }
-
在 用户服务(调用方) 中声明要调用的远程服务接口:使用 @FeignClient 远程客户端注解
@FeignClient("bilimall-coupon") public interface CouponFeignService { @RequestMapping("/coupon/coupon/testOpenFeign") public R testOpenFeign(); }
-
在 用户服务(调用方) 主启动类中开启远程调用功能
@EnableFeignClients(basePackages = "cn.lzwei.bilimall.member.feign")
-
在 用户服务(调用方) 中编写测试接口调用远程服务
@Autowired private CouponFeignService couponFeignService; @RequestMapping("/testOpenFeign") public R testOpenFeign(){ MemberEntity memberEntity = new MemberEntity(); memberEntity.setNickname("小明"); R r = couponFeignService.testOpenFeign(); return R.ok().put("member",memberEntity).put("coupons",r.get("coupons")); }
-
启动相关服务进行调用测试
5.1.3 原理
5.2 Gateway [网关服务]
5.2.1 简介
网关作为流浪入口,常用功能包括路由转发,权限效验,限流控制等,而 SpringCloud GateWay作为 SpringCloud 官方推出的第二代网关框架,取代了 Zull 网关
网上测试 三种网关对应请求数
网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险、包括 协议适配、协议转发、安全策略、防刷、流量、监控日志 等功能
Spring Cloud GateWay 旨在提供一种简单有效的方式来对 API 进行路由,并为他们提供切面,列如、安全性、监控/指标 和弹性等
官网文档地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
5.2.2 核心概念
- 路由:网关的基本构建块。它由 ID、目标 URI、断言集合和过滤器集合定义。如果聚合断言为真,则路由匹配。
- 断言:这是一个Java 8 函数断言。输入类型是Spring Framework
ServerWebExchange
。这使您可以匹配 HTTP 请求中的任何内容,例如标头或参数。 - Filter
GatewayFilter
:这些是使用特定工厂构建的实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。
当请求到达网关,网关先利用断言来判断当次请求是否符合某个路由规则,如果符合了就按这个规则把请求路由到指定地方。当要去到指定地方就得经过Filter进行过滤
5.2.3 搭建网关服务
-
新建微服务 bilimall-gateway 模块
-
在微服务 bilimall-gateway 的 pom.xml 中 引入公共服务依赖,修改 SpringBoot、Spring Cloud 的依赖版本
<dependency> <groupId>cn.lzwei.bilimall</groupId> <artifactId>bilimall-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
-
在微服务 bilimall-gateway 的主启动类上添加注解开启服务注册发现功能,并剔除数据源配置:
@EnableDiscoveryClient @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
-
在微服务 bilimall-gateway 中配置 nacos注册中心:application.yaml
spring: cloud: nacos: discovery: server-addr: 114.132.162.129:8848 application: name: bilimall-gateway server: port: 88
-
在 nacos配置中心 中为网关服务新建命名空间:gateway
-
在微服务 bilimall-gateway 中配置 nacos配置中心: bootstrap.properties
spring.application.name=bilimall-gateway spring.cloud.nacos.config.server-addr=114.132.162.129:8848 spring.cloud.nacos.config.namespace=266c677a-9f2c-4713-b90b-ad980a35fc23
-
启动服务
5.2.4 测试网关服务
实现访问 http://localhost:88?url=baidu 转发到 https://www.baidu.com
实现访问 http://localhost:88?url=qq 转发到 https://www.qq.com
-
修改微服务 bilimall-gateway 的配置文件: application.yaml
spring: cloud: nacos: discovery: server-addr: 114.132.162.129:8848 gateway: routes: - id: baidu_route uri: https://www.baidu.com predicates: - Query=url,baidu - id: qq_route uri: https://www.qq.com predicates: - Query=url,qq application: name: bilimall-gateway server: port: 88
-
重启微服务 bilimall-gateway ,并进行测试