【谷粒商城基础篇】整合SpringCloud、SpringCloud alibaba

在这里插入图片描述

谷粒商城笔记合集

分布式基础篇分布式高级篇高可用集群篇
===简介&环境搭建===
项目简介与分布式概念(第一、二章)
基础环境搭建(第三章)
===整合SpringCloud===
整合SpringCloud、SpringCloud alibaba(第四、五章)
===前端知识===
前端开发基础知识(第六章)
===商品服务开发===
商品服务开发:基础概念、三级分类(第七、八章)
商品服务开发:品牌管理(第九章)
商品服务开发:属性分组、平台属性(第十、十一章)
商品服务:商品维护(第十二、十三章)
===仓储服务开发===
仓储服务:仓库维护(第十四章)
基础篇总结(第十五章)

四、整合 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 VersionSpring Cloud VersionSpring Boot Version
    2021.0.4.0*Spring Cloud 2021.0.42.6.11
    2021.0.1.0Spring Cloud 2021.0.12.6.3
    2021.1Spring Cloud 2020.0.12.4.2
  • 2.2.x 分支

    适配 Spring Boot 为 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):

    Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
    2.2.9.RELEASE*Spring Cloud Hoxton.SR122.3.12.RELEASE
    2.2.8.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
    2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
    2.2.6.RELEASESpring Cloud Hoxton.SR92.3.2.RELEASE
    2.2.1.RELEASESpring Cloud Hoxton.SR32.2.5.RELEASE
    2.2.0.RELEASESpring Cloud Hoxton.RELEASE2.2.X.RELEASE
    2.1.4.RELEASESpring Cloud Greenwich.SR62.1.13.RELEASE
    2.1.2.RELEASESpring Cloud Greenwich2.1.X.RELEASE
    2.0.4.RELEASE(停止维护,建议升级)Spring Cloud Finchley2.0.X.RELEASE
    1.5.1.RELEASE(停止维护,建议升级)Spring Cloud Edgware1.5.X.RELEASE
  • 组件版本关系

    每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示(注意,Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进):

    Spring Cloud Alibaba VersionSentinel VersionNacos VersionRocketMQ VersionDubbo VersionSeata Version
    2.2.9.RELEASE1.8.52.1.04.9.4~1.5.2
    2021.0.4.01.8.52.0.44.9.4~1.5.2
    2.2.8.RELEASE1.8.42.1.04.9.3~1.5.1
    2021.0.1.01.8.31.4.24.9.2~1.4.2
    2.2.7.RELEASE1.8.12.0.34.6.12.7.131.3.0
    2.2.6.RELEASE1.8.11.4.24.4.02.7.81.3.0
    2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE1.8.01.4.14.4.02.7.81.3.0
    2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE1.8.01.3.34.4.02.7.81.3.0
    2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE1.7.11.2.14.4.02.7.61.2.0
    2.2.0.RELEASE1.7.11.1.44.4.02.7.4.11.0.0
    2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE1.7.01.1.44.4.02.7.30.9.0
    2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE1.6.31.1.14.4.02.7.30.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

服务注册:以优惠卷服务为例,其他服务自行注册

  1. 修改云服务器安全组开放对应端口、关闭云服务器内部防火墙(systemctl stop firewalld)

  2. 下载安装 Nacos:https://github.com/alibaba/nacos/releases

    注意对应版本为:1.1.3

    [root@tencent bin]# tar -zxvf nacos-server-1.1.3.tar.gz
    

    在这里插入图片描述

  3. 启动 Nacos:注意需要先安装jdk

    [root@tencent bin]# sh startup.sh -m standalone
    

    在这里插入图片描述

  4. 在公共服务中引入依赖

    <!-- Spring Cloud Alibaba-Nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    

    在这里插入图片描述

  5. 对应服务中注册 Nacos discovery:修改配置文件 application.yaml

    spring:
      cloud:
        nacos:
          discovery:
            server-addr: 114.132.162.129:8848	#nacos地址
      application:
        name: bilimall-coupon	#服务名
    

    在这里插入图片描述

  6. 在对应服务中开启服务注册发现功能,在 bilimall-coupon 的主启动类上添加注解:

    @EnableDiscoveryClient
    

    在这里插入图片描述

  7. 启动并查看服务:访问 http://114.132.162.129:8848/nacos

    初始用户名 nacos、初始密码 nacos

    在这里插入图片描述

4.2.2 配置远程调用

以用户服务调用优惠卷服务为例

  1. 调用方引入依赖

    <!-- OpenFeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    

    在这里插入图片描述

  2. 优惠卷服务(被调用方) 中编写可供调用的测试接口

    /**
     * 测试远程调用
     * @return
     */
    @RequestMapping("/testOpenFeign")
    public R testOpenFeign(){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("满100减10");
        return new R().ok().put("coupons",Arrays.asList(couponEntity));
    }
    

    在这里插入图片描述

  3. 用户服务(调用方) 中声明要调用的远程服务接口:使用 @FeignClient 远程客户端注解

    @FeignClient("bilimall-coupon")
    public interface CouponFeignService {
        @RequestMapping("/coupon/coupon/testOpenFeign")
        public R testOpenFeign();
    }
    

    在这里插入图片描述

  4. 用户服务(调用方) 主启动类中开启远程调用功能

    @EnableFeignClients(basePackages = "cn.lzwei.bilimall.member.feign")
    

    在这里插入图片描述

  5. 用户服务(调用方) 中编写测试接口调用远程服务

    @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"));
    }
    

    在这里插入图片描述

  6. 启动相关服务进行调用测试

    在这里插入图片描述

4.3 Nacos [作为配置中心]

应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。假设我们通过 Nacos 配置中心保存 Nacos 的部分配置,有以下例子:

  • BeanAutoRefreshConfigExample: 通过将配置信息配置为bean,支持配置变自动刷新的例子
  • ConfigListenerExample: 监听配置信息的例子
  • DockingInterfaceExample: 对接 nacos 接口,通过接口完成对配置信息增删改查的例子
  • ValueAnnotationExample: 通过 @Value 注解进行配置信息获取的例子
  • SharedConfigExample: 共享配置的例子
  • ExtensionConfigExample: 扩展配置的例子

配置中心特点

  • 与服务中配置存在相同配置时,以nacos配置中心的为主

4.3.1 配置配置中心

以优惠卷服务为例

  1. 修改云服务器安全组开放对应端口、关闭云服务器内部防火墙(systemctl stop firewalld)

  2. 下载安装 Nacos:https://github.com/alibaba/nacos/releases

    注意对应版本为:1.1.3

    [root@tencent bin]# tar -zxvf nacos-server-1.1.3.tar.gz
    

    在这里插入图片描述

  3. 启动 Nacos:注意需要先安装jdk

    [root@tencent bin]# sh startup.sh -m standalone
    

    在这里插入图片描述

  4. 在公共服务中引入依赖

    <!-- Spring Cloud Alibaba-Nacos-config -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    

    在这里插入图片描述

  5. 在**对应服务中配置 Nacos Config **:修改配置文件 bootstrap.properties

    spring.application.name=bilimall-coupon
    spring.cloud.nacos.config.server-addr=114.132.162.129:8848
    

    在这里插入图片描述

4.3.2 使用配置中心

使用前:修改配置信息需要重新打包部署

  1. 优惠卷服务 配置文件 application.properties 中 添加配置信息

    coupon.name=zhangsan
    coupon.age=18
    
  2. 优惠卷服务编写接口 从配置文件 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);
    }
    

    在这里插入图片描述

  3. 启动 优惠卷服务 ,获取配置信息

    在这里插入图片描述

使用后:修改配置信息直接实时获取

服务启动时从nacos中加载配置文件,配置文件默认格式为 服务名.properties

在这里插入图片描述

  1. 在 nacos配置中心中 添加默认配置文件并发布:bilimall-coupon.properties

    在这里插入图片描述

  2. 优惠卷服务 需要刷新配置中心配置文件的Controller上加上自动刷新的注解

    @RefreshScope
    

    在这里插入图片描述

  3. 重新启动 优惠卷服务 ,获取配置信息

    优惠卷服务 中配置存在相同配置时,以nacos配置中心的为主

    在这里插入图片描述

  4. 修改并发布 配置中心的配置信息

    在这里插入图片描述

  5. 获取配置信息,发现 实时同步

    在这里插入图片描述

4.3.3 进阶

1)核心概念

命名空间:用于进行粗粒度的配置隔离。不同的命名空间下,可以存在相同的 GroupDatalD 的配置。

  • 配置方式

    #必须使用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
  • 配置中心有的优先使用配置中心的

配置例子:以 优惠卷服务 为例

  1. 在 nacos配置中心 中创建其他配置集

    在这里插入图片描述

  2. 优惠卷服务 的 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相关服务

  1. 创建OSS存储桶

    在这里插入图片描述

  2. 创建RAM用户

    在这里插入图片描述

  3. 给创建的RAM用户添加OSS管理权限

    在这里插入图片描述

4.4.4 创建第三方服务模块💡

  1. 创建 第三方服务模块:bilimall-third-party

    在这里插入图片描述

    在这里插入图片描述

  2. 第三方服务 中修改 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>
    
  3. 第三方服务 中创建配置文件配置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
    
  4. nacos服务 中为 第三方服务 创建命名空间:third-party

  5. nacos服务third-party命名空间 中添加 OSS配置文件:oss.yaml

    spring:
      cloud:
        alicloud:
          access-key: LTAI5t9sqxLYEuj8ShZ4km9b
          secret-key: UN7Bl1u9wj4mOK4qzni7YeKc3xgvOr
          oss:
            endpoint: oss-cn-guangzhou.aliyuncs.com
    
  6. 第三方服务 创建配置文件配置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
    
  7. 第三方服务 的主启动类上开启 服务发现与注册 功能

    @EnableDiscoveryClient
    

4.4.5 API:OSS服务端签名💡

  1. 第三方服务 中创建 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);
        }
    }
    
  2. 第三方服务 中添加配置信息:

    spring:
      cloud:
        alicloud:
          oss:
            bucket: bilimall-20221226
    
  3. 网关服务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}
    
  4. 启动 第三方服务 ,查看访问效果

    在这里插入图片描述

五、整合SpringCloud

5.1 Feign [声明式远程调用]

5.1.1 简介

Feign 是一个声明式的 HTTP 客户端,他的目的就是让远程调用更加简单,Feign提供了 HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好的 HTTP 请求参数、格式、地址等信息

Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显示地使用这两个组件

SpringCloud - Feign,在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 SpringCloud - Ribbon 自行封装服务调用客户端的开发量。

5.1.2 使用

以用户服务调用优惠卷服务为例

  1. 调用方引入依赖

    <!-- OpenFeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    

    在这里插入图片描述

  2. 优惠卷服务(被调用方) 中编写可供调用的测试接口

    /**
     * 测试远程调用
     * @return
     */
    @RequestMapping("/testOpenFeign")
    public R testOpenFeign(){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("满100减10");
        return new R().ok().put("coupons",Arrays.asList(couponEntity));
    }
    

    在这里插入图片描述

  3. 用户服务(调用方) 中声明要调用的远程服务接口:使用 @FeignClient 远程客户端注解

    @FeignClient("bilimall-coupon")
    public interface CouponFeignService {
        @RequestMapping("/coupon/coupon/testOpenFeign")
        public R testOpenFeign();
    }
    

    在这里插入图片描述

  4. 用户服务(调用方) 主启动类中开启远程调用功能

    @EnableFeignClients(basePackages = "cn.lzwei.bilimall.member.feign")
    

    在这里插入图片描述

  5. 用户服务(调用方) 中编写测试接口调用远程服务

    @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"));
    }
    

    在这里插入图片描述

  6. 启动相关服务进行调用测试

    在这里插入图片描述

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 FrameworkServerWebExchange。这使您可以匹配 HTTP 请求中的任何内容,例如标头或参数。
  • FilterGatewayFilter :这些是使用特定工厂构建的实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

当请求到达网关,网关先利用断言来判断当次请求是否符合某个路由规则,如果符合了就按这个规则把请求路由到指定地方。当要去到指定地方就得经过Filter进行过滤

在这里插入图片描述

5.2.3 搭建网关服务

  1. 新建微服务 bilimall-gateway 模块

    在这里插入图片描述

    在这里插入图片描述

  2. 在微服务 bilimall-gateway 的 pom.xml 中 引入公共服务依赖,修改 SpringBoot、Spring Cloud 的依赖版本

    <dependency>
        <groupId>cn.lzwei.bilimall</groupId>
        <artifactId>bilimall-common</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    

    在这里插入图片描述

  3. 在微服务 bilimall-gateway 的主启动类上添加注解开启服务注册发现功能,并剔除数据源配置:

    @EnableDiscoveryClient
    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    

    在这里插入图片描述

  4. 在微服务 bilimall-gateway 中配置 nacos注册中心:application.yaml

    spring:
      cloud:
        nacos:
          discovery:
            server-addr: 114.132.162.129:8848
      application:
        name: bilimall-gateway
    server:
      port: 88
    

    在这里插入图片描述

  5. 在 nacos配置中心 中为网关服务新建命名空间:gateway

    在这里插入图片描述

  6. 在微服务 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
    

    在这里插入图片描述

  7. 启动服务

    在这里插入图片描述

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 ,并进行测试

    在这里插入图片描述

    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿你满腹经纶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值