分布式基础篇2——分布式组件

news2024/12/24 21:51:35

  • 一、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/147012.html

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

相关文章

Ansible剧本流程控制

handlers触发器 notify&#xff1a;监控上面的模块执行是否发生变化 chufa&#xff1a;自定义的任务名称&#xff0c;自动去handlers里面匹配相对应的任务名称执行动作 下方是copy了/data/copy/下的文件到server2组里的主机/data/monster/handlers/下&#xff0c;notify监控发…

如何下载指定版本的xcode

如何下载指定版本的xcode一、安装最新版本xcode二、下载指定版本xcode一、安装最新版本xcode 从苹果商店中获取并安装即可。 但是安装最新版有个风险&#xff0c;就是它有系统版本的要求&#xff0c;比如这里要求macOS版本最低是12.5 如果版本不够的话&#xff0c;可以升级系统…

【蓝桥杯基础题】2020年省赛填空题—既约分数

&#x1f451;专栏内容&#xff1a;蓝桥杯刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录一、题目背景二、题目描述三、题目分析1.求最大公约数①辗转相减法②穷举法③辗转相除法④辗转相除法&#xff08;递归&am…

LVGL之学习篇(一)

LVGL之学习篇(一) 学习目的 LVGL简介 LVGL本身是一个图形库&#xff0c;前身是litterVGL。其作者是来自匈牙利的Gabor Kiss-Vamosikisvegabor&#xff0c;LVGL用C语音编写&#xff0c;以实现最大的兼容性(与C兼容)&#xff0c;模拟器可在没有嵌入式硬件的PC上启动嵌入式GUI设计…

MATLAB实验三

实验三 &#xff08;实验报告中附上每题的主要程序和结果&#xff09; 1、在命令行窗口中分别输入下列命令&#xff0c;对应输出结果是 A&#xff0e;命令x[-2:2] B&#xff0e;命令xzeros(1,2);x>0 C&#xff0e;命令ydiag(eye(3),1) D&#xff0e;命令[-2:2]30*eye(…

内存分页机制

文章目录内存分页的原因一级页表分页机制的原理一级页表二级页表二级页表概述地址转换启动分页机制内存分页的原因 在还未出现内存分页机制之前&#xff0c;我们都内存分段机制下工作。 但是&#xff0c;这样会有个问题。来看个下方的例子。 进程在分段机制下运行 下图&…

【学习记录】ORBSLAM2均匀化策略源码解析

在ORBSLAM中&#xff0c;为了保证特征的均匀分布使用了均匀化的策略&#xff0c;最近在尝试扩展一下均匀化的内容&#xff0c;所以仔细看了一下ORBSLAM源码里面这部分的内容&#xff0c;之前看源码的时候没有展开仔细看这一部分的代码&#xff0c;这里补充记录一下&#xff0c;…

未来SSD的接口趋势是什么?

针对SSD接口标准&#xff0c;目前业内有两大组织&#xff1a;PCI-SIG&#xff1a;这个就是定义pcie协议标准的那个组织&#xff0c;我们常见的传统接口M.2, U.2, 2.5英寸的接口都归这个组织定义规范。M.2&#xff0c;U.2起源与客户端&#xff0c;也是企业级当前最常用的接口形式…

elasticdump迁移ES数据详解

文章目录elasticdump 简介1.elasticdump导入ES数据到本地json文件2、将本地数据导入es中3、将es导入另一个es4 .其他参数使用--searchBody使用--searchBody 向本机ES导数据使用--typeanalyzer导出分析器elasticdump 简介 elasticdump是一个能够将es的数据快速导入、导出、迁移…

最新最全-中文生物医学命名实体识别最新研究论文、资源、数据集、性能整理分享

本资源旨在跟踪中文生物医学自然语言处理的进展&#xff0c;收集整理相关的论文列表和展示现存方法性能。内容整理自网络&#xff0c;源地址&#xff1a;https://github.com/lingluodlut/Chinese-BioNLP中文电子病历命名实体识别中文电子病历命名实体识别&#xff08;Chinese C…

《操作系统-真象还原》阅读总结/遗憾离场/加倍努力 出人头地

文章目录关于我又被老天算计奇奇怪怪的 BUG调试 BUG 的心理历程最后两天通宵调试程序的宵夜阅读建议本书所有笔记最后关于我又被老天算计 从 2022-09-14 读这本书&#xff0c;原计划是 2022-12-15 之前完成的&#xff0c;我自信能完成&#xff0c;因为11月下旬我已经开始阅读第…

【Linux】初识进程

文章目录进程控制块的引入初识进程控制块(PCB - Process Control Block)什么是PCBLinux下的PCB初见进程ps指令查看进程kill指令挂掉进程通过系统调用接口得到进程的ID(进程标识符)从根目录下的proc文件查看进程通过fork函数创建子进程进程控制块的引入 首先&#xff0c;听到进…

事故复盘 | 对不同的ID更新操作竟然也引发死锁?

对不同的ID更新操作竟然也引发死锁&#xff1f; 文章目录对不同的ID更新操作竟然也引发死锁&#xff1f;背景分析初步分析 - 怀疑程序并发问题进一步分析 - 怀疑主键缺失行级锁失效再进一步分析 - 是否存在死锁条件解决方案复盘附录示例的死锁日志常用故障排查 SQL参考链接背景…

webassembly学习

webassemblywebassembly学习基本理论webassembly介绍wasm介绍基本信息wasm会替换javascript么ASM.js&#xff08;wasm的前身&#xff09;将 WebAssembly 作为编程语言的一种尝试wasm应用场景wasm运行原理周边生态WASI 操作系统接口wasi介绍wasmwasi&#xff08;服务端&#xff…

平台总线式驱动开发——基本框架

1. 总线、设备和驱动 硬编码式的驱动开发带来的问题&#xff1a; 垃圾代码太多结构不清晰一些统一设备功能难以支持开发效率低下 1.1 初期解决思路&#xff1a;设备与驱动分离 struct device来表示一个具体设备&#xff0c;主要提供具体设备相关的资源&#xff08;如寄存器地…

ES为什么要移除types类型

文章目录elasticsearch&#xff08;集群&#xff09;中可以包含多个索引index&#xff08;数据库&#xff09; ,每个索引中可以包含多个类型types&#xff08;表&#xff09; ,每个类型下又包含多个文档Document&#xff08;行&#xff09; ,每个文档中又包含多个字段Field&…

姿态估计评价指标

PCK 正确估计出关键点的百分比 &#xff08;Percentage of Correct Keypoints&#xff09;&#xff0c;现在已基本不用。 PCKik∑iδ(did≤Tk)∑i1PCK_i^k\frac{\sum_i\delta(\frac{d_i}{d}\leq T_k)}{\sum_i1} PCKik​∑i​1∑i​δ(ddi​​≤Tk​)​ 检测出的关键点与其对应…

1 机器学习之线性回归

学习笔记自&#xff0c;慕课网 《Python3 入门人工智能》 https://coding.imooc.com/lesson/418.html#mid33109 麻雀虽小&#xff0c;五脏俱全 1.1 回归分析 1.2 线性回归问题求解 1.3 寻找最合适的 a、b&#xff0c;引入损失函数的概念 尽可能使损失函数最小即找到了最合适的…

(重要)实数域上一切范数等价的证明

证明&#xff1a;实数域上一切范数等价编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;首先需要明确范数等价的条件&#xff0c;这里的条件等价于夹逼&#xff0c;就是A小于等于B&#xff0c;B小于等于A&#xff0c;那么A肯定等于B。利用这个…

【MySQL】InnoDB存储引擎的行结构

文章目录前言1、MySQL的体系结构2、InnoDB逻辑存储结构3、InnoDB记录行结构3.1、概述3.2、语法操作3.3、Compact行格式3.3.1、示意图3.3.2、记录的额外信息3.3.3、记录的真实数据3.3.4、定长字段补充3.4、行溢出前言 MySQL服务器上负责对表中数据的读取和写入工作的部分是存储…