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

news2024/11/18 14:47:31

  • 一、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 停止维护

image-20221215110952812

image-20221215111026773

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

image-20221215130340894

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.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </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.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </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的前提是注册到服务注册中心

image-20221215131800691

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 依赖

        <!--Nacos配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </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

image-20221215153625908

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之间是隔离的。

image-20221215160208061

通过配置 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)

image-20221215161707862

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

同时加载多个配置文件

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

image-20221215192454334

image-20221215192551220

image-20221215192645301

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 将会对请求和响应进行修改处理

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

image-20221221144236696

网关的使用

官网帮助文档: SpringCloud Gateway

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

image-20221221151518263

2、修改SpringBoot和SpringCloud的版本

image-20221221151634461

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

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

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

相关文章

爬虫学习+实战

爬虫 概念&#xff1a; 网络爬虫&#xff1a;就是模拟客户端发送请求&#xff0c;获取响应数据&#xff0c;一种按照一定的规则&#xff0c;自动地抓取万维网上的信息的程序或者脚本 爬虫分类: 通用爬虫&#xff1a;抓取系统中重要的组成部分。抓取的是一整张页面数据聚焦爬…

I2C总线驱动

一. I2C背景知识 SOC芯片平台的外设分为&#xff1a; 一级外设&#xff1a;外设控制器集成在SOC芯片内部二级外设&#xff1a;外设控制器由另一块芯片负责&#xff0c;通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit&#xff1a; 字面意思是用于“集成电路之间”的…

SELECT COUNT(*) 会造成全表扫描?回去等通知吧

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/T…

CPU_并行(多线程)不同高性能旋转图片

并行(多线程)不同高性能旋转图片 代码 ImageStuff.h struct ImgProp {int Hpixels;int Vpixels;unsigned char HeaderInfo[54];unsigned long int Hbytes; };struct Pixel {unsigned char R;unsigned char G;unsigned char B; };unsigned char** CreateBlankBMP(); unsigned…

Java中>>,>>=,<<,<<=运算符

今天在刷LeetCode的时候遇到了一个运算符<<&#xff0c;对这个运算符的意思有点模糊&#xff0c;然后便开始面向百度学习&#xff0c;但是发现&#xff0c;很多篇帖子表达的意思太文章化&#xff0c;不够通俗易懂&#xff0c;于是打算写下这篇帖子&#xff0c;让大家能够…

工作笔记——微信支付开发相关知识整理

在最近的工作中&#xff0c;引入了微信小程序支付&#xff0c;在开发过程中积累和整理了一些技术知识&#xff0c;现将其整理如下 目录 一、概念认识 &#xff08;一&#xff09;术语介绍 &#xff08;二&#xff09;名词解释 &#xff08;四&#xff09;对接微信支付接口规…

Win10安卓子系统安装教程

Win10安卓子系统安装教程必要安装文件下载和安装子系统安装方法方法一&#xff1a;安装 WSA PacMan方法二&#xff1a;安装 APK安装程序必要安装文件下载和安装 win10安卓子系统和win11子系统的安装一样&#xff0c;都必须要安装适用于 Android ™的 Windows 子系统设置的软件…

Java设计模式中行为型模式是什么/模板方式又是什么,编程怎么运用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.行为型模式 6.1 概述 6.1.1 特点 用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎么相互协作共同完成单个对象都无法单独完成任务涉…

分布式基础篇3——前端开发基础知识(谷粒商城)

前端技术对比一、ES61、简介2、什么是 JavaScript3、ES6新特性3.1 let3.2 const3.3 解构表达式3.4 字符串扩展3.5 函数优化3.6 对象优化3.7 map 和 reduce3.8 Promise3.9 模块化二、Vue1、MVVM 思想2、Vue 简介3、Vue 入门案例4、Vue 指令插值表达式v-text、v-htmlv-bindv-mode…

【CANN训练营第三季】基于昇腾PyTorch框架的模型训练调优

文章目录性能分析工具PyTorch Profiling性能分析工具CANN Profiling结业考核1、使用Pytorch实现LeNet网络的minist手写数字识别。2、采用课程中学习到的手工或者自动迁移方式&#xff0c;将上述脚本迁移到昇腾npu上&#xff0c;单机单卡&#xff0c;提供迁移脚本&#xff0c;突…

YOLOv5视觉AI库安装

打开YOLOv5开源仓库: https://github.com/ultralytics/yolov5/blob/master/README.zh-CN.md下载源码:安装 : pip install -r requirements.txt完成安装目标检测推理可通过PyTorch Hub加载YOLOv5检测模型检测图像并返回数据帧使用YOLOv5要先安装opencv-python和pandas库安装open…

C#,图像二值化(18)——全局阈值的模糊集理论算法(Huang Thresholding)与源程序

1 模糊集理论模糊集理论,也称为模糊集合论,或简单地称为模糊集,1965年美国学者扎德在数学上创立了一种描述模糊现象的方法—模糊集合论。这种方法把待考察的对象及反映它的模糊概念作为一定的模糊集合&#xff0c;建立适当的隶属函数&#xff0c;通过模糊集合的有关运算和变换&…

arduino - pinMode参数1的确定 - 以arduino nano every核心板为例

文章目录arduino - pinMode参数1的确定 - 以arduino nano every核心板为例概述笔记pins_arduino.hABX00028-datasheet.pdf简单的辨认管脚号就照ABX00028-datasheet.pdf来ENDarduino - pinMode参数1的确定 - 以arduino nano every核心板为例 概述 arduino nano every的核心板使…

我的交易抽象思路分享

这几天我老是抛出一些问题给老师们&#xff0c;都是故意而为之&#xff0c;因为我靠这种方式自己引导自己很多年&#xff1b; 比如&#xff1a;龙头真的存在么&#xff1f;为何前几天它还不是龙头&#xff0c;怎么今天就是了&#xff1f; 再如&#xff1a;交易模式和交易系统…

微信小程序解密encryptedData报错pad block corrupted

前要&#xff1a; 今天调试一下微信授权登录的时候老是第一次报错解密失败pad block corrupted&#xff0c;第二次授权的时候正常&#xff0c;因为第一次已经获取到手机号码&#xff01; 后端代码&#xff1a; public static JSONObject getUserInfo(String encryptedData, S…

微信自动回复软件

软件介绍 软件名称&#xff1a; 微信超级管家 适用平台&#xff1a; windows 是否免费&#xff1a; 完全免费 病毒检测&#xff1a; 火绒安全检测通过 流氓检测&#xff1a; 无广告、无弹窗、无其他流氓行为 软件大小&#xff1a; 183M 这个软件依赖的是本地微信客户端&#x…

C++ 初始化列表详解

目录 1.什么是初始化列表 2.什么时候需要使用初始化列表&#xff1f; 3.初始化列表的效率 4.初始化列表的初始化顺序 1.什么是初始化列表 class A { public:A(int value):m_dada(value){}private:int m_dada; }; 如上图&#xff0c;红色圈起来的部分&#xff0c;就是构造函…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《5》

在上一篇文章的介绍中&#xff0c;我们知道语义分割可以对图像中的每个像素进行类别预测。这节主要讲关于全卷积网络(Fully Convolutional Network,FCN)&#xff0c;实现从图像像素到像素类别的变换。 那这里的卷积神经网络跟以往的有什么不一样的地方吗? 这里的网络是通过转置…

Java中享元模式是什么/享元模式有什么用,编程如何实现,哪里用到了享元模式

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 5.8 享元模式 5.8.1 概述 运用共享技术来有效地支持大量细粒度对象的复用&#xff0c;通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象…

图文并茂strapi 4.5.5自定义搭建指南以及数据库字段名接口返回mapping分析

strapi是什么&#xff1f; 基于Nodejs的开源免费CMS框架 为什么选择它&#xff1f; 基于nodejs,100&#xff05;JavaScript&#xff0c;上手迅速可轻松创建功能强大且可自定义的API可以使用任何喜欢的数据库 先决条件 首先你的电脑需要具备以下环境&#xff0c;再执行命令…