当前位置: 首页 > news >正文

SpringCloud概述和环境搭建

SpringCloud概述和环境搭建

  • 一.微服务的引入
    • 1.单体架构
    • 2.集群和分布式架构
    • 3.集群和分布式
    • 4.微服务架构
    • 4.微服务的优缺点
  • 二.微服务解决方案-SpringCloud
    • 1.Spring Cloud简介
    • 2.Spring Cloud版本
    • 3.Spring Cloud实现方案
    • 4.Spring Cloud Alibaba
  • 三.环境搭建
    • 1.安装JDK17
    • 2.Ubantu上下载JDK17
    • 3.Ubantu环境下安装MySQL
  • 四.服务拆分
    • 1. 单⼀职责原则
    • 2.服务自治
    • 3. 单向依赖
  • 五.工程搭建
    • 1.父工程的搭建
    • 2.子工程的搭建
  • 六.远程调用
    • 1.需求
    • 2.实现
    • 3.RestTemplate
      • REST
      • RESTful
      • RESTful实践
      • 上述项目存在的问题

一.微服务的引入

下图表示了服务架构从单体应用逐渐转变为微服务应用的过程:在这里插入图片描述

1.单体架构

很多创业公司早期或者传统企业会把业务的所有功能实现都打包在一个项目,这就是单体架构。业务的所有功能实现都打包在一个war包或者Jar包中,这种方式就称为单体架构。比如Spring课程中的博客系统,前端+后端+数据库实现,都在⼀个项目中,这种架构就称为单体架构。

以大家都很熟悉的电商系统为例,电商系统包括:用户管理,商品管理,订单管理,支付管理,库存管理,物流管理等等,项目早期我们会把这些模块都写在⼀个web项目中,然后统⼀部署到⼀个Web服务器中。

这种架构开发简单,部署简单一个项目就包含了所有的功能,省去了多个项目之间的交互和调用消耗
直接部署在一个服务器即可。
在这里插入图片描述

2.集群和分布式架构

当网站的用户量越来越大,需求也会越来越多,流量也会越来越大,服务可能就会面临以下问题:

  • 后端服务器的压力就会越来越大,负载越来越高,甚至出现无法访问的情况
  • 业务场景逐渐复杂。为了满足用户的需求,单体应用也会越来越大。各个业务代码之间的耦合度也会
    越来越高,任何一个问题,都需要整个项目重新构建,发布。
  • ⼀个微小的问题,可能会导致整个应用挂掉。

我们从两个方面进行优化:

  • 横向:添加服务器,把单台机器变成多台机器的集群。
  • 纵向:把⼀个应用,按照业务进行拆分,拆分为多个项⽬。此架构也称为垂直架构。

以单体结构规模的项目为单位进行垂直划分。也就是将一个大项目拆分成⼀个⼀个单体结构项目,项目和项目之间相对比较独立,接口多为数据同步功能。

在这里插入图片描述

3.集群和分布式

  • 集群(cluster)是将一个系统完整的部署到多个服务器上,每个服务器都能提供系统的所有服务,多个服务器通过负载均衡调度完成任务。每个服务器称为集群的节点。
  • 分布式是将一个系统拆分为多个子系统,多个子系统部署在多个服务器上,多个服务器上的子系统
    协同合作完成一个特定任。

比如:
⼀个饭店只有⼀个厨师,这个厨师负责备菜,洗菜,切菜,炒菜。随着这个饭店的生意越来越好,这个厨师忙不过来了,饭店⼜请了⼀个厨师,新厨师和老厨师做⼀样的事情,也是洗菜,切菜,炒菜,这两个厨师的关系就是集群。
为了让厨师专⼼炒菜,饭店⼜请了⼀个配菜师,负责备菜,洗菜,切菜。厨师和配菜师的关系就是分布式。后来⼀个配菜师也忙不过来了,⼜请了⼀个配菜师,这两个配菜师的关系就是集群

在这里插入图片描述

集群和分布式区别和联系

  1. 从概念上:集群是多个计算机做同样的事,分布式是多个计算机做不同的事。
  2. 从功能上:集群的每一个节点功能是相同的,并且可以替代的,分布式也是多个节点组成的系统,但是每个节点完成的业务是不同的,一个节点出现问题,这个业务就不可访问了。
  3. 从关系上:分布式和集群在实践中,很多时候是互相配合使⽤的。比如分布式的某一个节点,可能由一个集群来代替。分布式架构大多是建立在集群上的。所以实际的分布式架构设计中并不会把分布式和
    集群单独区分,而是统称:分布式架构。

4.微服务架构

从上图中可以看出,按照业务进行拆分后,会有一些重复的功能开发,比如订单系统,电商平台和支付系统都会涉及。

在分布式架构下,当部署的服务越来越多,重复的代码就会越来越多,服务的调⽤关系也会越来越复杂
我们可以把⼀些通用的,会被多个上层服务调⽤的共享业务,提取成独立的基础服务,组成⼀个个微小的服务,这就是微服务.

简单来说,微服务就是很小的服务。小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行,微服务之间可以采用REST和RPC协议进行通信。

从这个角度来看,微服务架构是分布式架构的⼀种拓展,这种架构模式下它拆分粒度更小,服务更独立。可以理解为:微服务是⼀种经过良好架构设计的分布式架构方案。
在这里插入图片描述
分布式架构&微服务架构

  • 分布式:服务拆分,拆了就行。
    微服务:指非常微小的服务,更细粒度的垂直拆分,通常指不能再拆的服务。

  • 分布式架构侧重于压力的分散,强调的是服务的分散化。微服务侧重于能力的分散,更强调服务的专业化和精细分工。从实践的角度来看,微服务架构通常是分布式服务架构,反之则未必成立。所以,选择微服务通常意味着需要解决分布式架构的各种难题。

4.微服务的优缺点

优点:

  • 易开发和维护:每个微服务负责的业务比较清晰,体量小,开发和维护成本降低。
  • 容错性高:⼀个服务发生故障,可以使故障隔离在单个服务中,不影响整体服务故障。
  • 扩展性好:每个服务都是独立运行的,我们可以结合项⽬实际情况进行扩展,按需伸缩。
  • 技术选型灵活:每个微服务都是单独的团队来运维,可以根据业务特点和团队特点,选择适合的技术
    栈。

缺点:

  • 运维成本:一个业务流程会涉及多个微服务共同完成,有更多的服务需要编译,部署,运行,甚至可能是不同的编程语言,不同的运行环境,当然也需要集群来处理故障转移等。这对于运维⼈员而言,挑战是巨大的。
  • 开发和测试:一个业务流程可能涉及多个微服务共同完成,服务调⽤引入网络延迟,不可靠的⽹络,如何进行容错处理等问题。这对开发和测试而言,难度也会提升。
  • 服务监控:在⼀个单体结构中,很容易实现服务的监控。因为所有功能都在⼀个服务中,微服务架构
    下,不仅需要对整个链路进行监控,还需要对每⼀个服务实现监控。
  • 负载均衡:微服务架构中的服务实例数量可能非常庞大,因此需要有效的服务发现和负载均衡机制
    来管理请求流量和保证高可用性。

栗子:

比如企业员⼯管理员工少的时候,⼀个员工可能各方面的工作都要会,但是员工之间的协同工作会少⼀点,员工管理也会相对简单。
随着企业的发展,事情越来越多,⼀个员工的能力有限,就需要招聘更多的⼈,这时候就涉及到员工的
管理了。员工越多,员工的管理就越复杂服务也是类似.

二.微服务解决方案-SpringCloud

1.Spring Cloud简介

可以通过点击此处查看Spring Cloud官方的介绍Spring Cloud简介

简单地说:Spring Cloud 是一个基于 Spring Boot 的 分布式系统开发工具集,专注于简化微服务架构的构建、部署和运维。它提供了一系列开箱即用的组件,覆盖了服务治理、配置管理、容错处理、安全等关键领域,是 Java 生态中实现微服务的核心框架之一。

Spring Cloud并不是Spring团队研发的框架,它只是把⼀些比较优秀的解决微服务架构中常见问题的开源框架基于SpringCloud规范进行了整合,并基于SpringBoot的风格,对这些组件进行封装,屏蔽掉了复杂的配置和实现原理。为开发者提供了开箱即用的微服务开发体验。这些开源技术的框架是由各个公司来维护的。Spring Cloud就是这些微服务的大管家.

2.Spring Cloud版本

在这里插入图片描述

3.Spring Cloud实现方案

在Spring Cloud的规范下,有很多实现,其中最为出名的是

  • Spring Cloud Netflix
  • Spring Cloud Alibaba

Spring Cloud Netflix
Spring Cloud Netflix是 Netflix OSS(Netflix Open Source Software)在Spring Cloud规范下的实现.
包含的组件及其主要功能⼤致如下:

  • Eureka: 服务注册和发现
  • Zuul: 服务网关
  • Ribbon: 负载均衡
  • Feign: 服务调用组件
  • Hystrix: 断路器,提供服务熔断和限流
  • Hystrix Dashboard:监控面板

在很长的一段时间里,Spring Cloud ⼀度被泛指 Spring Cloud Netflix。Spring Cloud一直以来把Netflix OSS 套件作为其官放默认的⼀站式解决方案。然而,Netflix公司在2018年前后宣布其核心组件Hystrix、Ribbon、Zuul等均进⼊维护状态,Spring Cloud 也被迫宣布删除这些维护模块。

spring-cloud-netflix 并没有从Spring Cloud的依赖中完全删除,只是从2020.0版本起,他只管理Eureka.

Spring Cloud Netflix 在很多公司都有大规模使用,一旦停止更新,短期看影响不大,但长期显然是不合
适的,Spring Cloud官方也提供了⼀些替换建议。在这里插入图片描述

4.Spring Cloud Alibaba

标题是超链接,可以跳转到Spring Cloud Alibaba的官方文档

Spring Cloud Alibaba 是阿里巴巴集团下的开源组件和云产品在Spring Cloud规范下的实现。虽然Spring Cloud Alibaba⽬前并不是Spring Cloud官方推荐的默认方案,但是Spring Cloud Alibaba 是阿里中间件团队主导的⼀个新生项目,正处于高速迭代中。甚至在Alibaba的开源组件还没有织入Spring Cloud生态之前,就已经在各大公司广泛使用了.

如果说Spring Cloud Netflix 是 Spring Cloud 的第一代实现,那么Spring Cloud Alibaba 也可以看做是
Spring Cloud 的第⼆代实现,主要由 Nacos、Sentinel、Seata 等组件组成。在这里插入图片描述
Spring Cloud Alibaba 吸收了 Spring Cloud Netflix 微服务框架的核心架构思想,并进行了高⾼性能改
进。自Spring Cloud Netflix 进⼊停更维护后,Spring Cloud Alibaba 逐渐代替它成为主流的微服务框
架。
在这里插入图片描述

三.环境搭建

1.安装JDK17

JDK安装地址

Spring Cloud 是基于 SpringBoot 进行开发的,SpringBoot 3.X以下的版本,Spring官方已不再进行维
护(还可以继续使用),SpringBoot 3.X的版本,使用的JDK版本基线为JDK17。

2.Ubantu上下载JDK17

更新软件包
sudo apt update
安装JDK
sudo apt install openjdk-17-jdk

在这里插入图片描述

检查JDK版本:
java -version

在这里插入图片描述

如果需要卸载按照下面的步骤:
检查安装的是哪个OpenJDK
dpkg --list | grep -i jdk

移除 openjdk包:
apt-get purge openjdk*
卸载 OpenJDK 相关包:
apt-get purge icedtea-* openjdk-*
检查所有 OpenJDK包是否都已卸载完毕:
dpkg --list | grep -i jdk

3.Ubantu环境下安装MySQL

查找安装包
apt list |grep “mysql-server”
安装mysql
sudo apt install mysql-server

在这里插入图片描述

查看一下MySQL状态:sudo systemctl status mysql

在这里插入图片描述

安装设置:sudo mysql_secure_installation

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

设置密码
进入到MySQL中:sudo mysql
使用alter user来修改密码:ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY 你的密码;

在这里插入图片描述

四.服务拆分

服务拆分原则:
微服务到底多小才算"微",这个在业界并没有明确的标准。微服务并不是越小越好,服务越小,微服务架构的优点和缺点都会越来越明显。

服务越小,微服务的独立性就会越来越高,但同时,微服务的数量也会越多,管理这些微服务的难度也会提高。所以服务拆分也要考虑场景。

还是以企业管理为例,企业中一个员工的工作内容与企业规模,项目规模等都有关系。在小公司,一个员工可能需要负责很多部门的事情,大公司的话,一个部门的工作可能需要多个员工来处理。

拆分微服务—般遵循如下原则:

1. 单⼀职责原则

单一职责原则原本是面向对象设计中的一个基本原则,它指的是一个类应该专注于单一功能。不要存在
多于一个导致类变更的原因。在微服务架构中,一个微服务也应该只负责一个功能或业务领域,每个服务应该有清晰的定义和边界,只关注自己的特定业务领域。

2.服务自治

服务自治是指每个微服务都应该具备高度自治的能力,即每个服务要能做到独立开发,独立测试,独立构建,独立部署,独立运行。

在这里插入图片描述

以上面的电商系统为例,每一个微服务应该有自己的存储,配置,在进行开发,构建,部署,运行和测试时,并不需要过多关注其他微服务的状态和数据。

3. 单向依赖

微服务之间需要做到单向依赖,严禁循环依赖,双向依赖
循环依赖:A -> B -> C ->A
双向依赖:A -> B,B -> A

在这里插入图片描述

五.工程搭建

1.父工程的搭建

  1. 先创建一个空项目:
    在这里插入图片描述

  2. 删除src:在这里插入图片描述

  3. 对pom文件进行配置:

DependencyManagement 和 Dependencies :
1.dependencies :将所依赖的jar直接加到项目中。子项目也会继承该依赖。
2.dependencyManagement :只是声明依赖,并不实现Jar包引入。如果子项目需要用到相关依赖,
需要显式声明。如果子项目没有指定具体版本,会从父项目中读取version。如果子项目中指定了版本
号,就会使用子项目中指定的jar版本。此外父工程的打包方式应该是pom,不是jar,这里需要手动
使用 packaging 来声明.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-cloud-demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><relativePath/> <!-- lookup parent from repository --></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><java.version>17</java.version><mybatis.version>3.0.3</mybatis.version><mysql.version>8.0.33</mysql.version><spring-cloud.version>2022.0.3</spring-cloud.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>${mybatis.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement></project>

2.子工程的搭建

  1. 在父工程中创建一个Module
    在这里插入图片描述
  2. 创建子工程的空项目
    在这里插入图片描述
  3. 子工程的POM文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.example</groupId><artifactId>spring-cloud-demo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>order-service</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
  1. 手写启动类和配置文件:在这里插入图片描述
    在这里插入图片描述

六.远程调用

1.需求

当前写了两个简单的子工程,一个子工程是OrderService,一个子工程师ProductService,此时根据订单查询订单信息时,根据订单里产品ID,获取产品的详细信息:在这里插入图片描述

2.实现

实现思路:order-service服务向product-service服务发送⼀个http请求,把得到的返回结果,和订单结
果融合在⼀起,返回给调用方。实现方式:采用Spring 提供的RestTemplate (实现http请求的方式,有很多,可点击此处)

  1. 定义RestTemplate在这里插入图片描述

  2. 在OrderInfo中引入了ProductInfo,并且在OrderService的子工程的model包中引入了ProductInfo:在这里插入图片描述

  3. 修改order-service中的OrderService在这里插入图片描述

  4. 结果在这里插入图片描述

3.RestTemplate

RestTemplate 是从 Spring3.0 开始支持的⼀个 HTTP 请求工具,它是⼀个同步的 REST API 客户端,提供了常见的REST请求方案的模版。

REST

REST(Representational State Transfer),表现层资源状态转移。REST是由HTTP的主要设计者Roy Fielding博士在2000年他的博士论文中提出来的⼀种软件架构风格。

主要有三个概念:

  1. 资源:网络上的所有事物都可以抽象为资源,每个资源都有一个唯一的资源标识符(URI)
  2. 表现层:资源的表现形式,比如文本作为资源,可以用txt格式表现,也可以通HTML,XML,JSON等格式来表现,甚至以二进制的格式表现。
  3. 状态转移:访问URI,也就是客户端和服务器的交互过程。客户端用到的手段,只能是HTTP议。这
    个过程中,可能会涉及到数据状态的变化。比如对数据的增删改查,都是状态的转移。

REST是⼀种设计风格,指资源在网络中以某种表现形式进行状态转移。简单来说:REST描述的是在⽹络中Client和Server的⼀种交互形式,REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口)

RESTful

REST 是一种设计风格,并没有⼀个明确的标准。满足这种设计风格的程序或接⼝我们称之RESTful(从
单词字⾯来看就是⼀个形容词)。所以RESTful API 就是满足REST架构风格的接⼝。

主要特征:

  1. 资源:资源可以是⼀个图片,音频,视频或者JSON格式等网络上的一个实体,除了一些二进制的资源外普通的文本资源更多以JSON为载体、面向用户的一组数据(通常从数据库中查询而得到)
  2. 统一接口:对资源的操作。比如获取,创建,修改和删除。这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。换言而知,如果使⽤RESTful⻛格的接⼝,从接⼝上你可能只能定位其资源,但是无法知晓它具体进行了什么操作,需要具体了解其发生了什么操作动作要从其HTTP请求方法类型上进行判断

比如同⼀个的URL:
GET/blog/{blogId}:查询博客
DELETE/blog/{blogId}:删除博客
这些内容都是通过HTTP协议来呈现的。所以RESTful是基于HTTP协议的。

RestTemplate 是Spring提供,封装HTTP调用,并强制使用RESTful风格,它会处理HTTP连接和关闭,只需要使用者提供资源的地址和参数即可。

RESTful实践

RESTful风格的API 固然很好很规范,但大多数互联网公司并没有按照其规则来设计,因为REST是⼀种风格,而不是⼀种约束或规则,过于理想的RESTful API 会付出太多的成本。

RESTful API 缺点:

  1. 操作方式繁琐,RESTful API通常根据GET,POST,PUT,DELETE 来区分对资源的操作动作。但是HTTP Method 并不可直接见到,需要通过抓包等工具才能观察。如果把动作放在URL上反而更加直
    观,更利于团队的理解和交流。
  2. 一些浏览器对GET,POST之外的请求支持不太友好,需要额外处理。
  3. 过分强调资源。而实际业务需求可能比较复杂,并不能单纯使用增删改查就能满足需求,强行使用
    RESTful API会增加开发难度和成本。

所以,在实际开发中,如果业务需求和RESTfu API不太匹配或者很麻烦时,也可以不用RESTful API。如果使用场景和REST风格比较匹配,就可以采⽤RESTful API。

上述项目存在的问题

  • 远程调用时,URL的IP和端口号是写死的(http://127.0.0.1:9090/product/),如果更换IP,需要修改代码 。调用方如何可以不依赖服务提供方的IP?
  • 多机部署,如何分摊压力?
  • 远程调用时,URL非常容易写错,而且复用性不高,如何优雅的实现远程调⽤
  • 所有的服务都可以调用该接口,是否有风险?

相关文章:

SpringCloud概述和环境搭建

SpringCloud概述和环境搭建 一.微服务的引入1.单体架构2.集群和分布式架构3.集群和分布式4.微服务架构4.微服务的优缺点 二.微服务解决方案-SpringCloud1.Spring Cloud简介2.Spring Cloud版本3.Spring Cloud实现方案4.Spring Cloud Alibaba 三.环境搭建1.安装JDK172.Ubantu上下…...

System.out 详解

System.out 详解 System.out 是 Java 提供的标准输出流(PrintStream 类型),默认关联控制台(Console),用于向终端打印文本信息。它是 Java 中最常用的输出方式之一,尤其在调试和命令行程序开发中。 1. 核心知识点 (1)System.out 的本质 类型:PrintStream(字节流,但…...

每天学一个 Linux 命令(28):ln

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/28/index.html ln 是 Linux 中用于创建文件或目录链接的命令,主要生成硬链接(Hard Link)和符号链接(Symbolic Link,软链接)。链接常用于文件共享、快捷访问或版本管理。 命令格式 ln [选项] 源文件 目标链接链…...

【微知】服务器如何获取服务器的SN序列号信息?(dmidecode -t 1)

文章目录 背景命令dmidecode -t的数字代表的字段 背景 各种场景都需要获取服务器的SN&#xff08;Serial Number&#xff09;&#xff0c;比如问题定位&#xff0c;文件命名&#xff0c;该部分信息在dmi中是标准信息&#xff0c;不同服务器&#xff0c;不同os都能用相同方式获…...

4.20刷题记录(单调栈)

第一部分&#xff1a;简单介绍 单调栈我的理解是在栈中存储数字出现的位置&#xff0c;然后通过遍历比较当前栈顶元素与当前元素的大小关系&#xff0c;从而确定逻辑相关顺序。 第二部分&#xff1a;真题讲解 &#xff08;1&#xff09;739. 每日温度 - 力扣&#xff08;Lee…...

Opencv图像处理:模板匹配对象

文章目录 一、模板匹配1、什么是模板匹配&#xff1f;2、原理 二、单模板匹配&#xff08;代码实现&#xff09;1、预处理2、 开始模板匹配并绘制匹配位置的外接矩形 三、多模板匹配&#xff08;代码实现&#xff09;1、读取图片和模板2、模板匹配3、设置阈值1&#xff09;阈值…...

Web3.0热门领域NFT项目实战课程

课程大小&#xff1a;3.8G 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/90616383 更多资源下载&#xff1a;关注我 深度掌握Solidity合约开发&#xff0c;助力成为抢手的Web3.0开发工程师 深入Web3.0技术的人才&#xff0c;一将难求。本课程由We…...

DAY 50 leetcode 1047--栈和队列.删除字符串中的所有相邻重复项

题号1047 给出由小写字母组成的字符串 s&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 s 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 import java.util.Ar…...

单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现

前言 今天我们就来讲讲什么是单例模式与线程池的相关知识&#xff0c;这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢&#xff1f;上面说到的设计模式又是什么&#xff1f; 其实单例模式就是设计模式的一种。…...

微信小程序通过mqtt控制esp32

目录 1.注册巴法云 2.设备连接mqtt 3.微信小程序 备注 本文esp32用的是MicroPython固件&#xff0c;MQTT服务用的是巴法云。 本文参考巴法云官方教程&#xff1a;https://bemfa.blog.csdn.net/article/details/115282152 1.注册巴法云 注册登陆并新建一个topic&#xff…...

QML、Qt Quick 、Qt Quick Controls 2

一、概念 基本关系 QML 是声明式语言,用于描述用户界面。声明式语法(类似JSON+JavaScript),定义UI结构和行为。 Qt Quick 是 QML 的标准库,提供基本类型和功能。提供QML语言运行时的基础能力,相当于QML的"标准模板库(STL)"。 Quick Controls 2 是基于 Qt Quic…...

基于maven-jar-plugin打造一款自动识别主类的maven打包插件

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

利用 HEMT 和 PHEMT 改善无线通信电路中的增益、速度和噪声

本文要点 高电子迁移率晶体管 &#xff08;High electron mobility transistors &#xff0c;HEMTs&#xff09; 和应变式异质接面高迁移率晶体管&#xff08;pseudomorphic high electron mobility transistors &#xff0c;PHEMTs&#xff09; 因其独特的、可提高性能的特点而…...

探秘C#用户定义类型:突破预定义的边界

在C#的编程世界里&#xff0c;除了系统提供的16种预定义类型&#xff0c;开发者还拥有强大的自主能力——创建自己的用户定义类型。这大大拓展了编程的灵活性和可扩展性&#xff0c;让开发者能根据具体需求定制数据结构和功能。 六种用户定义类型 类类型&#xff08;class&am…...

idea中导入从GitHub上克隆下来的springboot项目解决找不到主类的问题

第一步&#xff1a;删除目录下的.idea和target&#xff0c;然后用idea打开 第二步&#xff1a;如果有需要&#xff0c;idea更换jdk版本 原文链接&#xff1a;https://blog.csdn.net/m0_74036731/article/details/146779040 解决方法&#xff08;idea中解决&#xff09;&#…...

北理工宫某的瓜ppt下载地址

关于“北理工宫某瓜”PPT下载地址相关技术探讨 摘要&#xff1a;本文围绕“北理工宫某瓜”事件中PPT下载地址相关情况展开分析&#xff0c;探讨了网络资源传播的技术机制、涉及的网络安全问题以及围绕此类资源分享应遵循的规范和注意事项&#xff0c;旨在从技术角度对这类网络…...

[论文阅读]Making Retrieval-Augmented Language Models Robust to Irrelevant Context

Making Retrieval-Augmented Language Models Robust to Irrelevant Context [2310.01558v2] Making Retrieval-Augmented Language Models Robust to Irrelevant Context 检索增强语言模型&#xff08;RALMs&#xff09;&#xff0c;它包含一个检索机制&#xff0c;以减少将…...

论文阅读:2023 arxiv A Survey of Reinforcement Learning from Human Feedback

A Survey of Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2312.14925 https://www.doubao.com/chat/3506943124865538 速览 这篇论文是关于“从人类反馈中进行强化学习&#xff08;RLHF&#xff09;”的综述&#xff0c;核心是讲如何让AI通过人类反…...

【图像处理基石】什么是去马赛克算法?

RAW数据的Demosaic算法&#xff08;去马赛克算法&#xff09;是图像处理中的关键技术&#xff0c;主要用于将图像传感器&#xff08;如数码相机、手机摄像头&#xff09;采集的原始马赛克数据恢复为完整的RGB三通道图像。 1. RAW数据的特性 马赛克结构&#xff1a;图像传感器…...

transformer注意力机制

单头注意力机制 import torch import torch.nn.functional as Fdef scaled_dot_product_attention(Q, K, V):# Q: (batch_size, seq_len, d_k)# K: (batch_size, seq_len, d_k)# V: (batch_size, seq_len, d_v)batch_size: 一次输入的句子数。 seq_len: 每个句子的词数。 d_mo…...

Ubuntu 22.04 更换 Nvidia 显卡后启动无法进入桌面问题的解决

原显卡为 R7 240, 更换为 3060Ti 后, 开机进桌面时卡在了黑屏界面, 键盘有反应, 但是无法进入 shell. 解决方案为 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 启动后在开机菜单中(如果没有开机菜单, 需要按shift键), 进入recove…...

ROS机器人开发实践->机器人建模与仿真

前言&#xff1a; 这篇博客知识一个整体性的了解对于机器人建模和仿真&#xff0c;更多详细的细节&#xff0c;见 6.4.2 Xacro_语法详解 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 一、整体框架 机器人模型分为两个部分具体的形状和插件。有了这个具体的形状…...

中国占全球工业机器人装机量的52%,国产机器人崛起加速洗牌,拆分机器人业务独立上市,软硬件协同增强,AI工业机械臂催生业务再增长

一、内部战略优化:聚焦核心业务与释放增长潜力 业务协同效应有限 ABB的机器人业务(全球市场份额第二)与集团其他业务(如电气化、过程自动化)的协同性较低。机器人业务专注于柔性制造和智能自动化,而其他业务更偏向能源效率和大型工业系统。分拆后,ABB集团可更聚焦于电气…...

C#森林中的兔子(力扣题目)

C#森林中的兔子(力扣题目) 题目介绍 森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你&#xff08;指被提问的兔子&#xff09;颜色相同?” &#xff0c;将答案收集到一个整数数组 answers 中&#xff0c;其中 answers[i] 是第 i 只兔子的回答。 给你数组…...

OSPF特殊区域

四种特殊区域 1、stub 2、完全stub 3、nssa 4、完全nssa 作用&#xff1a;用于优化OSPF的LSDB空间 stub&#xff1a; [R2-ospf-1-area-0.0.0.1]stub //配置一个区域为stub区域 只在ABR上配置的话会导致OSPF邻居关系断开&#xff0c;因为此时Option选项中Nbit和Ebit置位不一致所…...

深入理解 CICD 与 Jenkins 流水线:从原理到实践

前言&#xff1a;在当今数字化飞速发展的时代&#xff0c;软件开发行业的竞争日益激烈。为了能够快速响应市场需求&#xff0c;及时交付高质量的软件产品&#xff0c;开发团队们不断探索和采用新的开发模式与工具。CICD&#xff08;持续集成、持续交付 / 部署&#xff09;作为一…...

1.Vue自动化工具安装(Vue-cli)

目录 1.node.js 安装&#xff1a; 2 npm 安装 3 安装Vue-cli 4总结&#xff1a; 一般情况下&#xff0c;单文件组件&#xff0c;我们运行在 自动化工具vue-CLI中&#xff0c;可以帮我们编译单文件组件。所以我们在学习时一般需要在系统中先搭建vue-CLI工具 下面就是一些我…...

前端亮点:大文件上传技术详解及问题解析

大片文件上传 文件上传 大片文件上传需考虑问题 一、核心实现步骤 分片唯一标识计算 (优化比较时间) • Hash生成:使用SparkMD5或crypto.subtle.digest计算文件整体Hash(秒传依据)及分片Hash(断点续传依据)。 • 优化:通过Web Worker多线程计算,避免主线程阻塞(如…...

每日一题——最小测试用例集覆盖问题

最小测试用例集覆盖问题&#xff08;C语言实现&#xff09; 问题描述 假设我们有一系列测试用例&#xff0c;每个测试用例会覆盖若干个代码模块。 我们使用一个二维数组来表示这些测试用例的覆盖情况&#xff1a; 如果某个测试用例 i 能覆盖代码模块 j&#xff0c;则数组中…...

React 文章 分页

删除功能 携带路由参数跳转到新的路由项 const navigate useNavigate() 根据文章ID条件渲染...

【技术派后端篇】Redis实现统计计数

在互联网项目中&#xff0c;计数器有着广泛的应用场景。以技术派项目为例&#xff0c;诸如文章点赞数、收藏数、评论数以及用户粉丝数等都离不开计数器的支持。在技术派源码中&#xff0c;提供了基于数据库操作记录实时更新和基于 Redis 的 incr 特性实现计数器这两种方案&…...

NHANES指标推荐:RFM

文章题目&#xff1a;Higher relative fat mass was associated with a higher prevalence of gallstones in US adults DOI&#xff1a;10.1186/s12876-025-03715-3 中文标题&#xff1a;在美国成年人中&#xff0c;相对脂肪质量越高&#xff0c;胆结石患病率就越高 发表杂志&…...

嵌入式人工智能应用-第三章 opencv操作 4 灰度处理

嵌入式人工智能应用 嵌入式人工智能应用-第三章 opencv操作 4 灰度处理 嵌入式人工智能应用1 灰度处理2 算法2.1 均值方法2.2 最大值法2.3 分量法2.4 加权平均法&#xff08;Weighted Average Method&#xff09;2.5 系统自带方法 3 总结 1 灰度处理 图像灰处理即是将一幅彩色…...

AI Agent破局:智能化与生态系统标准化的颠覆性融合!

Hi&#xff01;好久不见 云边有个稻草人-个人主页 热门文章_云边有个稻草人的博客-本篇文章所属专栏~ 目录 一、引言 二、AI Agent的基本概念 2.1 定义与分类 2.2 AI Agent的工作原理 2.3 示例代码&#xff1a;AI Agent的基本实现 三、AI Agent在企业数字化转型中的应用 …...

UniFlash以串口方式烧录MSPM0G3507(无需仿真器)

材料&#xff1a;MSPM0G3507黑钢版&#xff0c;只要有UART的其他版本亦可&#xff08;PA14需接LED&#xff09; 下载软件&#xff1a;UniFlash 9.1.0.5175&#xff0c;网址&#xff1a;UNIFLASH 软件编程工具 | 德州仪器 TI.com.cn​​​​​​ 测试文件&#xff1a;MSPM0G30…...

坐标轴刻度QCPAxisTicker

一、QCPAxisTicker 概述 QCPAxisTicker 是 QCustomPlot 中控制坐标轴刻度生成和显示的基类&#xff0c;负责计算刻度位置和生成刻度标签。 二、主要派生类 类名描述QCPAxisTickerFixed固定步长的刻度生成器QCPAxisTickerLog对数坐标刻度生成器QCPAxisTickerPi专门显示π倍数…...

Spring Boot 版本与对应 JDK 版本兼容性

Spring Boot 版本与对应 JDK 版本兼容性 以下是 Spring Boot 主要版本与所需 JDK 版本的对应关系&#xff0c;以及长期支持(LTS)信息&#xff1a; 最新版本对应关系 (截至2024年) Spring Boot 版本发布日期支持的 JDK 版本备注3.2.x (最新)2023-11JDK 17-21推荐使用 JDK 173…...

【MySQL】MySQL的基础语法及其语句的介绍

1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…...

《汽车理论》第四章作业MATLAB部分

1.计算并绘制利用附着系数曲线和制动效率曲线 clc close all %空载(no load)-1 ;满载(full load)-2 m14080; m29290; hg10.845; hg21.170; L3.950; a12.100; a22.950; b1L-a1; b2L-a2; beta0.38; %利用附着系数与制动强度的关系曲线 z0:0.01:1; phi_f1L*beta.*z./(b1z*hg1);%前…...

SpringCloud实战

环境准备&#xff1a; 1. 一台虚拟机&#xff0c;部署好centos7操作系统、安装好docker 2. 使用docker安装mysql数据库且启动mysql容器 3. IDEA配置的JDK版本是11 4. 前端代码启动Nginx 一、单体架构和微服务的区别&#xff1f; 1. 单体架构 将业务的所有功能集中在一个项目中…...

Cribl 对Windows-xml log 进行 -Serialize-05

The Serialize Function Description​ The Serialize Function is designed to transform an events content into a predefined format. Steps - Adding a Serialize Function​ important Select the Add Function<...

鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法

本文聚焦于ArkUI的布局实战&#xff0c;三种十分重要的布局&#xff0c;线性布局、弹性布局、层叠布局&#xff0c;在实际开发过程中这几种布局方法都十分常见&#xff0c;下面直接上手 线性布局 垂直布局&#xff08;Column&#xff09; 官方文档&#xff1a; Column-行列…...

缓存 --- 内存缓存 or 分布式缓存

缓存 --- 内存缓存 or 分布式缓存 内存缓存&#xff08;In-Memory Cache&#xff09;分布式缓存&#xff08;Distributed Cache&#xff09;内存缓存 vs 分布式缓存 内存缓存和分布式缓存是两种常见的缓存策略&#xff0c;它们在存储位置、访问速度和适用场景上有所不同。下面分…...

【Qt】QMainWindow类

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; QMainWindow 概述 &#x1f98b; 菜单栏&#x1f380; 具体使用&#x1f380; 综合案例 &#x1f98b; 工具栏&#x1f98b; 状态栏&#x1f98b; 窗口布局&a…...

缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透

缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透 缓存击穿&#xff08;Cache Breakdown&#xff09;概念原理实际场景代码实现&#xff08;互斥锁方案&#xff09; 缓存雪崩&#xff08;Cache Avalanche&#xff09;概念原理实际场景代码实现&#xff08;随机过期时间&#xff09; 缓存…...

第五章 SQLite数据库:5、SQLite 进阶用法:ALTER 命令、TRUNCATE 操作、视图创建、事务控制和子查询的操作

1. SQLite ALTER 命令 SQLite 的 ALTER TABLE 命令允许在不完全重建表的情况下修改现有的表结构。通过 ALTER TABLE&#xff0c;您可以执行如重命名表名、添加新列等操作&#xff0c;但无法执行复杂的修改&#xff0c;如删除列或修改列的数据类型。 语法 重命名表 用于重命名…...

【2】Kubernetes 架构总览

Kubernetes 架构总览 主节点与工作节点 主节点 Kubernetes 的主节点&#xff08;Master&#xff09;是组成集群控制平面的关键部分&#xff0c;负责整个集群的调度、状态管理和决策。控制平面由多个核心组件构成&#xff0c;包括&#xff1a; kube-apiserver&#xff1a;集…...

【数据结构】红黑树

红黑树&#xff08; R e d B l a c k T r e e Red\ Black\ Tree Red Black Tree&#xff09;是一种自平衡二叉搜索树&#xff0c;也可以看作一种特化的 A V L AVL AVL 树&#xff08;通过颜色规则来实现自平衡功能&#xff09;&#xff0c;都是在进行插入和删除操作时通过特定…...

ThreadLocal - 原理与应用场景详解

ThreadLocal 的基础概念 在 Java 的多线程世界里&#xff0c;线程之间的数据共享与隔离一直是一个关键话题。如果处理不当&#xff0c;很容易引发线程安全问题&#xff0c;比如数据混乱、脏读等。而 ThreadLocal 这个工具类&#xff0c;就像是为线程量身定制的 “私人储物柜”…...

VS Code 远程连接服务器:Anaconda 环境与 Python/Jupyter 运行全指南。研0大模型学习(第六、第七天)

VS Code 远程连接服务器&#xff1a;Anaconda 环境与 Python/Jupyter 运行全指南 在使用 VS Code 通过 SSH 远程连接到服务器进行开发时&#xff0c;尤其是在进行深度学习等需要特定环境的工作时&#xff0c;正确配置和使用 Anaconda 环境以及理解不同的代码运行方式非常关键。…...