Spring Cloud 工程搭建服务注册_服务发现

文章目录

  • Spring Cloud 工程搭建
    • 服务拆分
    • 示例
      • 数据库
      • 工程搭建
        • 构建父子工程
          • 创建父工程
          • 创建子项目
          • 完成两个接口
      • 远程调用
        • 实现
          • 添加ProductInfo字段
          • 定义RestTemplate
          • 修改OrderService
  • 服务注册/服务发现 - Eureka
    • 注册中心
    • CAP理论
    • 常见的注册中心
      • Zookeeper
      • Eureka
      • Nacos
    • Eureka 介绍
    • 搭建Eureka Server
      • 创建Eureka-server子模块
      • 引入eureka-server依赖
      • 编写配置文件
      • 启动服务
    • 服务注册
      • 完善配置文件
      • 启动服务
    • 服务发现
      • 引入依赖
      • 完善配置文件
      • 远程调用
      • 启动服务

Spring Cloud 工程搭建

服务拆分

微服务到底多小才算"微",实际上并没有明确的标准,但是不是越小越好,因为服务越小,微服务架构的缺点会越来越明显

服务拆分一般遵循以下原则:

  1. 单一职责原则:在微服务架构里面,一个微服务也应该只负责一个功能或业务领域,只关注自己的特定业务领域
  2. 服务自治:服务自治是指每个微服务都应该具备高度自治功能,即每个服务都要做到独立开发,独立测试,独立构建,独立部署,独立运行
  3. 单向依赖:微服务之间需要做到单向依赖,严禁循环依赖,双向依赖,但是如果某些场景是在无法避免循环依赖或者双向依赖,可以考虑使用消息队列等其他方式来实现

实际上,微服务架构并没有标准架构,合适的就是最好的

示例

以电商系统的订单列表为例,需要提供订单列表以及商品信息

我们将这个服务拆成:

  • 订单服务:提供订单ID,获取订单详细信息
  • 商品服务:根据商品ID,提供商品详细信息

数据库

DROP TABLE IF EXISTS `order_detail`;
CREATE TABLE `order_detail`  (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NOT NULL,`product_id` bigint(20) NULL DEFAULT NULL,`num` int(10) NULL DEFAULT 0,`price` bigint(20) NULL DEFAULT NULL,`delete_flag` tinyint(4) NULL DEFAULT 0,`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of order_detail
-- ----------------------------
INSERT INTO `order_detail` VALUES (1, 2001, 1001, 1, 99, 0, '2024-09-23 20:51:31', '2024-09-23 20:51:31');
INSERT INTO `order_detail` VALUES (2, 2002, 1002, 1, 30, 0, '2024-09-23 20:51:31', '2024-09-23 20:51:31');
INSERT INTO `order_detail` VALUES (3, 2001, 1003, 1, 40, 0, '2024-09-23 20:51:31', '2024-09-23 20:51:31');
INSERT INTO `order_detail` VALUES (4, 2003, 1004, 3, 58, 0, '2024-09-23 20:51:31', '2024-09-23 20:51:31');
INSERT INTO `order_detail` VALUES (5, 2004, 1005, 7, 85, 0, '2024-09-23 20:51:31', '2024-09-23 20:51:31');
INSERT INTO `order_detail` VALUES (6, 2005, 1006, 7, 94, 0, '2024-09-23 20:51:31', '2024-09-23 20:51:31');-- ----------------------------
-- Table structure for product_detail
-- ----------------------------
DROP TABLE IF EXISTS `product_detail`;
CREATE TABLE `product_detail`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '产品id',`product_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '产品名称',`product_price` bigint(20) NOT NULL COMMENT '产品价格',`state` tinyint(4) NULL DEFAULT 0 COMMENT '产品状态 0-有效 1-下架',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10011 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '产品表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of product_detail
-- ----------------------------
INSERT INTO `product_detail` VALUES (1001, 'T恤', 101, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1002, '短袖', 30, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1003, '短裤', 44, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1004, '卫衣', 58, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1005, '⻢甲', 98, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1006, '羽绒服', 101, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1007, '冲锋衣', 30, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1008, '袜子', 44, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (1009, '鞋子', 58, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');
INSERT INTO `product_detail` VALUES (10010, '毛衣', 98, 0, '2024-09-23 20:59:38', '2024-09-23 20:59:38');

工程搭建

构建父子工程
创建父工程

pow文件

<?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.JWCB</groupId><artifactId>JE0924SpringCloudTest</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>order-service</module><module>product-service</module></modules><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>

关于DependencyManagement 和 Dependencies

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

创建子项目

修改两个子项目的pom.xml文件

<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>
完成两个接口

远程调用

在查询订单信息的时候,根据订单里的产品ID,获取到产品的详细信息

实现

在order-Service服务中向product_service服务发送一个http请求,将获取到的返回结果和订单数据结合在一起即可

添加ProductInfo字段

定义RestTemplate
@Configuration
public class BeanConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
修改OrderService
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public  OrderInfo getOrderList(int orderId){OrderInfo orderInfo = orderMapper.getOrderList(orderId);String url = "http://127.0.0.1:8081/product/getProduct?productId=" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url,ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

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

但是这个时候的项目存在有几个问题

  1. 远程调用的时候,URL和IP和端口号都是写死的,如果更换IP,需要修改代码
  2. 远程调用的时候,URL非常容易写错
  3. 多机部署的压力如何分担
  4. 所有的服务都可以调用这个接口,存在风险

服务注册/服务发现 - Eureka

注册中心

随着微服务的流行与流量的激增,机器规模逐渐增大,并且机器有频繁的上下线行为,这时候就需要手动去维护这个配置信息,是一个比较麻烦的事情.所以我们需要有这么一个东西,能够维护一个服务列表,当哪个机器上线了,那个机器宕机了,这些信息都会自动更新到服务列表上,客户端拿到这个列表,直接进行服务调用即可,这个就是注册中心

注册中心主要有三种角色

  1. 服务提供者(Server) :一次业务里面,被其他微服务调用的服务,也就是提供接口给其他微服务
  2. 服务消费者(Client):一次业务中,调用其他微服务的服务,也就是调用其他微服务提供的接口
  3. 服务注册中心(Register) : 用于保存Service的注册信息,但Service节点发生变化的时候,Register会同步变更,服务与注册中心使用一定的机制通信(如果注册中心与某服务长时间无法通信,就会注销该实例

总结为两个概念

  • 服务注册:服务提供者在启动的时候,向Register注册自身服务,并向Register定期发送心跳汇报其存或状态
  • 服务发现:服务消费者从注册查询查询服务提供者的地址,并通过该地址调用服务提供者的接口,服务发现的一个重要作用就是提供给服务消费者一个可用的服务列表

CAP理论

CAP理论是分布式系统设计最基础,也是最为关键的理论

  1. 一致性:在CAP理论中的一致性,指的是强一致性,所有节点在同一时间具有相同的数据

以数据库集群为例

此时当客户端向数据库集群发送了一个数据修改的请求的时候,数据库集群需要向客户端进行响应

响应的实际分为两种:

  1. 主库收到请求,并且处理成功,此时数据还未完全同步到从库,但是随着时间的推移,最终会达到一致性
  2. 主库接受到请求,并且所有从库数据都同步成功的时候

那么就对应两种一致性

  1. 强一致性:主库和仓库,不论何时,对外提供的服务嗾使一致的
  2. 弱一致性:随着时间的推移,最终达到了一致
  1. 可用性:指的是,对所有的请求,都有响应,但是这个响应可能是错误的
  2. 分区容错性:指的是,在网络分区的情况下,系统依然可以对外提供服务

因为P一定要保证,那么A和C只能是二选一

所以我们的架构就只能是CP架构或者是AP架构:

  1. cp架构,为了保证分布式系统对外的数据一致性,于是选择不返回任何数据
  2. ap架构,为了分布式系统的可用性,节点返回旧版本的数据(即使这个数据不正确)

常见的注册中心

Zookeeper

实际上Zookeeper的官方并没有说他是一个注册中心,但是国内java体系,大部分的集群环境都是依赖他来完成注册中心的功能

Eureka

Eureka是Netflix开发的基于Rest的服务发现框架,主要用于服务注册,管理,负载均衡和服务故障转移

Nacos

Nacos是Spring Cloud Alibaba架构中重要的组件,除了服务注册的功能之外,Nacos还支持配置管理,流量管理,DNS,动态DNS等多种特性

其中:

Zookeeper支持的CAP理论是CP,Eureka是AP,Nacos默认是AP,也可以是CP

Eureka 介绍

Eureka主要分为两个部分

  • Eureka Server:作为注册中心Service端,向微服务应用程序提供服务注册,发现,健康检查等能力
  • Eureka Client:服务提供者,服务启动的时候,会向Eureka Service注册自己的信息(IP,端口,服务信息等)

我们使用Eureka的学习,主要包含以下三个部分:

  1. 搭建Eureka Server
  2. 将order-service,product-service都注册到Eureka
  3. order-service远程调用时,从Eureka中获取product-service的服务列表,然后进行交互

搭建Eureka Server

创建Eureka-server子模块

引入eureka-server依赖

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
</dependencies>

编写配置文件

server:port: 8082
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为falseregister-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于当前应⽤就是Eureka Server,故⽽设置为false.service-url:
# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动服务

@EnableEurekaServer
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}
}

通过http://127.0.0.1:8082/访问

服务注册

将product-service注册到eureka-server中

```xml org.springframework.cloud spring-cloud-starter-netflix-eureka-client ```

完善配置文件

添加服务名称和eureka地址

spring:application:name: product-service
eureka:client:service-url:defaultZone: http://127.0.0.1:8082/eureka

启动服务

再次访问http://127.0.0.1:8082/

可以看到product-service已经注册到eureka上了

服务发现

修改order-service,在远程调用的时候,从eureka-server拉取product-service的服务信息,实现服务发现

引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

完善配置文件

服务发现也需要知道eureka地址

spring:application:name: order-serviceeureka:client:service-url:defaultZone: http://127.0.0.1:8082/eureka

远程调用

我们需要从eureka-service中获取product-service的列表,并选择其中的一个进行调用

@Service
public class OrderService {private static final Logger log = LoggerFactory.getLogger(OrderService.class);@Autowiredprivate OrderMapper orderMapper;@Resourceprivate DiscoveryClient discoveryClient;@Autowiredprivate RestTemplate restTemplate;public  OrderInfo getOrderList(int orderId){OrderInfo orderInfo = orderMapper.getOrderList(orderId);List<ServiceInstance> instances = discoveryClient.getInstances("product-service");EurekaServiceInstance instance = (EurekaServiceInstance) instances.get(0);String url = instance.getUri()+"/product/getProduct?productId=" + orderInfo.getProductId();log.info(url);ProductInfo productInfo = restTemplate.getForObject(url,ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

启动服务

此时通过接口访问:

但是

如果一个服务对应了多个实例呢?? 流量是否可以合理的分配到多个实例呢,这时候就需要负载均衡了

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

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

相关文章

SSM框架VUE电影售票管理系统开发mysql数据库redis设计java编程计算机网页源码maven项目

一、源码特点 smm VUE电影售票管理系统是一套完善的完整信息管理类型系统&#xff0c;结合SSM框架和VUE、redis完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用ssm框架&#xff08;MVC模式开发&#xff09;&#xff0c;系 统具有完整的源代码和数据库&#…

vue echarts tooltip动态绑定模板,并且处理vue事件绑定

先上代码&#xff1a; tooltip: {// 这里是车辆iconshow: true,// trigger: "item",// backgroundColor: "transparent",appendToBody: true,textStyle: {color: "#ffffff" //设置文字颜色},formatter: (params) > {const TruckTooltip Vue.…

【SOP】Windows下安装Neo4j流程

Neo4j简介 Neo4j 是一个基于图形结构的 NoSQL 数据库&#xff0c;专门用于存储和管理图数据。与传统的关系型数据库不同&#xff0c;Neo4j 使用 图&#xff08;graph&#xff09;的形式来表示数据&#xff0c;其中数据点&#xff08;称为 节点&#xff09;通过 边&#xff08;…

遥感图像语义分割数据集制作(使用ArcGIS Pro)

0. 引言 图像分割就是把图像空间按照一定的要求分成一些“有意义”的区域的技术叫图像分割。一幅图像通常是由代表物体的图案与背景组成&#xff0c;简称物体与背景。若想从一幅图像中“提取”物体&#xff0c;可以设法用专门的方法标出属于该物体的点&#xff0c;如把物体上的…

WebSocket实现在线聊天室

项目实现源码&#xff1a; 前端源码 后端源码 1.常见的消息推送方式 1.1 轮询 1.1.1 轮询的概念 客户端以固定的事件间隔&#xff08;例如每秒或几分钟&#xff09;向服务器发送HTTP请求&#xff0c;服务器收到请求后&#xff0c;处理请求并返回数据给客户端 轮询具体实现htt…

计算机毕业设计之:宠物服务APP的设计与实现(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

如何把PDF样本册转换为网址链接

​随着互联网的普及&#xff0c;将纸质或PDF格式的样本册转化为网址链接&#xff0c;以便于在线浏览和分享&#xff0c;变得越来越重要。本文将为您详细讲解如何将PDF样本册转换为网址链接&#xff0c;让您轻松实现线上展示和分享。 一、了解PDF样本册与网址链接 1. PDF样本册…

游戏账号系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;游戏类别管理&#xff0c;游戏账号管理&#xff0c;站内联系管理&#xff0c;交易订单管理&#xff0c;帐号退货管理 微信端账号功能包括&#xff1a;系统首…

多输入多输出预测 | NGO-BP北方苍鹰算法优化BP神经网络多输入多输出预测(Matlab)

多输入多输出预测 | NGO-BP北方苍鹰算法优化BP神经网络多输入多输出预测&#xff08;Matlab&#xff09; 目录 多输入多输出预测 | NGO-BP北方苍鹰算法优化BP神经网络多输入多输出预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介…

数据结构:树的定义及其性质

树的定义 树是一种重要的非线性数据结构&#xff0c;树作为一种逻辑结构&#xff0c;同时也是一种分层结构。具有以下两个特点&#xff1a; 1.树的根结点没有前驱&#xff0c;除根结点意外的节点只有一个前驱 2.树中所有结点都可以有0个或多个后继 树结构在多个领域都有广泛…

GDB 调试

1. wsl 环境下搭建gdb&#xff1a; 1.1安装环境&#xff1a; #安装gcc编译器 (x86 linux) $ sudo apt install gcc #检查安装版本&#xff0c;看是否成功 $ gcc -v #安装gdb编译器 (x86 linux) $ sudo apt install gdb #检查安装是否成功 $ gdb 1.2 编写自己的程序&…

刷题学习日记 (1) - SWPUCTF

写这篇文章主要是想看看自己一个下午能干啥&#xff0c;不想老是浪费时间了&#xff0c;所以刷多少题我就会写多少题解&#xff0c;使用nss随机刷题&#xff0c;但是今天下午不知道为啥一刷都是SWPUCTF的。 [SWPUCTF 2021 新生赛]gift_F12 控制台ctrlf搜索flag即可&#xff0…

处理not in gzip format异常

1、为什么会触发这个异常&#xff1f; 当我们使用GZIPInputStream的read方法进行读取数据时&#xff0c;它会自动处理gzip格式的压缩数据&#xff0c;将它解析成原始的二进制数据。但是&#xff0c;如果你没有将原始数据进行gzip压缩后传入GZIPInputStream流&#xff0c;进行r…

车载诊断技术:汽车健康的守护者

一、车载诊断技术的发展历程 从最初简单的硬件设备到如今智能化、网络化的系统,车载诊断技术不断演进,为汽车安全和性能提供保障。 早期的汽车诊断检测技术处于比较原始的状态,主要依靠操作经验和主观评价。随着汽车工业的发展,车载诊断技术也经历了不同的阶段。20 世纪初…

视频融合共享平台LntonAIServer视频智能分析抖动检测算法和过亮过暗检测算法

LntonAIServer作为一款智能视频监控平台&#xff0c;集成了多种先进的视频质量诊断功能&#xff0c;其中包括抖动检测和过暗检测算法。这些算法对于提升视频监控系统的稳定性和图像质量具有重要意义。 以下是对抖动检测算法和过暗检测算法的应用场景及优势的详细介绍。 一、L…

数据分析:线性回归计算嵌套的组间差异

文章目录 介绍加载依赖包导入数据数据预处理数据概览线性回归画图森林图的特点:森林图的作用:总结系统信息介绍 在统计学中,嵌套的组间差异分析是一种评估不同组别间差异的方法,尤其适用于层级结构或分组数据。通过线性回归模型,我们可以计算出各个变量对于因变量的影响,…

基于Node.js+Express+MySQL+VUE新闻网站管理系统的设计与实现

1. 引言 随着互联网技术的发展&#xff0c;人们获取信息的方式发生了巨大的变化。传统的新闻媒体逐渐向数字化、智能化方向发展。新闻推荐网站管理系统能够帮助新闻网站更好地管理和推荐新闻内容&#xff0c;提高用户体验。本文将详细介绍一个新闻推荐网站管理系统的整体设计与…

《十年国庆游,洞察中国旅游新趋势》

作者&#xff1a;侯炯 一、十年国庆旅游数据总览 过去十年&#xff0c;中国国庆旅游市场呈现出丰富的变化和强劲的发展态势。从接待游客人次来看&#xff0c;2014 年接待国内游客 4.75 亿人次&#xff0c;到 2019 年已增长至 7.82 亿人次&#xff0c;2023 年国内旅游出游人数更…

北斗三号多模对讲机TD70:公专网融合、数模一体、音视频调度,推动应急通信效能升级

随着国家对应急通信和精准定位技术的重视程度不断提高&#xff0c;相关技术和设备的研发与应用也得到了迅猛发展。特别是在边防巡逻、林业巡防、海上作业等领域&#xff0c;通信设备的可靠性和功能性直接关系到人员的生命安全和任务的成功完成。 近年来&#xff0c;我国政府高度…

深度学习500问——Chapter17:模型压缩及移动端部署(1)

文章目录 17.1 模型压缩理解 17.2 为什么需要模型压缩和加速 17.3 模型压缩的必要性及可行性 17.4 目前有哪些深度学习模型压缩方法 17.4.1 前段压缩和后端压缩对比 17.4.2 网络剪枝 17.4.3 典型剪枝方法对比 17.4.4. 网络蒸馏 17.4.5 前端压缩 17.4.6 后端压缩 深度神经网络在…