SpringCloud Alibaba 全部组件说明

2023-05-16

文章目录

    • 一、微服务
      • 1、系统架构的演变
        • 1)单体应用架构
        • 2)垂直应用架构
        • 3)分布式架构
        • 4)SOA架构
        • 5)微服务架构
      • 2、微服务架构常见的问题
      • 3、常见微服务架构
    • 二、SpringCloud Alibaba
      • 1、SpringCloud Alibaba简介
        • 1)简介
        • 2)为什么使用
        • 3)Spring Cloud 和 SpringCloud Alibaba 的关系
        • 4)版本说明
      • 2、SpringCloud Alibaba-Nacos 下载与安装
        • 1)下载nacos-server
        • 2)启动
      • 3、Nacos【作为注册中心】
        • 注册中心演变及其设计思想
        • 1. 引入 Nacos Discovery Starter依赖
        • 2. 配置文件中配置 Nacos Server 地址
        • 3. 在主启动类中开启服务注册与发现功能
        • 4. 消费者业务
        • 5. 注册更多的服务上去,测试使用 feign 远程调用
      • 4、Nacos【作为配置中心】
        • 1. pom.xml 引入Nacos Config Starter
        • 2. 在应用的 /src/main/resources/bootstrap.properties 配置文件
        • 3. 在nacos中添加配置
        • 4. 在应用中使用@Value 和@RefreshScope
        • 5. 进阶
      • 4、SpringCloud Alibaba-Sentinel
      • 5、SpringCloud Alibaba-Seata
      • 6、SpringCloud Alibaba-OSS
        • 1. 简介
        • 2. 图示说明
        • 3. 资源术语
        • 4. 使用步骤
          • 1)开通 “对象存储OSS”服务
          • 2)进入oss管理控制台
          • 3)Java代码操作阿里云oss上传文件
    • 三、SpringCloud
      • 1、Ribbon负载均衡
        • 1. 简介
        • 2. 使用
      • 2、Feign声明式远程调用
        • 1. 简介
        • 2. 使用
      • 3、Gateway
        • 1. 概念
        • 2. 使用
      • 4、Sleuth+Zipkin 服务链路追踪


一、微服务

1、系统架构的演变

随着互联网的发展,网站应用的规模也在不断的扩大,进而导致系统架构也在不断的进行变化。从互联网早起到现在,系统架构大体经历了下面几个过程:单体应用架构 一> 垂直应用架构一> 分布式架构 一> SOA架构 一> 微服务架构,当然还有悄然兴起的Service Mesh(服务网格化)。

1)单体应用架构

互联网早期,一般的网站应用流量较小,只需一个应用,将所有功能代码都部署在一起就可以,这样可以减少开发、部署和维护的成本。
比如说一个电商系统,里面会包含很多用户管理,商品管理,订单管理,物流管理等等很多模块,我们会把它们做成一个web项目,然后部署到一台tomcat服务器上。

在这里插入图片描述
优点

  • 项目架构简单,小型项目的话,开发成本低
  • 项目部署在一个节点上,维护方便

缺点

  • 全部功能集成在一个工程中,对于大型项目来讲不易开发和维护
  • 项目模块之间紧密耦合,单点容错率低
  • 无法针对不同模块进行针对性优化和水平扩展

2)垂直应用架构

随着访问量的逐渐增大,单应用只能依靠增加节点来应对,但是这时候会发现并不是所有的模块都会有比较大的访问景还是以上面的电商为例子,用户访问最的增加可能影响的只是用户和订单模块,但是对消息模块的形响就比较小,那么此时我们希望只多增加几个订单模块。而不增加消息模块。此时单体应用就做不到了,垂白应用就应运而生了。
所谓的垂自应用架构,就是将原来的一一个应用拆成互不相干的几个应用,以提升效率。比如我们可以将上面电商的单体应用拆分成:

  • 电商系统(用户管理 / 商品管理 / 订单管理)
  • 后台系统(用户管理 / 订单管理 / 客户管理)
  • CMS系统(广告管理 / 营销管理)

这样拆分完毕之后,一旦用户访问量变大,只需要增加电商系统的节点就可以了,而无需增加后台和CMS的节点。

优点

  • 系统拆分实现了流量分担,解决了并发问题,而且可以针对不同模块进行优化和水扩展
  • 一个系统的问题不会影响到其他系统,提高容错率

缺点

  • 系统之间相互独立,无法进行相互调用
  • 系统之间相互独立,会有重 复的开发任务

3)分布式架构

当垂直应用越来越多,重复的业务代码就会越来越多。这时候,我们就思考可不可以将重复的代码抽取出来,做成统一的业务层作为独立的服务,然后由前端控制层调用不同的业务层服务呢?
这就产生了新的分布式系统架构。它将把工程拆分成表现层和服务层两个部分,服务层中包含业务逻辑。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。

优点

  • 抽取公共的功能为服务层,提高代码复用性

缺点

  • 系统间耦合度变高,调用关系错综复杂,难以维护

4)SOA架构

在分布式架构下,当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心对集群进行实时管理。此时,用于资源调度和治理中心(SOA Service Oriented Architecture)是关键。

优点

  • 使用治理中心(ESB / Dubbo)解决了服务间调用关系的自动调节

缺点

  • 服务间会有依赖关系,一旦某个环节出错会影响较大(服务雪崩)
  • 服务关系复杂,运维、测试部署困难

5)微服务架构

微服务机构在某种程度上是面向服务的架构SOA继续发展的下一步,他更加强调服务的“彻底拆分”。

优点

  • 服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于扩展
  • 微服务之间采用Restful等轻量级 http 协议相互调用

缺点

  • 分布式系统开发的技术成本高(容错、分布式事务等)
  • 复杂性更高。各个微服务进行分布式独立部署,当进行模块调用的时候,分布式将会变得更加麻烦。

2、微服务架构常见的问题

一旦采用微服务系统架构,就势必会遇到这样几个问题:

  • 这么多小服务,如何管理他们? (服务治理 注册中心 [服务注册 发现 剔除]) nacos
  • 这么多小服务,他们之间如何通讯? (restful rpc dubbo feign)
    httpclint(“url”,参数),springboot restTemplate(“ur”,参数) ,feign
  • 这么多小服务,客户端怎么访问他们? (网关)gateway
  • 这么多小服务,一旦出现问题了,应该如何自处理? (容错)sentinel
  • 这么多小服务,一旦出现问题了,应该如何排错? (链路追踪)skywalking

对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相对应的组件来解决他们。

在这里插入图片描述

3、常见微服务架构

1.dubbo:zookeeper + dubbo + SpringMvc / SpringBoot

  • 配套通信方式:rpc
  • 注册中心:zookeeper / redis
  • 配置中心:diamond

2.SpringCloud:全家桶 + 嵌入第三方组件(Netflix)

  • 配套通信方式:http restful
  • 注册中心:eruka / consul
  • 配置中心:config
  • 熔断器:hystrix
  • 网关:zuul
  • 分布式链路系统:sleuth + zipkin

二、SpringCloud Alibaba

1、SpringCloud Alibaba简介

1)简介

Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。 此项目包含开发分布式应用微服务的必需组件,方便开发者通过Spring Cloud编程模型轻松便用这些组件来开发分布式应用服务。

依托Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将SpringCloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

官网地址:https://github.com/alibaba/spring-cloud-alibaba

Github中文文档说明:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

主要功能

  • 服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
    阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件

  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
  • Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
  • Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
  • Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
  • Alibaba Cloud SMS:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

2)为什么使用

在这里插入图片描述

SpringCloud的几大痛点:

  • 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,即分布式事务解诀方案

3)Spring Cloud 和 SpringCloud Alibaba 的关系

在这里插入图片描述

4)版本说明

  1. 组件版本关系
    在这里插入图片描述
  2. 毕业版本依赖关系(推荐使用)
    在这里插入图片描述

2、SpringCloud Alibaba-Nacos 下载与安装

Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用 Java 编写。需要依赖Java环境。

Nacos文档地址:https://nacos.io/zh-cn/docs/quick-start.html

官网文档说明:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html

Nacos就是注册中心 + 配置中心的组合 等价于 Nacos = Eureka + config + Bus

1)下载nacos-server

https://github.com/alibaba/nacos/releases

2)启动

  • 双击bin中的 startup.cmd 文件
  • 访问http://localhost:8848/nacos/
  • 使用默认的nacos/nacos进行登录
    在这里插入图片描述

在这里插入图片描述

3、Nacos【作为注册中心】

管理所有微服务、解决微服务之间调用关系错综复杂、难以维护的问题。

注册中心演变及其设计思想

在这里插入图片描述

1. 引入 Nacos Discovery Starter依赖

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>2.1.7.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>Greenwich.SR2</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<!--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>
		<!--web 模块-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>2.1.7.RELEASE</version>
		</dependency>
	</dependencies>
</dependencyManagement>

2. 配置文件中配置 Nacos Server 地址

server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

注意:每一个应用都应该有名字,这样才能注册上去,修改application.properties文件。

3. 在主启动类中开启服务注册与发现功能

@SpringBootApplication
@EnableDiscoveryClient // 服务注册
public class ProviderApplication {

 	public static void main(String[] args) {
 		SpringApplication.run(ProviderApplication.class, args);
 	}

}

4. 消费者业务

@RestController
@Slf4j
public class OrderNacosController {

    /*
    因为在yml中配置了service-url.nacos-user-service,
    这里不需要再定义要访问微服务名常量,而是通过boot直接读出来
     */
    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id){
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }
}
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced   //RestTemplate结合Ribbon做负载均衡一定要加@LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

Nacos与其他注册中心特性对比

NacosEurekaConsulCoreDNSZookeeper
一致性协议CP+APAPCPCP
健康检查TCP/HTTP/MYSQL/ClientClient BeatTCP/HTTP/gRPCKeep Alive
负载均衡策略权重/ metadata/SelectorRibbonFabioRoundRobin
雪崩保护
自动注销实例支持支持支持不支持支持
访问协议HTTP/DNSHTTPHTTP/DNSDNSTCP
监听协支持支持支持支持不支持支持
多数据中心支持支持支持不支持不支持
跨注册中心同步支持不支持支持不支持不支持
SpringCloud继承支持支持支持不支持支持
Dubbo继承支持不支持支持不支持支持
K8S继承支持不支持支持支持不支持

Nacos支持 APCP 模式的切换(C一致性、A可用性、P可分区容错性)

5. 注册更多的服务上去,测试使用 feign 远程调用

Nacos使用三步
1、导包 nacos-discovery
2、写配置,指定nacos地址,指定应用的名字
3、开启服务注册发现功能@EnableDiscoveryClient

Fegin使用三步
1、导包 openfegin
2、开启@EnableFeginClients功能
3、编写接口,进行远程调用

4、Nacos【作为配置中心】

1. pom.xml 引入Nacos Config Starter

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2. 在应用的 /src/main/resources/bootstrap.properties 配置文件

spring.application.name=gulimall-coupon

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=43e4b62f-d65b-4295-bf06-8be264de464b
spring.cloud.nacos.config.group=prod

spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true

3. 在nacos中添加配置

在这里插入图片描述

Nacos界面配置对应:

公式:${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file.extension}

  • prefix默认为spring.application.name的值
  • spring.profile.active即为当前环境对应的profile,可以通过配置项 spring.profile.active来配置。
  • file.extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file.extension来配置
    在这里插入图片描述

4. 在应用中使用@Value 和@RefreshScope

在这里插入图片描述

5. 进阶

1、核心概念

  • 命名空间:
    用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group 或Data ID 的配置。Namespace的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
  • 配置集:
    一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
  • 配置集ID:
    Nacos中的某个配置集的ID。 配置集ID是组织划分配置的维度之一。Data lD通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。DataID 通常采用类Java 包(com.taobao.tc.refund.loglevel) 的命名规则保证全局唯一性。此命名规则非强制。

想了解 Nacos集群和持久化配置 可以查看此文章

4、SpringCloud Alibaba-Sentinel

Sentinel熔断与限流详细说明:https://blog.csdn.net/weixin_45606067/article/details/121204059

5、SpringCloud Alibaba-Seata

6、SpringCloud Alibaba-OSS

1. 简介

对象存储服务(Object Storage Seryice,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

2. 图示说明

  • 文件存储
    在这里插入图片描述
  • 阿里云对象存储 - 普通上传方式
    在这里插入图片描述
  • 阿里云对象存储 - 服务端签名后直传
    在这里插入图片描述

3. 资源术语

中文英文说明
存储空间Bucket存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。
对象/文件Object对象是 OSS 存储数据的基本单元,也被称为OSS的文件。
对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。
地域Region地域表示 OSS 的数据中心所在物理位置。您可以根据费用、
请求来源等综合选择数据存储的地域。详情请查看OSS已经开通的Region。
访问域名EndpointEndpoint 表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,
当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。
具体的内容请参见各个Region对应的Endpoint。
访问密钥AccessKeyAccessKey,简称 AK,指的是访问身份验证中用到的AccessKeyId 和AccessKeySecret。
OSS通过使用AccessKeyId 和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。
AccessKeyId用于标识用户,AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,
其中AccessKeySecret 必须保密。

4. 使用步骤

1)开通 “对象存储OSS”服务

(1)打开阿里云网站 https://www.aliyun.com/
(2)注册阿里云账户,最好使用支付宝,需要实名认证
(3)使用注册的用户登录阿里云里面
(4)找到阿里云oss
在这里插入图片描述
(5)开通oss

没开通的这里是开通过oss,我这里是已经开通好了,所以显示管理控制台。
在这里插入图片描述
(6)文档位置

在这里插入图片描述

快速入门文档:https://help.aliyun.com/document_detail/32011.html?spm=a2c4g.11186623.6.905.23866328891B4P

2)进入oss管理控制台

(1)使用oss,首先创建bucket
在这里插入图片描述
创建说明:

其他的使用默认就好。
在这里插入图片描述
(2)控制台上传图片

这里我们为了测试手动上传张图片。
在这里插入图片描述

3)Java代码操作阿里云oss上传文件

1、准备工作:创建操作阿里云oss许可证(阿里云颁发id和秘钥)

在这里插入图片描述
整个阿里云有个账号和密码,我们可以基于这个账号下开通好多子账户,所以选择开始使用子用户AccessKey。
在这里插入图片描述
这里我们需要先开通RAM
在这里插入图片描述
选择用户,创建用户

在这里插入图片描述
此时列表中就有刚创建的用户,点进去就可以看到 AccessKey IDAccessKeySecret
在这里插入图片描述
默认刚添加的用户没有任何权限,所以我们点击添加权限,我们选择管理对象存储服务权限

在这里插入图片描述
2、结合Java代码实现简单上传文件案例

(1)POM

<!--aliyunOSS-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.5.0</version>
</dependency>

(2)测试创建Bucket的连接

public class OSSTest {
	// Endpoint以杭州为例,其它Region请按实际情况填写。
	String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
	// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
	String accessKeyId = "<yourAccessKeyId>";
	String accessKeySecret = "<yourAccessKeySecret>";
	
	// 创建OSSClient实例。
	OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
	
	// 上传文件流。
	InputStream inputStream = new FileInputStream("<yourlocalFile>");
	ossClient.putObject("<yourBucketName>", "<yourObjectName>", inputStream);
	
	// 关闭OSSClient。
	ossClient.shutdown();   
}	

5、项目中使用OSS步骤

这里我将OSS服务 使用在微服务项目(SpringBoot+SpringCloud)中

(1)创建 gulimall-third-party模块
(2)POM.xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
</dependency>

(3)将oss相关参数配置在配置文件中方便使用

spring:
  cloud:
    alicloud:
      access-key: LTAI4Fzsbs1syidddhfQaF
      secret-key: HI5sZsLdzVyGGOuddddoHlj2Ddubla
      oss:
        endpoint: oss-cn-beijing.aliyuncs.com
        bucket: gulimall-hello

server:
  port: 30000

(4)使用官网提供的代码

在这里插入图片描述
官网地址:https://help.aliyun.com/document_detail/31926.html?spm=a2c4g.11186623.6.1718.30e94c07sh9tqa

选择Java版本。

@RestController
public class OssController {

    @Autowired
    OSS ossClient;

    @Value("${spring.cloud.alicloud.oss.endpoint}")
    private String endpoint;

    @Value("${spring.cloud.alicloud.oss.bucket}")
    private String bucket;

    @Value("${spring.cloud.alicloud.access-key}")
    private String accessId;

    @RequestMapping("/oss/policy")
    public R policy() {

        //https://gulimall-hello.oss-cn-beijing.aliyuncs.com/hahaha.jpg

        String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint
        // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
//        String callbackUrl = "http://88.88.88.88:8888";
        String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String dir = format + "/"; // 用户上传文件时指定的前缀。

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

}

这里我把代码写在Controller中方便调用,并且根据项目返回的是R对象(这里看自己项目需求)

(5)启动项目访问http://localhost:30000/oss/policy

在整合前端项目时候,会报如下错误:意思是我们本项目向阿里云访问的时候出现跨域问题。
在这里插入图片描述

解决:在阿里云创建的oss服务中开启跨域访问

在这里插入图片描述

在这里插入图片描述

三、SpringCloud

1、Ribbon负载均衡

1. 简介

目前主流的负载方案分为以下两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如F5) ,也有软件的(比如Nginx)。
  • 客户端根据自己的请求情况做负载均衡, Ribbon 就属于客户端自己做负载均衡。

Spring Cloud Ribbon是基于Netlix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时、重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则
(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。

客户端的负载均衡

例如:SpringCloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。

在这里插入图片描述

服务端的负载均衡

例如:Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器在进行负载均衡算法分配。

在这里插入图片描述
常见的负载均衡算法

  • 随机:通过随机选择服务进行执行,一般这种方式使用较少;
  • 轮训:负载均衡默认实现方式,请求来之后排队处理;
  • 加权轮训:通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;
  • 地址Hash:通过客户端请求的地址的HASH值取模映射进行服务器调度。ip hash
  • 最小链接数,即使请求均衡了,压力不一定会均衡, 最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。最小活跃数

2. 使用

1)nacos-discovery 依赖了Ribbon,可以不在引用Ribbon依赖;
在这里插入图片描述
2)添加@LoadBalanced 注解

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

3)在Controller就可以直接使用了。

2、Feign声明式远程调用

1. 简介

Feign是一个声明式HTTP客户端,它的目的就是让远程调用更加简单。Feign 提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
Feign整合了Ribbon(负载均衡)和Hystrix(服务熔断),可以让我们不再需要显式地使用这两个组件。

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

SpringCloud openFegin 对Fegin进行了增强,使其支持SpringMVC注解,另外还整合了Ribbon和Nacos,从而使得Fegin的使用更加方便

2. 使用

1)引入依赖

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

2)声明远程接口

@FeignClient("gulimall-coupon")
public interface CouponFeginService {

    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();

}

3)开启fegin功能

@EnableFeignClients(basePackages = "com.kuang.gulimall.member.fegin")

3、Gateway

1. 概念

网关作为流量的入口,常用功能包括路由转发权限校验、限流控制等。而springcloud gateway作为SpringCloud官方推出的第二代网关框架,取代了Zuul 网关。

2. 使用

1)引入依赖

 <dependency>
 	<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2)添加@EnableDiscoveryClient注解

/**
 * 1、开启服务注册发现
 * (配置nacos服务注册中心地址)
 */
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GulimallGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallGatewayApplication.class, args);
    }

}

3)在 /src/main/resources/application.properties 配置文件

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

4)在 /src/main/resources/application.yml 配置文件

spring:
  cloud:
    gateway:
      routes:
        #        - id: test_route
        #          uri: https://www.baidu.com
        #          predicates:
        #            - Query=url,baidu
        #
        #        - id: qq_route
        #          uri: https://www.qq.com
        #          predicates:
        #            - Query=url,qq

        - id: product_route
          uri: lb://gulimall-product
          predicates:
            - Path=/api/product/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: third_party_route
          uri: lb://gulimall-third-party
          predicates:
            - Path=/api/thirdparty/**
          filters:
            - RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment}

        - id: member_route
          uri: lb://gulimall-member
          predicates:
            - Path=/api/member/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: ware_route
          uri: lb://gulimall-ware
          predicates:
            - Path=/api/ware/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: admin_route
          uri: lb://renren-fast
          predicates:
            - Path=/api/**
          filters:
            - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

5)在 /src/main/resources/bootstrap.properties 配置文件

spring.application.name=gulimall-coupon

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=bffa6312-559a-4c6f-aaea-0ab468a2e684

6)启动 “gulimall-gateway

启动报错:

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

解决方法:在“io.niceseason.gulimall.gulimallgateway.GulimallGatewayApplication”中排除和数据源相关的配置

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

重新启动

访问:http://192.168.137.14:8848/nacos,查看到该服务已经注册到了Nacos中

4、Sleuth+Zipkin 服务链路追踪

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud Alibaba 全部组件说明 的相关文章

随机推荐

  • 谷粒学院(二十四)Jenkins+Maven+Github+Springboot实现可持续自动部署(非常详细)

    目录 一 安装内容二 实现过程1 不使用Jenkins2 使用Jenkins 三 准备工作1 Github仓库准备测试项目2 安装java环境 xff08 jdk环境 xff09 3 安装maven环境4 安装Git环境5 安装Docker
  • 谷粒学院【网上教育】总结

    一 项目的启动运行 1 后端项目 将后端项目克隆到本地 xff0c 导入到idea中nacos 在目录下 xff0c 打开bin文件夹 xff0c 双击 startup cmdredis xff0c 在目录下 xff0c 使用cmd xff
  • Navicat Premium 12 卸载和注册表的删除

    卸载就不用我说了 xff0c win10也好 xff0c win7也好直接windows设置里的卸载 xff0c 或者你觉得别的软件卸载的比较干净也行 不过还是不会删掉注册表 xff0c 甚至文件夹都不删除 xff1a 这是卸载 xff0c
  • JDK下载安装及环境变量配置(图片详解)

    一 下载并安装JDK 1 下载 搜索 jdk官方下载 或是直接进入Sun公司的官网 xff08 https www oracle com xff09 下面是JDK版本下载页面 xff1a https www oracle com java
  • 谷粒商城 - 项目环境搭建

    文章目录 1 安装 linux 虚拟机2 安装docker3 docker安装mysql4 docker安装redis5 开发环境统一1 Maven2 Idea amp VsCode 插件3 安装配置git 6 创建git仓库7 创建对应项
  • 《阿里云服务器搭建》------ 安装jdk

    1 首先查看我们linux服务器的操作系统 执行命令 xff1a cat proc version 备注这里是 xff08 x86 64 xff09 表示64位 2 登录Oracle官网 xff0c 下载JDK JDK官网下载 xff1a
  • IDEA连接mysql又报错!Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘

    错误界面 IDEA连接mysql xff0c 地址 xff0c 用户名 xff0c 密码 xff0c 数据库名 xff0c 全都配置好了 xff0c 点测试连接 xff0c 咔 xff01 不成功 xff01 界面是这样的 xff0c 翻译
  • 《阿里云服务器搭建》------ 安装maven

    一 下载压缩包 http maven apache org download cgi 或者百度网盘链接 xff1a https pan baidu com s 1A7bkSGomTrPLtYFq3t5WzQ 提取码 xff1a nro9 二
  • 《阿里云服务器搭建》------ 安装docker

    到docker官网找到对应环境的安装方式如 xff1a https docs docker com engine install centos 1 卸载掉旧版本 yum remove docker span class token punc
  • VM中安装Centos6.8详细步骤(图文)

    目录 1 检查BIOS虚拟化支持2 新建虚拟机3 新建虚拟机向导4 创建虚拟空白光盘5 安装Linux系统对应的CentOS版6 虚拟机命名和定位磁盘位置7 处理器配置 xff0c 看自己是否是双核 多核8 设置内存为2GB9 选择IO控制
  • Ubuntu18:使用CMake-gui编译OpenCV3源码的详细过程

    目录 一 卸载原来的opencv 二 准备工作 三 编译过程 四 测试过程 由于之前安装的OpenCV4与我的代码有多处不兼容 xff0c 所以要重新装一个OpenCV3 xff0c 顺便记录一下过程吧 OpenCV版本 xff1a ope
  • 基于音形码的中文字符串相似度算法(转)

    转自 https blog csdn net chndata article details 41114771 字符串相似度算法是指通过一定的方法 xff0c 来计算两个不同字符串之间的相似程度 通常会用一个百分比来衡量字符串之间的相似程度
  • VMware15中安装Centos7详细步骤(图文)

    文章目录 1 检查虚拟化是否开启2 新建虚拟机3 新建虚拟机向导4 创建虚拟空白光盘5 安装Linux系统对应的CentOS版6 虚拟机命名和定位磁盘位置7 处理器配置 xff0c 看自己是否是双核 多核8 设置内存为2GB9 选择IO控制
  • 设置CentOS7的网卡开机自启动

    1 可以试试这条命令 xff1a CentOS7的网卡开机启动应该是 xff1a systemctl enable network 2 若设置了始终还没有开机启动网络服务 xff0c 最好只好去改配置文件 vim etc sysconfig
  • 谷粒商城 - 架构图

    商城项目地址 xff1a 后端项目源码 xff1a https gitee com StarSea007 gulimall parent 前端项目源码 xff1a https gitee com StarSea007 gulimall vu
  • 牛客网经典120道Java面试常见题(试题+答案)

    牛客网提供了120道Java面试题 xff0c 这里整理出重点的内容 xff0c 而且对答案有疑惑 xff0c 补充了解释内容 xff0c 便于理解 1 什么是Java虚拟机 xff1f 为什么Java被称作是 平台无关的编程语言 xff1
  • Redis面试题(2021最新)

    文章目录 概述什么是RedisRedis有哪些优缺点为什么要用 Redis 为什么要用缓存 为什么要用 Redis 而不用 map guava 做缓存 Redis为什么这么快 数据类型Redis有哪些数据类型Redis的应用场景 持久化什么
  • Java基础知识面试题(2021最新)

    文章目录 1 Java概述什么是Javajdk1 5之后的三大版本JVM JRE和JDK的关系什么是跨平台性 xff1f 原理是什么 xff1f Java语言有哪些特点什么是字节码 xff1f 采用字节码的好处是什么 什么是Java程序的主
  • vagrant up下载centos7慢的解决办法

    安装完vagrant后 执行命令 vagrant init centos 7 进行初始化 会出现一个Vagrantfile文件 然后执行 vagrant up 命令下载centos 7会很慢 将红线里的地址复制到浏览器 xff0c 通过浏览
  • SpringCloud Alibaba 全部组件说明

    文章目录 一 微服务1 系统架构的演变1 xff09 单体应用架构2 xff09 垂直应用架构3 xff09 分布式架构4 xff09 SOA架构5 xff09 微服务架构 2 微服务架构常见的问题3 常见微服务架构 二 SpringClo