分布式基础篇2——分布式组件(谷粒商城)

  • 一、SpringCloud Alibaba
    • 1、简介
    • 2、为什么使用
    • 3、版本选择
    • 4、依赖选择
  • 二、SpringCloud Alibaba 组件
    • 1、Nacos作为注册中心
    • 2、OpenFeign
    • 3、Nacos作为配置中心
      • namespace
      • Data ID
      • Group
      • 同时加载多个配置文件
  • 三、Spring Cloud
    • 1、GateWay
      • 简介
      • 三大核心部分
      • 网关的使用

视频来源: 【Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目】

一、SpringCloud Alibaba

1、简介

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

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

GitHub 官网: SpringCloud Alibaba

2、为什么使用

eureka 以及 Hystrix 停止维护

分布式基础篇2——分布式组件(谷粒商城)_第1张图片

分布式基础篇2——分布式组件(谷粒商城)_第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:原Fesca,即分布式事务解决方案

分布式基础篇2——分布式组件(谷粒商城)_第3张图片

3、版本选择

由于 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
  • 2.2.x 版本适用于 Spring Boot 2.2.x
  • 2020.x 版本适用于 Spring Boot 2.4.x
  • 2021.x 版本适用于 Spring Boot 2.6.x

4、依赖选择

gulimall-common 模块中导入依赖

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.1.0.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

二、SpringCloud Alibaba 组件

1、Nacos作为注册中心

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

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

Demo案例演示: Nacos Discovery Example

1.1 下载 Nacos

下载地址: https://github.com/alibaba/nacos/releases

1.2 启动 Nacos

进入到nacos的bin目录,打开cmd命令行,输入: startup.cmd -m standalone 单机模式启动

1.3 gulimall-common 模块引入依赖

 <dependency>
     <groupId>com.alibaba.cloudgroupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
 dependency>

1.4 在模块的application配置文件中,配置Nacos注册地址以及注册服务名

spring: 
 	application:
        name: gulimall-coupon # 服务名
    cloud:
        nacos:
            discovery:
                server-addr: localhost:8848

1.5 启动类增加: @EnableDiscoveryClient 注解

@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com/atguigu/gulimall/coupon/dao")
public class GulimallCouponApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallCouponApplication.class);
    }
}

1.6 启动服务

image-20221215133506939

总结

使用 nacos-discovery 步骤:

  • 导入依赖 nacos-discovery
  • 编写配置: nacos注册中心地址、注册服务名
  • 主启动类增加注解: @EnableDiscoveryClient

2、OpenFeign

coupon作为服务提供者,member服务消费者。使用OpenFeign的前提是注册到服务注册中心

分布式基础篇2——分布式组件(谷粒商城)_第4张图片

2.1 将 gulimall-membergilimall-coupon 注册到 Nacos注册中心

2.2 在 gulimall-member 中引入 OpenFeign 依赖(在创建模块时已经引入)

2.3 在 gilimall-coupon 的 controller 层提供服务

    // 测试 OpenFeign 远程调用
    @RequestMapping("coupons")
    public R memberCoupons() {
        List<CouponEntity> list = couponService.list();
        return R.ok().put("list",list);
    }

2.4 gulimall-member 中的主启动类增加 @EnableFeignClients 注解

@SpringBootApplication
@MapperScan("com.atguigu.gulimall.member.dao")
@EnableDiscoveryClient
@EnableFeignClients
public class GulimallMemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class);
    }
}

2.5 gulimall-member 中创建远程调用接口: 明确调用了哪个服务的哪个请求

@FeignClient("gulimall-coupon") // 远程调用的服务名
public interface CouponFeign {

    @RequestMapping("/coupon/coupon/coupons") // 要写完整路径
    public R memberCoupons();
}

2.6 调用 CouponFeign 接口中的 memberCoupons 方法就相当于调用了 gilimall-coupon 中的memberCoupons 方法

    @Autowired
    private CouponFeign couponFeign;

    // 测试 OpenFeign
    @RequestMapping("coupons")
    public R testOpenFeign() {
        R r = couponFeign.memberCoupons();
        return r;
    }

总结

使用OpenFeign的步骤:

  • 服务端提供服务(方法)
  • 消费端增加OpenFeign依赖、主启动类增加 @EnableFeignClients 注解
  • 消费端创建远程调用接口,并用 @FeignClient 指明调用的服务名
  • 远程调用接口中定义服务端提供的方法
  • 消费端调用方法

3、Nacos作为配置中心

3.1 gulimall-common 中引入 config 依赖

        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>

3.2 在 gulimall-coupon 中创建 bootstrap.properties 配置文件

spring.application.name=gulimall-coupon
# 配置中心的地址
spring.cloud.nacos.config.server-addr=localhost:8848

bootstrap 会优先于 application 配置文件加载

3.3 在Nacos配置中心,创建配置文件,文件名: gulimall-coupon.properties

分布式基础篇2——分布式组件(谷粒商城)_第5张图片

3.4 使用 @Value + @RefreshScope 动态获取配置中心的配置

@RestController
@RequestMapping("coupon/coupon")
@RefreshScope // 动态刷新Nacos配置
public class CouponController {

    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private String age;

    // 测试Nacos配置中心
    @RequestMapping("testConfig")
    public R testConfig() {
        return R.ok().put("name",name).put("age",age);
    }
}

总结

使用Nacos-Config 步骤:

  • 引入依赖
  • 创建系统配置文件,配置文件名前缀 以及 配置中心地址
  • 在Nacos 中创建对应的配置文件
  • 使用 @RefreshScope + @Value 动态获取配置

namespace

命名空间(namespace) 用来做配置隔离。默认创建的配置文件都在 public 命名空间里。

比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace,不同的Namespace之间是隔离的。

分布式基础篇2——分布式组件(谷粒商城)_第6张图片

通过配置 spring.cloud.nacos.config.namespace=命名空间ID 指定加载哪个命名空间下的配置文件

如果每一个服务的配置众多,也可以根据不同的服务创建命名空间进行隔离。

Data ID

Data Id: 配置文件名

DataID 命名规则:

prefix- spring.profiles.active.file-extension

  • prefix: 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。

  • spring.profiles.active: 即为当前项目的环境(dev、test、prod)。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 prefix.extension

  • file-exetension : 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

Group

设置不同的分组,隔离配置,默认配置组是 DEFAULT_GROUP

每个服务创建自己的命名空间,使用配置分组区分环境(test、prod、dev)

分布式基础篇2——分布式组件(谷粒商城)_第7张图片

通过配置 spring.cloud.nacos.config.group=组名 指定使用哪个组。

同时加载多个配置文件

创建三个配置文件: 分别保存数据库连接、MyBatis-Plus、其他配置信息。

分布式基础篇2——分布式组件(谷粒商城)_第8张图片

分布式基础篇2——分布式组件(谷粒商城)_第9张图片

分布式基础篇2——分布式组件(谷粒商城)_第10张图片

bootstrap 配置文件:

spring.application.name=gulimall-coupon
# 配置中心的地址
spring.cloud.nacos.config.server-addr=localhost:8848
# 指定命名空间
spring.cloud.nacos.config.namespace=00319af2-fcbf-4322-996f-f501ebdf5176
# 指定组
#spring.cloud.nacos.config.group=test

# 加载多个配置文件
# 第一个
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

# 第二个
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

# 第三个
spring.cloud.nacos.config.ext-config[2].data-id=others.yaml
# 组名
spring.cloud.nacos.config.ext-config[2].group=dev
# 是否自动刷新
spring.cloud.nacos.config.ext-config[2].refresh=true

三、Spring Cloud

1、GateWay

简介

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

三大核心部分

路由: 路由是网关最基础的部分,路由信息有一个 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 将会对请求和响应进行修改处理

当前端发送请求,网关将符合断言的请求转发给对应的服务中,在请求前后均能使用过滤器完成某些操作

分布式基础篇2——分布式组件(谷粒商城)_第11张图片

网关的使用

官网帮助文档: SpringCloud Gateway

1、创建网关模块: gulimall-gateway

分布式基础篇2——分布式组件(谷粒商城)_第12张图片

2、修改SpringBoot和SpringCloud的版本

分布式基础篇2——分布式组件(谷粒商城)_第13张图片

3、配置文件

spring:
    cloud:
        nacos:
            discovery:
                server-addr: localhost: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
server:
    port: 88

4、主启动类

@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallGatewayApplication {

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

你可能感兴趣的:(#,谷粒商城,分布式,spring,cloud,微服务)