SpringBoot笔记:SpringBoot集成Dataway

文章目录

  • 1、什么是 Dataway?
  • 2、主打场景
  • 3、技术架构
  • 4、整合SpringBoot
    • 4.1、maven 依赖
    • 4.2、初始化脚本
    • 4.3、整合 SpringBoot
  • 5、Dataway 接口管理
  • 6、Mybatis 语法支持
  • 7、小结

1、什么是 Dataway?

官网地址:https://www.hasor.net/docs/guides/quickstart
    Dataway 是依托 DataQL 服务聚合能力,为应用提供一个 UI 界面。并以 jar 包的方式集成到应用中。 通过 Dataway 可以直接在界面上配置和发布接口。
    这种模式的革新使得开发一个接口不必在编写任何形式的代码,只需要配置一条 DataQL 查询即可完成满足前端对接口的需求。 从而避免了从数据库到前端之间一系列的开发配置任务,例如:Mapper、DO、DAO、Service、Controller 统统不在需要。
    Dataway 特意采用了 jar 包集成的方式发布,这使得任意的老项目都可以无侵入的集成 Dataway。 直接改进老项目的迭代效率,大大减少企业项目研发成本。

效果图
Dataway 工具化的提供 DataQL 配置能力。这种研发模式的变革使得,相当多的需求开发场景只需要配置即可完成交付。从而避免了从数据存取到前端接口之间的一系列开发任务,例如:Mapper、BO、VO、DO、DAO、Service、Controller 统统不在需要。

如上图所示 Dataway 在开发模式上提供了巨大的便捷。虽然工作流程中标识了由后端开发来配置 DataQL 接口,但这主要是出于考虑接口责任人。但在实际工作中根据实际情况需要,配置接口的人员可以是产品研发生命周期中任意一名角色。

2、主打场景

主打场景并不是说 Dataway 适用范围仅限于此,而是经过多次项目实践。我们认为下面这些场景会有非常好的预期效果。

比如说 取数据 在一些报表、看板项目中即便是取数据逻辑在复杂。我们依然做到了真正的 零 开发,所有取数逻辑全部通过 DataQL + SQL 的方式满足。

对比往期项目对于后端技术人员的需求从 3~5 人的苦逼通宵加班,直接缩减为 1 人配置化搞定。

再比如,某个内部类 ERP 项目,20 多个表单页面,后端部分仅有 1000 行左右的核心代码。其它数据存取逻辑全部配置化完成。

  • 取数据

如果你只想从数据库或者服务中获取某类数据,不需要:VO、BO、Convert、DO、Mapper 这类东西。

  • 存数据

如果是从页面表单递交数据到数据库或者服务,免去 BO、FormBean、DO、Mapper 这类东西。

  • 数据聚合

基于服务调用结果经过结构转换并响应给前端。将数据库和服务等多个结果进行汇聚然后返回给前端。

3、技术架构

技术架构

4、整合SpringBoot

4.1、maven 依赖

<?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"><parent><artifactId>springboot-learning-parents</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>springboot-demo</groupId><artifactId>springboot-dataway</artifactId><version>1.0-SNAPSHOT</version><name>springboot-dataway</name><description>springboot 集成 dataway</description><packaging>jar</packaging><url>https://gitee.com/leo825/springboot-learning-parents.git</url><properties><start-class>com.demo.SpringbootDataWayApplication</start-class><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><mybatis.version>1.3.2</mybatis.version><mysql.version>8.0.28</mysql.version><dataway.version>4.2.5</dataway.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 集成 mybatis -->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>${mybatis.version}</version>-->
<!--        </dependency>--><!-- mysql 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--     dataway 相关   --><dependency><groupId>net.hasor</groupId><artifactId>hasor-spring</artifactId><version>${dataway.version}</version></dependency><dependency><groupId>net.hasor</groupId><artifactId>hasor-dataway</artifactId><version>${dataway.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.21</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

4.2、初始化脚本

打开数据库,创建两个新的表,用于维护 Dataway 的API,建表建议参考官方网站的,因为不同版本的 Hasor 依赖的表的字段可能是不同的。
建表语句如下(如果出现表问题,可以参照官方网站修改)

-- Dataway 中的API
CREATE TABLE interface_info (api_id          varchar(64)  NOT NULL COMMENT 'ID',api_method      varchar(12)  NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',api_path        varchar(512) NOT NULL COMMENT '拦截路径',api_status      varchar(4)   NOT NULL COMMENT '状态:-1-删除, 0-草稿,1-发布,2-有变更,3-禁用',api_comment     varchar(255) NOT NULL COMMENT '注释',api_type        varchar(24)  NOT NULL COMMENT '脚本类型:SQL、DataQL',api_script      mediumtext   NOT NULL COMMENT '查询脚本:xxxxxxx',api_schema      mediumtext   NOT NULL COMMENT '接口的请求/响应数据结构',api_sample      mediumtext   NOT NULL COMMENT '请求/响应/请求头样本数据',api_option      mediumtext   NOT NULL COMMENT '扩展配置信息',api_create_time varchar(32)  NOT NULL COMMENT '创建时间',api_gmt_time    varchar(32)  NOT NULL COMMENT '修改时间',PRIMARY KEY (api_id),UNIQUE KEY uk_interface_info (api_path)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Dataway 中的API';-- Dataway API 发布历史
CREATE TABLE interface_release (pub_id           varchar(64)  NOT NULL COMMENT 'Publish ID',pub_api_id       varchar(64)  NOT NULL COMMENT '所属API ID',pub_method       varchar(12)  NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',pub_path         varchar(512) NOT NULL COMMENT '拦截路径',pub_status       varchar(4)   NOT NULL COMMENT '状态:-1-删除, 0-草稿,1-发布,2-有变更,3-禁用',pub_comment      varchar(255) NOT NULL COMMENT '注释',pub_type         varchar(24)  NOT NULL COMMENT '脚本类型:SQL、DataQL',pub_script       mediumtext   NOT NULL COMMENT '查询脚本:xxxxxxx',pub_script_ori   mediumtext   NOT NULL COMMENT '原始查询脚本,仅当类型为SQL时不同',pub_schema       mediumtext   NOT NULL COMMENT '接口的请求/响应数据结构',pub_sample       mediumtext   NOT NULL COMMENT '请求/响应/请求头样本数据',pub_option       mediumtext   NOT NULL COMMENT '扩展配置信息',pub_release_time varchar(32)  NOT NULL COMMENT '发布时间(下线不更新)',PRIMARY KEY (pub_id),KEY idx_interface_release_api  (pub_api_id),KEY idx_interface_release_path (pub_path)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Dataway API 发布历史。';

创建测试表,以供测试

-- 人员表,测试用
CREATE TABLE `person` (`p_id` int DEFAULT NULL,`p_name` varchar(100) DEFAULT NULL,`p_phone` varchar(11) DEFAULT NULL,`p_score` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='人员表';-- 插入测试数据
INSERT INTO dataway.person (p_id,p_name,p_phone,p_score) VALUES(1,'李阳','123456','7890'),(2,'张骞','123456','7890'),(3,'马康敬','123456','7890'),(4,'尚世宇','123456','7890'),(5,'赵题','123456','7890'),(6,'王澳','123456','7890'),(7,'张三','13611112222','100'),(7,'张三','13611112222','100'),(7,'张三','13611112222','100');

测试数据:

4.3、整合 SpringBoot

SpringBoot 整合 Hasor 中的 Dataway 主要是将数据也配置到 Hasor 中,同时在启动入口开启 Hasor 和 Hasor-web。整合起来也是十分的简单。

package com.demo.config;import net.hasor.core.ApiBinder;
import net.hasor.core.DimModule;
import net.hasor.db.JdbcModule;
import net.hasor.db.Level;
import net.hasor.spring.SpringModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.sql.DataSource;/*** @Classname DatawayModule* @Description 将Hasor模块注入spring,并注入数据源* @Date 2023/7/28 11:43* @Created by Leo825*/
@DimModule  // Hasor 中的标签,表明是一个Hasor的model
@Component  // Spring 中的标签,表明是一个组件
public class DatawayModule implements SpringModule {@Autowiredprivate DataSource dataSource;@Overridepublic void loadModule(ApiBinder apiBinder) throws Throwable {// .DataSource form Spring boot into HasorapiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));}
}

启动类配置如下:

package com.demo;import net.hasor.spring.boot.EnableHasor;
import net.hasor.spring.boot.EnableHasorWeb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@EnableHasor // 在Spring 中启用 Hasor
@EnableHasorWeb //将 hasor-web 配置到 Spring 环境中,Dataway 的 UI 是通过 hasor-web 提供服务
@SpringBootApplication(scanBasePackages = { "com.demo"})
public class SpringbootDataWayApplication {public static void main(String[] args) {SpringApplication.run(SpringbootDataWayApplication.class, args);}
}

application.yml 文件配置如下:

# springboot多环境配置
#端口,项目上下文
server:port: 8080servlet:context-path: /springboot-dataway# 全局服务编码设置encoding:charset: utf-8enabled: trueforce: true# mysql 连接信息配置
spring:# mysql 数据库连接信息,本地使用 mysql 服务版本为:8.0.28datasource:username: rootpassword: 6tojyh*A3eQ6url: jdbc:mysql://localhost:3306/dataway?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=truedriver-class-name: com.mysql.cj.jdbc.Driver# druid 数据连接池配置druid:initial-size: 3min-idle: 3max-active: 10max-wait: 6000# 配置druid监控页aop-patterns: com.demo.* #监控springBeanstat-view-servlet: # 配置监控页功能enabled: true # 默认开启,这里显示说明login-username: admin # 登录名login-password: 6tojyh*A3eQ6 # 登录密码reset-enable: false # 禁用重置按钮web-stat-filter: # 监控 webenabled: trueurl-pattern: /* # 监控所有exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'  #放行filter:stat: # 对上面 filters 里的 stat 的详细配置slow-sql-millis: 1000 # 慢 sql 时间是毫秒单位的,执行时间 1 秒以上的为慢 SQLlog-slow-sql: true # 日志记录enabled: truewall:enabled: trueconfig:drop-table-allow: false # 禁用删除表的 sql# mdataway 配置
# 是否启用 Dataway 功能(必选:默认false)
HASOR_DATAQL_DATAWAY: true
# 开启 ui 管理功能(注意生产环境必须要设置为 false,否则会造成严重的生产安全事故)
HASOR_DATAQL_DATAWAY_ADMIN: true
# dataway  API工作路径(可选,默认:/api/)
HASOR_DATAQL_DATAWAY_API_URL: /api/
# dataway-ui 的工作路径(可选,默认:/interface-ui/)
HASOR_DATAQL_DATAWAY_UI_URL: /interface-ui/
# SQL执行器方言设置(可选,建议设置)
HASOR_DATAQL_FX_PAGE_DIALECT: mysql# 日志输出配置
logging:level:root: INFOorg:springframework:security: WARNweb: ERROR# 设置自己的 com.demo.mapper 目录 输出sql日志com.demo.mapper: debugfile:path: ./logsname: './logs/springboot-dataway.log'pattern:file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'

5、Dataway 接口管理

    首先介绍一些 Dataway的基本知识,Dataway 可以通过 UI 页面定义数据接口,然后通过自测和冒烟以后才能发布这个接口,当接口发布成功以后,就可以通过我们定义的接口路径来访问获取数据了,这些接口数据都是保存在我们上面创建的 interface_info 表中的,当然接口发布以后也可以修改,也即接口可以有历史版本,这些信息保存在 interface_release 表中,这也就是为什么我们什么要在上面定义这两个表;(Ps:当然 Dataway 也可以通过编写代码来实现)在Dataway的数据访问中使用的是一种名字叫做 DataQL 的脚本语言,类似 JavaScript 先来一段官网的说明定义:
    DataQL(Data Query Language)DataQL 是一种查询语言。旨在通过提供直观、灵活的语法来描述客户端应用程序的数据需求和交互。
    数据的存储根据其业务形式通常是较为简单的,并不适合直接在页面上进行展示。因此开发页面的前端工程师需要为此做大量的工作,这就是 DataQL 极力解决的问题。另外还支持使用SQL来,但是 SQL 在 Dataway 中最终也都是转换成 DataQL。
DataQL
Dataway页面说明:
1、功能按钮:可以查看所有已经发布的接口
2、功能按钮:可以创建新的接口
3、链接:打开 DataQL 接口说明
4、请求方式:Http 请求方式定义,默认是 POST 方法
5、接口路径:定义接口的请求路径,/interface/ 为配置文件中 HASOR_DATAQL_DATAWAY_API_URL 属性事先定义的值,后面补充路径,当接口路径发布后,后面定义的接口请求路径不能重名
6、接口说明:可以为接口添加中文说明
7、使用DataQL编写接口,默认选择为 DataQL
8、使用 SQl 编写接口
9、接口编写代码部分
10、功能按钮:保存9部分编写的代码,注意只有先保存才能进行冒烟测试
11、功能按钮:测试按钮,当编写接口代码时,使用此按钮进行接口测试
12、功能按钮:冒烟测试按钮,通过了冒烟测试以后才能发布
13、功能按钮:发布接口,发布接口以后以后就可以通过发布的接口获取数据
14、功能按钮:接口编辑历史记录,可以通过历史记录回滚9区域的代码
15、功能按钮:删除按钮,点击删除后删除已经发布的接口(数据库中也会清除这条记录)
16、18功能区域:这个区域可以设置接口的请求参数例如通过 POST 方法传输一个请求报文,在此区域定义
17、功能按钮:设置接口的请求头参数
19、功能区域:测试接口区域,点击11测试按钮或者12冒烟以后在此区域显示测试结果

DataQL 语言写法:

var dataSetFun = @@sql(name) <%select * from person where p_name = #{name} limit 10;
%>
// 执行这个 SQL,并返回结果
return dataSetFun(${name});

示例
将 API 接口发布,然后就可以测试 /springboot-dataway/api/queryByName 了
在这里插入图片描述

6、Mybatis 语法支持

// SQL 执行器切换为分页模式及首页页面设置
hint FRAGMENT_SQL_QUERY_BY_PAGE = true
hint FRAGMENT_SQL_QUERY_BY_PAGE_NUMBER_OFFSET = 1
hint FRAGMENT_SQL_PAGE_DIALECT = "mysql"// 统一转驼峰
// 问题及说明2:通过下边的查询SQL测试得出结论,转驼峰的规则是,全部字母小写下划线后的字母大写,特别要注意的是【这里的驼峰只针对数据查询的字段,分页字段默认是驼峰的,下面附上测试】。
// default、upper、lower、hump
hint FRAGMENT_SQL_COLUMN_CASE = "hump" // 定义查询SQL
// 问题及说明3:对mybatis的支持并不完善,支持的标签有<select> <insert> <delete> <update> <if> 和<foreach>相关,<where>标签测试是不支持的。
// 问题及说明4:Date类型数据的查询,需要使用 TO_CHAR 函数,否则是毫秒值。
var dataSetFun = @@mybatis(keyword) <%<select>SELECTp_id,p_nameFROMpersonWHERE p_name is not null<if test="keyword != null and keyword != ''">AND p_name like concat('%','${keyword}','%') </if>ORDER BY p_id</select>
%>// 创建分页查询对象
// 问题及说明5:参数的传递规则,顺序很重要,从左到右是SQL内的参数顺序。
var pageQuery =  dataSetFun(${keyword},${pageSize},${pageNumber});
// 设置分页信息
run pageQuery.setPageInfo({"pageSize"    : #{pageSize}, "currentPage" : #{pageNumber}
});
// 执行分页查询
var pageData = pageQuery.data();
// 查询分页信息
var pageInfo = pageQuery.pageInfo();
// 返回结果封装
// 问题及说明6:结果会封装到之前的value内。
return {"pageData" : pageData,"pageInfo" : pageInfo
};

测试结果:
测试结果

7、小结

总结一下,个人觉得Hasor还是有很多优点的,例如可以和方便的与SpringBoot结合,可以不用写Controller、service、dao、mapper这一套东西,可以动态修改配置API等等;但是缺点也是有的,个人觉得这东西还很年轻,有一定的学习成本(例如要学习DataQL)等等这些。
DataQL 语言:https://www.dataql.net/docs/dataql/overview

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

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

相关文章

k8s kubeadm命令升级集群 从1.17升级到1.18

k8s kubeadm命令升级集群 从1.17升级到1.18 大纲 注意事项master节点执行升级命令master节点和node节点执行命令 注意事项 目标当前线上k8s集群版本是k8s1.17 想把k8s升级到1.18。注意k8s不能跨版本升级例如k8s1.17不能直接升级到k8s1.19&#xff0c;需要先升级到1.18才后向…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

意外:WPS编程新工具,不用编程,excel用户:可以不用VBA啦

来来来&#xff0c;拓宽一下视野&#xff01; 别总以为excel和WPS只能用VBA编程&#xff0c;也别总是想着ACCESS这些老生常谈的工具。其实对于电子表格高级用户来讲&#xff0c;不会VBA&#xff0c;不用ACCESS&#xff0c;也一样可以解决复杂问题或者高级应用。 尤其是WPS用户…

【腾讯云 Cloud Studio 实战训练营】CloudStudio体验真正的现代化开发方式,双手插兜不知道什么叫对手!

CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01; 文章目录 CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01;前言出现的背景一、CloudStudio 是什么&#xff1f;二、CloudStudio 的特点三、CloudS…

PostgreSql 锁

一、概述 在 PostgreSQL 事务中提到&#xff0c;多个用户访问相同数据时可能出现脏读&#xff0c;不可重复度&#xff0c;幻读&#xff0c;更新丢失的问题&#xff0c;为解决这些问题&#xff0c;定义了不同的隔离级别&#xff0c;而隔离级别的具体实现&#xff0c;依靠的就是数…

钉钉群消息推送

1. 添加钉钉群机器人 PC端登录&#xff08;当前版本手机端无法进行推送关键词设置&#xff09;&#xff0c;群设置--> 机器人 --> webhook进行安全设置复制webhook对应的url 2. 群消息推送 钉钉群消息支持纯文本和markdown类型 2.1 调用示例源码 import com.alibaba.…

助你丝滑过度到 Vue3 组合式Api的优势新的组件 ②⑧

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

2023.08.01 驱动开发day8

驱动层 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/of_gpio.h>#…

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后&#xff0c;感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便&#xff0c;所以想在 Pycharm 中也能使用同一个 github 账号&#xff0c;用上 copilot 的功能。 不需要等待&#xff0c;安装即用&#xff…

【Web 表单】与用户数据打交道-1(mdn笔记)

0. Web 表单指南 我们将介绍 Web 表单的各个方面&#xff1a;HTML 结构、样式、验证表单数据&#xff0c;以及提交数据到服务器。 基本指南 你的第一个表单 第一次创建 HTML 表单的经验&#xff0c;包括设计一个简单表单、使用正确的 HTML 元素实现它、通过 CSS 添加一些非常简…

【Spring Cloud一】微服务基本知识

系列文章目录 微服务基本知识 系列文章目录前言一、系统架构的演变1.1单体架构1.2分层架构1.3分布式架构1.4微服务架构1.5分布式、SOA、微服务的异同点 二、CAP原则三、RESTfulRESTful的核心概念&#xff1a; 四、共识算法 前言 在实际项目开发过程中&#xff0c;目前负责开发…

Spring?Boot项目如何优雅实现Excel导入与导出功能

目录 背景EasyExcel 问题分析与解决Spring Boot Excel 导入与导出 依赖引入Excel 导入 基本导入功能进阶导入功能Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则ExcelValidator 接口定义校验规则校验结果接收 异常捕获接收校验结果contro…

小研究 - 主动式微服务细粒度弹性缩放算法研究(三)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

使用 Go 语言实现二叉搜索树

原文链接&#xff1a; 使用 Go 语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构&#xff0c;在很多项目中都能看到二叉树的身影。 它有很多变种&#xff0c;比如红黑树&#xff0c;常被用作 std::map 和 std::set 的底层实现&#xff1b;B 树和 B 树&#xff0c;…

Total Variation loss

Total Variation loss 适合任务 图像复原、去噪等 处理的问题 图像上的一点点噪声可能就会对复原的结果产生非常大的影响&#xff0c;很多复原算法都会放大噪声。因此需要在最优化问题的模型中添加一些正则项来保持图像的光滑性&#xff0c;图片中相邻像素值的差异可以通过…

传统计算机视觉

传统计算机视觉 计算机视觉难点图像分割基于主动轮廓的图像分割基于水平集的图像分割交互式图像分割基于模型的运动分割 目标跟踪基于光流的点目标跟踪基于均值漂移的块目标跟踪基于粒子滤波的目标跟踪基于核相关滤波的目标跟踪 目标检测一般目标检测识别之特征一般目标检测识别…

18.Netty源码之ByteBuf 详解

highlight: arduino-light ByteBuf 是 Netty 的数据容器&#xff0c;所有网络通信中字节流的传输都是通过 ByteBuf 完成的。 然而 JDK NIO 包中已经提供了类似的 ByteBuffer 类&#xff0c;为什么 Netty 还要去重复造轮子呢&#xff1f;本节课我会详细地讲解 ByteBuf。 JDK NIO…

Spring学习记录----十五、面向切面编程AOP+十六、Spring对事务的支持

目录 十五、面向切面编程AOP 15.1 AOP介绍 总结 15.2 AOP的七大术语 15.3 切点表达式 15.4 使用Spring的AOP 15.4.1 准备工作 15.4.1.1Spring AOP 基于注解之实现步骤 15.4.1.2-Spring AOP 基于注解之切点表达式 代码 运行结果&#xff1a; 代码 运行结果 通知类…

Python高阶技巧 递归

递归的定义 函数作为一种代码封装&#xff0c;可以被其他程序调用&#xff0c;当然&#xff0c;也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。 递归的思想 把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时&#…

SpringBoot集成Thymeleaf

Spring Boot 集成 Thymeleaf 模板引擎 1、Thymeleaf 介绍 Thymeleaf 是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板&#xff0c;既可以在浏览器中正确显示的 HTML&#xff0c;也可以用作静态原型&#xf…