环境和工程搭建

1.案例介绍

1.1 需求

实现⼀个电商平台

该如何实现呢? 如果把这些功能全部写在⼀个服务⾥, 这个服务将是巨⼤的.

巨多的会员, 巨⼤的流量, 微服务架构是最好的选择.

微服务应⽤开发的第⼀步, 就是服务拆分. 拆分后才能进⾏"各⾃开发"

1.2 服务拆分

拆分原则

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

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

①单⼀职责原则

单⼀职责原则原本是⾯向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多余一个导致类变更的原因

在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该有清晰的定义和边界, 只 关注⾃⼰的特定业务领域.

②服务⾃治

服务⾃治是指每个微服务都应该具备⾼度⾃治的能⼒, 即每个服务要能做到独⽴开发, 独⽴测试, 独⽴构 建, 独⽴部署, 独⽴运⾏.

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

③单项依赖

微服务之间需要做到单向依赖, 严禁循环依赖, 双向依赖

循环依赖: A -> B -> C ->A

双向依赖: A -> B, B->A

如果⼀些场景确实⽆法避免循环依赖或者双向依赖, 可以考虑使⽤消息队列等其他⽅式来实现.

微服务架构并⽆标准架构, 合适的就是最好的, 不然架构师⼤会也不会各个系统架构百花⻬放 了

在架构设计的过程中, 坚持 "合适优于业界领先", 避免"过度设计"(为了设计⽽设计)

 

服务拆分示例(电商系统为例)

根据服务的单⼀职责原则, 我们把服务进⾏拆分为:

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

商品服务: 根据商品ID, 返回商品详细信息.

2. 数据准备

根据服务⾃治原则, 每个服务都应有⾃⼰独⽴的数据库

-- 订单服务

-- 建库

create database if not exists cloud_order charset utf8mb4;

use cloud_order;

-- 订单表

DROP TABLE IF EXISTS order_detail;

CREATE TABLE order_detail (

        `id` INT NOT NULL AUTO_INCREMENT COMMENT '订单id',

        `user_id` BIGINT ( 20 ) NOT NULL COMMENT '用户ID',

        `product_id` BIGINT ( 20 ) NULL COMMENT '产品id',

        `num` INT ( 10 ) NULL DEFAULT 0 COMMENT '下单数量',

        `price` BIGINT ( 20 ) NOT NULL COMMENT '实付款',

        `delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,

        `create_time` DATETIME DEFAULT now(),

        `update_time` DATETIME DEFAULT now(),

PRIMARY KEY ( id )) ENGINE = INNODB DEFAULT CHARACTER

SET = utf8mb4 COMMENT = '订单表';

-- 数据初始化

insert into order_detail (user_id,product_id,num,price)

values

(2001, 1001,1,99), (2002, 1002,1,30), (2001, 1003,1,40),

(2003, 1004,3,58), (2004, 1005,7,85), (2005, 1006,7,94);


 

-- 产品服务

create database if not exists cloud_product charset utf8mb4;

-- 产品表

use cloud_product;

DROP TABLE IF EXISTS product_detail;

CREATE TABLE product_detail (

        `id` INT NOT NULL AUTO_INCREMENT COMMENT '产品id',

        `product_name` varchar ( 128 ) NULL COMMENT '产品名称',

        `product_price` BIGINT ( 20 ) NOT NULL COMMENT '产品价格',

        `state` TINYINT ( 4 ) NULL DEFAULT 0 COMMENT '产品状态 0-有效 1-下架',

        `create_time` DATETIME DEFAULT now(),

        `update_time` DATETIME DEFAULT now(),

PRIMARY KEY ( id )) ENGINE = INNODB DEFAULT CHARACTER

SET = utf8mb4 COMMENT = '产品表';

-- 数据初始化

insert into product_detail (id, product_name,product_price,state)

values

(1001,"T恤", 101, 0), (1002, "短袖",30, 0), (1003, "短裤",44, 0),

(1004, "卫衣",58, 0), (1005, "马甲",98, 0),(1006,"羽绒服", 101, 0),

(1007, "冲锋衣",30, 0), (1008, "袜子",44, 0), (1009, "鞋子",58, 0),

(10010, "毛衣",98, 0);

3. 工程搭建

3.1 构建父子工程

3.1.1 构建父工程

创建⼀个空的Maven项⽬, 删除所有代码, 只保留pom.xml

完善pom文件

使⽤properties来进⾏版本号的统⼀管理, 使⽤dependencyManagement来管理依赖, 声明⽗⼯程的打包⽅式为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><groupId>org.example</groupId><artifactId>SpringCloud-demo</artifactId><version>1.0-SNAPSHOT</version><modules><module>order-service</module><module>product-service</module></modules><packaging>pom</packaging><!--本身自带的这些要删除的--><!--    <properties>--><!--        <maven.compiler.source>17</maven.compiler.source>--><!--        <maven.compiler.target>17</maven.compiler.target>--><!--        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>--><!--    </properties>--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><!--        基于SPringboot3.16版本创建的--><relativePath/> <!-- lookup parent from repository --></parent><properties><!--        声明了Maven,JDK,Mybaits,MySQL的版本--><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><!--        将所依赖的jar直接加到项⽬中. ⼦项⽬也会继承该依赖.--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><dependencyManagement><!--      只是声明依赖, 并不实现Jar包引⼊. 如果⼦项⽬需要⽤到相关依赖,需要显式声明.如果⼦项⽬没有指定具体版本, 会从⽗项⽬中读取version. 如果⼦项⽬中指定了版本号,就会使⽤⼦项⽬中指定的jar版本.此外⽗⼯程的打包⽅式应该是pom,不是jar, 这⾥需要⼿动使⽤ packaging 来声明  --><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><!--   spring-cloud的版本要和SPringboot的版本对应上来,SpringCloud2022.0.x和SpringBoot3.0.x,3.1.x对应--><type>pom</type><scope>import</scope></dependency><!--            其余依赖的版本也要与SPringboot版本对应起来--><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>

dependencies :

将所依赖的jar直接加到项⽬中. ⼦项⽬也会继承该依赖.

dependencyManagement :

只是声明依赖, 并不实现Jar包引⼊. 如果⼦项⽬需要⽤到相关依赖, 需要显式声明. 如果⼦项⽬没有指定具体版本, 会从⽗项⽬中读取version. 如果⼦项⽬中指定了版本 号,就会使⽤⼦项⽬中指定的jar版本. 此外⽗⼯程的打包⽅式应该是pom,不是jar, 这⾥需要⼿动使⽤ packaging 来声明.

3.1.2 创建子项目-订单服务

完善pom文件

 

<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><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources></build>


3.1.3 创建子项目-商品服务

完善pom文件 
<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><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources></build>

 

3.2 完善订单服务

3.2.1 完善启动类, 配置⽂件

 

server:port: 8080
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: 808250driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自动驼峰转换

3.2.2 业务代码

实体类

@Data
public class OrderInfo {
//            `id` INT NOT NULL AUTO_INCREMENT COMMENT '订单id',
//            `user_id` BIGINT ( 20 ) NOT NULL COMMENT '用户ID',
//            `product_id` BIGINT ( 20 ) NULL COMMENT '产品id',
//            `num` INT ( 10 ) NULL DEFAULT 0 COMMENT '下单数量',
//            `price` BIGINT ( 20 ) NOT NULL COMMENT '实付款',
//            `delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,
//            `create_time` DATETIME DEFAULT now(),
//            `update_time` DATETIME DEFAULT now(),private Integer id;private Integer userId;private Integer productId;private Integer num;private Integer price;private Integer deleteFlag;private Date createTime;private Date updateTime;private ProductInfo productInfo;
}

 

Controller

@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderService orderService;@RequestMapping("/{orderId}")public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){return orderService.selectOrderById(orderId);}
}

Service

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;public OrderInfo selectOrderById(Integer orderId){return orderMapper.selectOrderById(orderId);}}

Mapper 

@Mapper
public interface OrderMapper {@Select("select * from order_detail where id=#{orderId}")OrderInfo selectOrderById(Integer orderId);
}

3.2.3 测试

127.0.0.1:8080/order/1

3.3 完善商品服务 

3.3.1 完善启动类, 配置⽂件 

3.3.2 业务代码

实体类

@Data
public class ProductInfo {
//    `id` INT NOT NULL AUTO_INCREMENT COMMENT '产品id',
//            `product_name` varchar ( 128 ) NULL COMMENT '产品名称',
//            `product_price` BIGINT ( 20 ) NOT NULL COMMENT '产品价格',
//            `state` TINYINT ( 4 ) NULL DEFAULT 0 COMMENT '产品状态 0-有效 1-下架',
//            `create_time` DATETIME DEFAULT now(),
//        `update_time` DATETIME DEFAULT now(),private Integer Id;private String productName;private Integer productPrice;private Integer state;private Date createTime;private Date updateTime;
}
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=falseusername: rootpassword: 808250driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自动驼峰转换

Controller

@RestController
@RequestMapping("/product")
public class ProductController {@Autowiredprivate ProductService productService;@RequestMapping("/{productId}")public ProductInfo getProductById(@PathVariable("productId") Integer productId){return productService.selectProductById(productId);}
}

Service

@Service
public class ProductService {@Autowiredprivate  ProductMapper productMapper;public ProductInfo selectProductById(Integer id){return productMapper.selectProductById(id);}
}

Mapper 


@Mapper
public interface ProductMapper {@Select("select * from product_detail where id= #{id}")ProductInfo selectProductById(Integer id);
}

3.3.3 测试

127.0.0.1:9090/product/1001 

 

3.4 远程调⽤

3.4.1 需求

根据订单查询订单信息时, 根据订单⾥产品ID, 获取产品的详细信息.

3.4.2 实现

实现思路: order-service服务向product-service服务发送⼀个http请求, 把得到的返回结果, 和订单结果融合在⼀起, 返回给调⽤⽅

实现⽅式: 采⽤Spring 提供的RestTemplate

定义RestTemplate

@Configuration
public class BeanConfig {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

修改order-service中的 OrderService

 

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;//    public OrderInfo selectOrderById(Integer orderId){
//        return orderMapper.selectOrderById(orderId);
//    }public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);//返回的类型是porderInfo.setProductInfo(productInfo);//把商品信息放到orderinforeturn orderInfo;}
}

3.4.3 测试

4.  RestTemplate

RestTemplate 是从 Spring3.0 开始⽀持的⼀个 HTTP 请求⼯具, 它是⼀个同步的 REST API 客⼾端, 提供了常⻅的REST请求⽅案的模版.

什么是REST?

REST(Representational State Transfer), 表现层资源状态转移.

这⾥⾯主要有三个概念:

  • 资源: ⽹络上的所有事物都可以抽象为资源, 每个资源都有⼀个唯⼀的资源标识符(URI)
  • 表现层: 资源的表现形式, ⽐如⽂本作为资源, 可以⽤txt格式表现, 也可以通过HTML, XML, JSON等 格式来表现, 甚⾄以⼆进制的格式表现.
  • 状态转移: 访问URI, 也就是客⼾端和服务器的交互过程. 客⼾端⽤到的⼿段,只能是HTTP协议. 这个过程中, 可能会涉及到数据状态的变化. ⽐如对数据的增删改查, 都是状态的转移.

REST 是⼀种设计⻛格, 指资源在⽹络中以某种表现形式进⾏状态转移.

简单来说: REST描述的是在⽹络中Client和Server的⼀种交互形式, REST本⾝不实⽤,实⽤的是如何设计 RESTful API(REST⻛格的⽹络接⼝)

什么是RESTful?

REST 是⼀种设计⻛格, 并没有⼀个明确的标准.

满⾜这种设计⻛格的程序或接⼝我们称之为RESTful(从单词字⾯来看就是⼀个形容词). 所以RESTful API 就是满⾜REST架构⻛格的接⼝.

RESTful ⻛格⼤致有以下⼏个主要特征:

  • 资源: 资源可以是⼀个图⽚, ⾳频, 视频或者JSON格式等⽹络上的⼀个实体, 除了⼀些⼆进制的资源 外普通的⽂本资源更多以JSON为载体、⾯向⽤⼾的⼀组数据(通常从数据库中查询⽽得到).
  • 统⼀接⼝: 对资源的操作. ⽐如获取, 创建, 修改和删除. 这些操作正好对应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通常根据GET, POST, PUT, DELETE 来区分对资源的操作动作. 但是 HTTP Method 并不可直接⻅到, 需要通过抓包等⼯具才能观察. 如果把动作放在URL上反⽽更加直 观, 更利于团队的理解和交流. 
  • ⼀些浏览器对GET, POST之外的请求⽀持不太友好, 需要额外处理. 
  • 过分强调资源. ⽽实际业务需求可能⽐较复杂, 并不能单纯使⽤增删改查就能满⾜需求, 强⾏使⽤ RESTful API会增加开发难度和成本.

所以, 在实际开发中, 如果业务需求和RESTful API不太匹配或者很⿇烦时, 也可以不⽤RESTful API. 如果使⽤场景和REST⻛格⽐较匹配, 就可以采⽤RESTful API.

总之: ⽆论哪种⻛格的API, 都是为了⽅便团队开发, 协商以及管理, 不能墨守成规. 尽信书不如⽆书, 尽信 规范不如⽆规范.

5. 项⽬存在问题

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

 

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

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

相关文章

解决Jmeter HTTP Cookie管理器cookie不生效

解决Jmeter HTTP Cookie管理器cookie不生效问题 解决Jmeter HTTP Cookie管理器cookie不生效问题1、设置Jmeter HTTP Cookie管理器cookie后&#xff0c;发起的请求显示[no cookies]jmeter问题复现&#xff1a;这里同样使用postman进行重试&#xff0c;发现是可以正常获取数据的&…

操作系统课后习题2.2节

操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度&#xff0c;这个是由CPU的设计和它的硬件来决定的&#xff0c;具体的调度算法是不能提高CPU的效率的&#xff1b; 第3题 互斥性&#xff1a; 指的是进程之间的同步互斥关系&#xff0c;进程是一个动态的过程&#…

二叉搜索树 平衡树(c嘎嘎版)

定义: 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为…

Everything搜索实现

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 速度快还小巧, 于是花了约3周进行研究, 总结下学习过程中一些经验 实现分3部分完成 一. 解析NTFS 主文件表(MFT) 这一步是获取文件数据的唯一迅速且可靠的来源 NTFS_MFT_Parse.h #pragma once #include "NTFS_Bas…

23.DDD与微服务

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现&#xff0c;也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

vscode 打开 setting.json

按下Ctrl Shift P&#xff08;Windows/Linux&#xff09;或Cmd Shift P&#xff08;Mac&#xff09;来打开命令面板。输入open settings&#xff0c;然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----&#xff1a; 1、 html代码的行长度&am…

汽车电子元件的可靠性保障:AEC-Q102认证

AEC-Q102标准的起源与价值 随着汽车电子系统的日益复杂&#xff0c;电子器件必须能够在极端的温度、湿度、振动和电磁干扰等恶劣条件下保持性能。AEC-Q102标准由汽车电子委员会&#xff08;AEC&#xff09;制定&#xff0c;专门针对LED、激光二极管和光电二极管等光电器件&…

RK3576 Android14,内存大于4G时UVC应用无法申请内存

最近有个项目需要将Linux虚拟成UVC摄像头&#xff0c;开发过程中遇到一个奇怪的事情&#xff0c;通过V4l2框架接口申请内存时&#xff0c;相同的板子&#xff0c;只是内存一个4G一个8G。4G的内存可以申请成功&#xff0c;8G就不行。提示“内存不足” 内存更大反而内存不足&…

RK356X camera 配置

目录 一、RK356x camera硬件 Mipi接口 DVP接口 二、软件链路 三、dts配置 DVP MIPI sensor->dphy->isp_vir 一、RK356x camera硬件 RK356X包含RK3566和RK3568,在camera方面,两颗芯片的软硬件是兼容的,共有两种硬件连接方式:DVP和MIPI。 Mipi接口 图一 如图…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

批量合并多个Excel到一个文件

工作中&#xff0c;我们经常需要将多个Excel的数据进行合并&#xff0c;很多插件都可以做这个功能。但是今天我们将介绍一个完全免费的独立软件【非插件】&#xff0c;来更加方便的实现这个功能。 准备Excel 这里我们准备了两张待合并的Excel文件 的卢易表 打开的卢易表软件…

GLM4模型详解 - 智谱AI开源大模型全面解析

&#x1f4da; 2024年6月5日,智谱AI在开发者大会上正式开源GLM-4-9B系列大模型。本文将全面解析GLM4的技术特点、部署方案和应用场景。 GLM-4-9B 模型具备了更强大的推理性能、更长的上下文处理能力、多语言、多模态和 All Tools 等突出能力。 “All Tools” 一、模型概述 1.…

ssm-day04 mybatis

mybatis是一个持久层框架&#xff0c;针对的是JDBC的优化 简化数据库操作&#xff0c;能进行单表、多表操作&#xff0c;在这个框架下&#xff0c;需要我们自己写SQL语句 Mapper接口和MapperXML文件就相当于Dao和Dao层的实现 通常将xml文件放在resources包下 &#xff0c;放在…

观测云亮相 Doris Summit,展示流式聚合创新技术

01 技术亮点&#xff1a;重新定义流式聚合的效率与体验 在演讲中&#xff0c;熊豹详细介绍了 GuanceDB 如何支撑观测云的全量业务场景&#xff0c;并分享了 SelectDB 在处理复杂查询中的应用与挑战。从动态表结构管理到函数下推优化&#xff0c;观测云通过灵活的架构设计有效解…

qt中tr的使用

在 Qt 中使用 tr 函数对字符串进行翻译时&#xff0c;通常会通过 Qt Linguist 工具来处理翻译。以下是一个基本的步骤说明&#xff0c;展示如何将 QPushButton *btnnew QPushButton(tr("Hello World"),this); 翻译成其他语言&#xff0c;比如中文&#xff1a; 1.创建…

基于X410的LabVIEW FPGA跳频通信系统开发

跳频通信系统是一种高效的无线通信技术&#xff0c;通过在多个频率间快速切换&#xff0c;提高抗干扰能力和信号安全性。以NI USRP X410为硬件平台&#xff0c;利用LabVIEW FPGA实现一个实时跳频通信系统&#xff0c;涵盖信号生成、触发控制、接收检测及实时数据处理。 系统架构…

校园交友app/校园资源共享小程序/校园圈子集合二手物品交易论坛、交友等综合型生活服务社交论坛

多客校园社交圈子系统搭建 校园交友多功能系统源码: 1、更改学校为独立的模块。整体UI改为绿色&#xff0c;青春色&#xff0c;更贴近校园风格。2、圈子归纳到学校去进行运营。每个学校可建立多个圈子。和其他学校圈子互不干扰。3、增加用户绑定学校&#xff0c;以后进入将默认…

医院跌倒检测识别 使用YOLO,COCO ,VOC格式对4806张原始图片进行标注,可识别病人跌倒,病人的危险行为,病床等场景,预测准确率可达96.7%

医院跌倒检测识别 使用YOLO,COCO ,VOC格式对4806张原始图片进行标注&#xff0c;可识别病人跌倒&#xff0c;病人的危险行为&#xff0c;病床等场景&#xff0c;预测准确率可达96.7&#xff05; 数据集分割 4806总图像数 训练组70&#xff05; 3364图片 有效集20&#…

SQL进阶技巧:如何根据工业制程参数计算良品率?

目录 0 问题描述 1 数据准备 2 问题分析 步骤1&#xff1a;确定每个生产批次的制程参数是否在合格范围内 步骤2&#xff1a;基于中间结果一计算临时良品数量 步骤3&#xff1a;计算良品率&#xff08;最终结果&#xff09; 3 小结 问题拓展&#xff1a;如果制程参数是动…

RK3568平台(内存篇)内存管理架构

一.内存管理架构 内核管理内存的基本单位page页: 物理内存被分割成相同大小的组,内核用页来表示这个组,页是内核管理内存的基本单位,尽管处理器的最小可寻址单位通常是字, 但是, 内存管理单元MMU通常以页为单位进行处理. 因此,从虚拟内存的上来看,页就是最小单位. 页帧…