谷粒商城笔记合集
分布式基础篇 | 分布式高级篇 | 高可用集群篇 |
---|---|---|
===简介&环境搭建=== | ||
项目简介与分布式概念(第一、二章) | ||
基础环境搭建(第三章) | ||
===整合SpringCloud=== | ||
整合SpringCloud、SpringCloud alibaba(第四、五章) | ||
===前端知识=== | ||
前端开发基础知识(第六章) | ||
===商品服务开发=== | ||
商品服务开发:基础概念、三级分类(第七、八章) | ||
商品服务开发:品牌管理(第九章) | ||
商品服务开发:属性分组、平台属性(第十、十一章) | ||
商品服务:商品维护(第十二、十三章) | ||
===仓储服务开发=== | ||
仓储服务:仓库维护(第十四章) | ||
基础篇总结(第十五章) |
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 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
SpringClouid的痛点
SpringCloud Alibaba的优势
结合SpringCloud Alibaba我们最终的技术搭配方案
如何建造
https://github.com/alibaba/spring-cloud-alibaba/tree/2.2.x
版本控制指南
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 版本号。
版本说明
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 |
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.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,他是使用 java 编写的,需要依赖 java 环境
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
在公共服务中引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
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
以用户服务调用优惠卷服务为例
调用方引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
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"));
}
启动相关服务进行调用测试
应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。假设我们通过 Nacos 配置中心保存 Nacos 的部分配置,有以下例子:
配置中心特点
以优惠卷服务为例
修改云服务器安全组开放对应端口、关闭云服务器内部防火墙(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
在公共服务中引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
在**对应服务中配置 Nacos Config **:修改配置文件 bootstrap.properties
spring.application.name=bilimall-coupon
spring.cloud.nacos.config.server-addr=114.132.162.129:8848
使用前:修改配置信息需要重新打包部署
在 优惠卷服务 配置文件 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配置中心的为主
修改并发布 配置中心的配置信息
获取配置信息,发现 实时同步
命名空间:用于进行粗粒度的配置隔离。不同的命名空间下,可以存在相同的 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
使用场景:在命名空间中细粒度区分开发环境
配置例子:以 优惠卷服务 为例
在 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
对象存储服务 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
用户提交文件到服务器,服务器将文件提交到 OSS 对象存储
和数据直传到OSS相比,以上方法有三个缺点:
采用JavaScript客户端直接签名(参见JavaScript客户端签名直传)时,AccessKey ID和AcessKey Secret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。
Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。服务端签后直传
创建 第三方服务模块:bilimall-third-party
在 第三方服务 中修改 pom.xml
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.8.RELEASEversion>
<relativePath/>
parent>
<description>第三方服务description>
<properties>
<java.version>17java.version>
<spring-cloud.version>Greenwich.SR3spring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alicloud-ossartifactId>
dependency>
<dependency>
<groupId>cn.lzwei.bilimallgroupId>
<artifactId>bilimall-commonartifactId>
<version>0.0.1-SNAPSHOTversion>
<exclusions>
<exclusion>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
exclusion>
exclusions>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
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
在 第三方服务 中创建 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}
启动 第三方服务 ,查看访问效果
Feign 是一个声明式的 HTTP 客户端,他的目的就是让远程调用更加简单,Feign提供了 HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好的 HTTP 请求参数、格式、地址等信息
Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显示地使用这两个组件
SpringCloud - Feign,在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 SpringCloud - Ribbon 自行封装服务调用客户端的开发量。
以用户服务调用优惠卷服务为例
调用方引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
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"));
}
启动相关服务进行调用测试
网关作为流浪入口,常用功能包括路由转发,权限效验,限流控制等,而 SpringCloud GateWay作为 SpringCloud 官方推出的第二代网关框架,取代了 Zull 网关
网上测试 三种网关对应请求数
网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险、包括 协议适配、协议转发、安全策略、防刷、流量、监控日志 等功能
Spring Cloud GateWay 旨在提供一种简单有效的方式来对 API 进行路由,并为他们提供切面,列如、安全性、监控/指标 和弹性等
官网文档地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
ServerWebExchange
。这使您可以匹配 HTTP 请求中的任何内容,例如标头或参数。GatewayFilter
:这些是使用特定工厂构建的实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。当请求到达网关,网关先利用断言来判断当次请求是否符合某个路由规则,如果符合了就按这个规则把请求路由到指定地方。当要去到指定地方就得经过Filter进行过滤
新建微服务 bilimall-gateway 模块
在微服务 bilimall-gateway 的 pom.xml 中 引入公共服务依赖,修改 SpringBoot、Spring Cloud 的依赖版本
<dependency>
<groupId>cn.lzwei.bilimallgroupId>
<artifactId>bilimall-commonartifactId>
<version>0.0.1-SNAPSHOTversion>
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
启动服务
实现访问 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 ,并进行测试