• 谷粒商城 (七) --------- SpringCloud Alibaba 基础配置



    一、SpringCloud Alibaba 简介

    简介

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

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

    文档:https://github.com/alibaba/spring-cloud-alibaba

    为什么使用 SpringCloudAlibaba

    在这里插入图片描述
    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,即分布式事务解决方案

    版本选择

    由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且spring-cloud-commons 从 1.x.x 版本升级到 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

    整体架构图

    在这里插入图片描述

    如何使用?

    首先我们要在 gulimall-common 中添加 SpringCloud Alibaba 的依赖,此时要查看官方文档选择适配的版本

    在这里插入图片描述

    在这里插入图片描述

    在 gulimall-common 工程中,添加如下依赖

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.2.8.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    项目整体重新导入即可

    二、Nacos 组件作为注册中心

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

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

    首先把服务注册发现依赖,放入 common 的 pom.xml 中

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    然后我们来下载 nacos-server 即 nacos 服务中心

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

    下载完后进行解压,双击 startup.cmd 其中注册中心
    在这里插入图片描述
    发现启动失败,因为高版本默认是集群启动
    在这里插入图片描述
    修改 startup.cmd 文件,设置其为单机启动模式

    在这里插入图片描述
    在 批处理文件中 rem 表示注释

    在这里插入图片描述在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址

    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
    • 1

    在这里插入图片描述

    使用 @EnableDiscoveryClient开启服务注册发现功能 @SpringBootApplication

    @EnableDiscoveryClient
    public class ProviderApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(Application.class, args);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    启动服务,在网页中进行查看

    在这里插入图片描述

    浏览器中输入: http://localhost:8848/nacos/#/login

    在这里插入图片描述
    输入默认账号密码:nacos、nacos

    在这里插入图片描述
    发现没有服务,我们需要配置服务名

    在这里插入图片描述

    重跑项目刷新网页,有此服务上线

    在这里插入图片描述

    三、测试服务之间的远程调用

    我们接着再把 gulimall-member 服务注册进来

    Nacos 使用三步:

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

    测试使用 feign 远程调用

    1. Feign 简介

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

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

    2. Feign 使用

    A、Feign的依赖我们在创建项目时已导入

    在这里插入图片描述
    B、编写 Controller 中方法

    调用优惠券服务。。

    在这里插入图片描述
    C、引入远程调用

    想要远程调用别的服务

    1)引入 open-feign
    2)编写一个接口,告诉 SpringCloud 这个接口需要调用别的远程服务
    (1)声明接口的每一个方法都是调用哪个远程服务的那个请求
    3)开启远程调用功能

    首先在 member 模块创建远程调用接口的存放包名,然后在包内创建接口 CouponFeignService,在其中编写代码。

    在这里插入图片描述
    接下来在启动类上加上 @EnableFeignClients 开启远程调用

    在这里插入图片描述

    D、测试

    首先编写member模块 Controller 类中测试方法

    在这里插入图片描述
    然后重新启动俩个服务,地址栏输入路由回车,出现以下则查询成功
    在这里插入图片描述

    3. Feign 原理

    在这里插入图片描述

    四、Nacos 作为配置中心

    Nacos 作为配置中心来管理配置

    首先在 common 中导入配置中心的相关依赖

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据,这个配置文件是SpringBoot 规定的,会优先于 application.properties 来加载

    在这里插入图片描述
    先从本地来获取配置,在 application.properties 中先写相关测试变量,然后写测试方法获取

    在这里插入图片描述

    在这里插入图片描述
    可正常获取到本地配置
    在这里插入图片描述

    然后从配置中心动态获取配置,因为要在项目中修改配置需要将项目重新打包部署,太麻烦了

    首先新建配置,将本地配置的内容 copy 过来进行修改。

    在这里插入图片描述

    在这里插入图片描述

    发布配置后如图

    在这里插入图片描述
    在相应 Controller 上加入 @RefreshScope 注解

    在这里插入图片描述

    即可动态获取配置中心修改的值

    在这里插入图片描述

    五、配置中心相关细节

    命名空间:

    用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group 或Data ID的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

    默认:public(保留空间),默认新增所有配置都在 public

    在这里插入图片描述

    在这里插入图片描述
    修改项目命名空间:

    在这里插入图片描述

    开发、测试、生产,利用命名空间来做环境隔离,当然也可以每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己的命名空间下的配置

    在这里插入图片描述

    总之,通过命名空间我们可以根据开发环境进行隔离,也可以根据各个微服务进行隔离。

    配置集:

    一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

    在这里插入图片描述

    类似文件名,即 Data Id

    配置分组:

    Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如Buy 或Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如database_url 配置和 MQ_topic 配置。

    默认所有的配置集都属于:DEFAULT_GROUP

    不同场景下使用不同分组的配置,比如双11、平时、618

    在这里插入图片描述

    加载多配置集

    配置文件中对数据源的相关配置、框架相关配置进行拆分成多个配置文件,便于维护。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    配置文件集成

    在这里插入图片描述

    注意:配置中心的内容优先本地配置

    六、Gateway 网关概述

    1. 简介

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

    网关性能对比:

    在这里插入图片描述

    网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。Spring Cloud Gateway 旨在提供一种简单而有效的方式来对 API 进行路由,并为他们提供切面,例如:安全性,监控/指标 和弹性等。

    官方文档地址: https://spring.io/projects/spring-cloud-gateway/

    2. 特点

    • 基于 Spring5,支持响应式编程和 SpringBoot 2.0
    • 支持使用任何请求属性进行路由匹配
    • 特定于路由的断言和过滤器
    • 集成 Hystrix 进行断路保护
    • 集成服务发现功能
    • 易于编写 Predicates 和 Filters
    • 支持请求速率限制
    • 支持路径重写

    思考:

    为什么使用 API 网关?

    API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

    • 客户端会多次请求不同的微服务,增加了客户端的复杂性。
    • 存在跨域请求,在一定场景下处理相对复杂。
    • 认证复杂,每个服务都需要独立认证。
    • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
    • 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

    以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性。

    使用 API 网关后的优点如下:

    • 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
    • 易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
    • 减少了客户端与各个微服务之间的交互次数。

    3. 核心概念

    路由

    路由是网关最基础的部分,路由信息有一个 ID、一个目的URL、一组断言和一组Filter 组成。如果断言路由为真,则说明请求的 URL 和配置匹配

    断言

    Java8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是Spring5.0 框架中的ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息,比如请求头和参数等。

    过滤器

    一个标准的 Spring webFilter。Spring cloud gateway 中的 filter 分为两种类型的 Filter,分别是 Gateway Filter 和 Global Filter。过滤器 Filter 将会对请求和响应进行修改处理

    工作原理

    在这里插入图片描述

    客户端发送请求给网关,弯管 HandlerMapping 判断是否请求满足某个路由,满足就发给网关的 WebHandler。这个 WebHandler 将请求交给一个过滤器链,请求到达目标服务之前,会执行所有过滤器的 pre 方法。请求到达目标服务处理之后再依次执行所有过滤器的 post 方法。

    一句话:满足某些断言 (predicates) 就路由到指定的地址 (uri) ,使用指定的过滤器 (filter)

    七、配置测试 API 网关

    首先,我们来创建网关模块

    在这里插入图片描述
    在这里插入图片描述

    同样的,也是要依赖 common 工程

    在这里插入图片描述
    把 gulimall-gateway 模块添加到根模块中,还要修改 SpringBoot 与 SpringCloud 版本信息,与其他模块一致

    在这里插入图片描述
    然后,开启网关服务的注册与发现

    在这里插入图片描述
    配置注册中心地址

    在这里插入图片描述
    同时加入配置中心的配置文件

    在这里插入图片描述
    在这里插入图片描述
    启动服务,记得排除数据库相关的数据源

    在这里插入图片描述

    配置路由规则:

    在这里插入图片描述

  • 相关阅读:
    Docker-Compose构建spark集群
    Vue--Router--路由传参的方法
    SATA系列专题之三:3.4 Transport Layer传输层Error处理机制解析
    计算机毕业设计Java校园跑腿平台演示录像2020(源码+系统+mysql数据库+Lw文档)
    SpringBoot 使用 Redisson
    请看看我的stata回归分析思路有没有问题?
    初识Java 9-2 内部类
    让丢失成为过去,尽在我们的智能防丢器
    vue实现水滴球
    跟着视频学习java,发现swagger打不开?怎么解决
  • 原文地址:https://blog.csdn.net/m0_51111980/article/details/126672271