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

news2024/11/15 18:01:48

在这里插入图片描述

谷粒商城笔记合集

分布式基础篇分布式高级篇高可用集群篇
===简介&环境搭建===
项目简介与分布式概念(第一、二章)
基础环境搭建(第三章)
===整合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 ,并进行测试

    在这里插入图片描述

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ACWING】【4645选数异或】

给定一个长度为 n 的数列 A1,A2,,An 和一个非负整数 x&#xff0c;给定 m 次查询&#xff0c;每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x。 输入格式 输入的第一行包含三个整数 n,m,x。 第二行包含 n 个整数 A1,A2,,An。 接下来 m 行&#xff0c;每行包含…

单片机基础之初识串口

目录 一、初识串口 1、串口基本知识 2、串口的特点 3、了解下全双工和半双工的区别 二、关于串口的电器标准和协议 1、RS-232 2、RS-422 3、RS-485 三、关于串口的电平 1、RS232 电平 2、TTL电平 四、串口通信 1、串口接线方式 2、串口编程要素 3、波特率 4、编…

【练习】day02(未完成版)

努力经营当下直至未来明朗&#xff01; 文章目录一、选择二、编程1. 全排列2. 全排列II答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 此代码片段输出正确的值是&#xff08; &#xff09; public class CharToString {public static void main(String[] ar…

Flink窗口的生命周期

&#x1f34a;在 Apache Flink 中&#xff0c;窗口是对数据流中的一个固定数量的元素或者一段时间内的元素进行分组的一种抽象概念。窗口有自己的生命周期&#xff0c;即从窗口的开始到窗口的结束。 &#x1f34a;窗口的开始和结束可以是以下几种情况之一&#xff1a; 按数据…

WALLET 通证减半:早期用户分配将降至 4%

WALLET 通证即将满 1 年&#xff0c;这意味着根据 Ambire 钱包白皮书&#xff0c;它的年度早期用户供应量将削减至 4%&#xff0c;随着应用率的增长&#xff0c;通货膨胀率将大幅降低。 WALLET 一周年 根据官方消息&#xff0c;WALLET 通证的生成&#xff08;token generation …

差分矩阵(二维)

题目&#xff1a; 输入一个 n行 m列的整数矩阵&#xff0c;再输入 q个操作&#xff0c;每个操作包含五个整数 x1,y1,x2,y2,c其中 (x1,y1)(x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上 c。 请你将进行完所有…

React Native 路由篇 react-navigation

1.我这边使用的是react-navigation&#xff0c;参照官网安装完启动&#xff0c;执行 npm install react-navigation/native。在安卓模拟器会报这个错误“invariant violation: requirenativecomponent: “rncsafeareaprovider” was not found in the uimanager”&#xff0c;其…

Java网络编程

一、IO模型 IO模型就是说用什么样的通道进行数据的发送和接收&#xff0c;Java共支持3种网络编程IO模式&#xff1a; BIONIOAIO 1.BIO 1.1基本介绍 Blocking I/O&#xff0c;同步阻塞&#xff08;传统阻塞型&#xff09;&#xff0c;服务器实现模式为一个连接一个线程&…

CSS初级教程(轮廓)【第五天】

CSS初级教程【第五天】【1】CSS 框模型【2】CSS 轮廓【3】CSS 轮廓宽度【4】CSS 轮廓颜色【5】CSS 轮廓简写【6】CSS 轮廓偏移【7】所有 CSS 轮廓属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CSS初级教程 边距、高…

数据压缩算法PCA使用指南

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 PCA主成分分析算法 PCA的使用范围 PCA(principal Component Analysis)&#xff0c;即主成分分析方法&#xff0c;是一种使用最广泛的数据压缩算法。 在PCA中&#xff0c;数据从原来的坐标系转换到新的坐标…

【2023.01.03】定时执行专家 V6.5 更新日志 - TimingExecutor V6.5 Change Log

目录 ◆ 最新版下载链接 ◆ 软件更新日志 – TimingExecutor Full Change Log ▼ 2023-01-03 V6.5 ▼ 2022-12-25 V6.4 ▼ 2022-11-15 V6.3 ▼ 2022-10-01 V6.2 ▼ 2022-07-30 V6.1&#xff08;Build 769.30072022&#xff09; ▼ 2022-06-30 V6.0 ▼ 2022-…

《学术规范与论文写作》总结

文章目录一、写作规范二、写作准备三、论文架构3.1 标题3.2 摘要3.3 关键词&#xff08;可省&#xff09;3.4 引言3.5 相关工作&#xff08;研究背景&#xff09;3.6 实现细节3.7 实验部分3.8 结论四、写作技巧五、其他技巧5.1 算法伪代码5.2 图片5.3 写作语言一、写作规范 写…

短视频剪辑素材在哪里找?

视频剪辑没素材&#xff0c;推荐5个网站帮你解决&#xff0c;免费可商用&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 网站有超多视频素材&#xff0c;全部都是高清无水印&#xff0c;各种类型都有&#xff0c;像自然、城市…

【Linux】文件操作|文件描述符|重定向

文章目录1.文件操作系统调用的几个基本接口openwritereadlseekwrite read close lseek ,对比C文件相关接口2.如何理解文件操作&#xff1f;3.文件描述符fd文件描述符的分配规则重定向使用 dup2 系统调用进行重定向4.在自己的shell中添加重定向功能&#xff1a;1.文件操作系统调…

唯品会api_sign分析

本次分析的案例是唯品会app,版本号:7.45.6 抓个包,请求头中有个api_sign,该字段就是本次分析的对象。 1.jadx 静态分析 直接搜索关键词:api_sign= 跟进去,来到这里。 这里用到了VCSPSecurityBasicService.apiSign()方法,双击两下,找到函数的定义地方。 这里引用到的方…

【机器学习实战】四、实现线性回归模型案例

线性回归案例 一、初始化方法 1.对数据进行预处理模块&#xff0c;调用prepare_for_training方法&#xff0c;得到返回值data_processed, features_mean, features_deviation 2.得到所有的特征个数&#xff0c;即data的特征维数的列(行shape[0]&#xff0c;列shape[1]) 3.初始…

怎么获取level2行情接口数据?

怎么获取level2行情接口数据比较方便呢&#xff1f;其实level2行情接口可以实时计算沪深所有股票数据&#xff0c;主要是可以让交易者方便引用和计算公式再进入股票池&#xff0c;就比如说一个分笔数据含有10-20个分笔数据&#xff0c;用分笔数据计算的资金流入数据不准确&…

< Linux > 进程控制

目录 1、进程创建 fork函数 fork函数返回值 写时拷贝 fork常规用法 fork调用失败的原因 2、进程终止 2.1、进程退出常见场景 2.2、进程退出码 2.3、进程常见退出方法 _exit函数 exit函数 return退出 2.4、关于终止&#xff0c;内核做了什么 3、进程等待 3.1、进程等待必要性…

解决VS2019+Qt5+Vcpkg工程无法调试但Release正常运行的问题

前言——这个问题可能比较小众&#xff0c;但是因为解决了我自己的问题&#xff0c;所以特此把解决方法分享出来&#xff0c;以给特定的人提供必要的帮助。 项目原因&#xff0c;一直使用VS2019Qt5Vcpkg&#xff0c;无奈程序一直无法进行调试&#xff0c;Release模式倒是正常运…

计算机图形学 Ray Trace 学习笔记

屏幕上的一个像素&#xff0c;是通过各种反射、折射而共同组成的&#xff0c;每个反射折射的点&#xff0c;都会考虑光源是否有直接照射到反射折射的点上&#xff0c;反射与折射之间会存在能量衰减&#xff0c;最终汇总在屏幕的像素上。 计算是哪一个三角形被射线打中&#xff…