SpringCloud 环境工程搭建

news2024/9/20 6:11:09

SpringCloud 环境&工程搭建

文章目录

  • SpringCloud 环境&工程搭建
    • 1. SpringCloud介绍
    • 2. 服务拆分原则
      • 2.1 单一职责原则
      • 2.2 服务自治
      • 2.3 单向依赖
      • 2.4 服务拆分示例
    • 3. 数据准备
    • 4. 工程搭建
      • 4.1 创建父工程
      • 4.2 创建子工程
        • 4.2.1 子项目-订单服务
        • 4.2.2 子项目-商品服务
      • 4.3 完善子工程
        • 4.3.1 完善订单服务
        • 4.3.2 完善商品服务
    • 5. 远程调用

1. SpringCloud介绍

SpringCloud 提供了一些可以让开发人员快速搭建分布式服务的工具,比如配置管理、服务发现、熔断、智能路由等,它们可以在任何分布式环境中很好的工作:

在这里插入图片描述

更直接的讲,SpringCloud 介绍分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合,比如:

  • Distributed/versioned configuration 分布式版本配置
  • Service registration and discovery 服务注册和发现
  • Load balancing 负载均衡
  • Service-to-service calls 服务调用

同时,SrpingCloud的所有子项目都依赖于SpringBoot,所以SpringBoot和SpringCloud的版本之间也存在一定的对应关系,在使用时需要注意彼此间的对应匹配:

在这里插入图片描述

2. 服务拆分原则

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

2.1 单一职责原则

在微服务架构中,一个微服务应该只负责一个功能或业务领域,每个服务应该有清晰的定义和边界,只关注自己的特定业务领域。

比较类似于,一个人专注的做一件事的效率远高于同时关注多件事情,而业务中如电商系统也是由多个服务共同构成的:

在这里插入图片描述

2.2 服务自治

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

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

在这里插入图片描述

2.3 单向依赖

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

在这里插入图片描述

在特定场景下如果无法避免循环依赖或双向依赖,可以考虑使用消息队列等其它方式来实现。

注:微服务并无标准架构,合适的就是最好的,在架构设计的过程中,坚持”合适由于业界领先“,避免为了设计而设计

2.4 服务拆分示例

我们以电商系统中的一个管理服务为例,即订单管理

在这里插入图片描述

概括的讲,这个页面提供了以下信息:

  1. 订单列表
  2. 商品信息

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

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

在这里插入图片描述

3. 数据准备

对于上述案例,我们使用JDK-17版本MySQL8版本进行构造,这里需要提前配置好。

根据服务自治原则,每个服务都应有自己独立的数据库。

订单服务:

-- 订单服务

-- 建库
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);

商品服务:

-- 数据初始化
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);

4. 工程搭建

在这个案例中,我们使用父子工程的方式来创建项目

4.1 创建父工程

  1. 先创建一个空的Maven项目,删除所有代码,只保留pom.xml
    在这里插入图片描述

  2. 完善pom.xml文件

    <?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>
    
        <packaging>pom</packaging>
    
        <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>
    

    :我们这里使用到了dependencyMangement来进行声明依赖,并不实现jar包的引入。如果子项目需要用到相关依赖,需要显式声明(也需要引入);如果子项目没有指定具体版本,会从父项目中读取version。如果子项目中指定了版本号,就会使用子项目中指定的jar版本。此外父工程的打包方式应该是pom,不是jar,这里需要手动使用packagin来声明.

    SpringCloud版本需要于Springboot版本对应,我们这里Springboot使用的是3.1.6版本,对应的SpringCloud版本则需使用2022.0.x中的任意版本即可:

    在这里插入图片描述

4.2 创建子工程

4.2.1 子项目-订单服务

在这里插入图片描述

构建order-service子工程:

在这里插入图片描述

声明 项目依赖项目构建插件

<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>
4.2.2 子项目-商品服务

构建 product-service 子工程

在这里插入图片描述

声明 项目依赖项目构建插件

<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>

4.3 完善子工程

4.3.1 完善订单服务

实现以下目录结构:

在这里插入图片描述

  1. 完善启动类

    package com.order;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class OrderServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(OrderServiceApplication.class, args);
        }
    }
    
  2. 配置文件 application.yml

    server:
      port: 8080
    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1/cloud_order?characterEncoding=utf8&useSSL=false
        username: root
        password: 11111
        driver-class-name: com.mysql.cj.jdbc.Driver
    # 设置 Mybatis 的 xml 保存路径
    mybatis:
      mapper-locations: classpath:mapper/*Mapper.xml
      configuration: # 配置打印 MyBatis 执行的 SQL
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        map-underscore-to-camel-case: true  #自动驼峰转换
    
  3. 构建实体类

    package com.order.model;
    
    import lombok.Data;
    
    import java.util.Date;
    
    @Data
    public class OrderInfo {
        private Integer id;
        private Integer userId;
        private Integer productId;
        private Integer num;
        private Integer price;
        private Integer deleteFlag;
        private Date createTime;
        private Date updateTime;
    }
    
  4. Controller层

    package com.order.controller;
    
    import com.order.model.OrderInfo;
    import com.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RequestMapping("/order")
    @RestController
    public class OrderController {
    
        @Autowired
        private OrderService orderService;
    
        @RequestMapping("/{orderId}")
        public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId) {
            return orderService.selectOrderById(orderId);
        }
    
    }
    
  5. Service层

    // OrderService
    package com.order.service;
    
    import com.order.model.OrderInfo;
    
    public interface OrderService {
        OrderInfo selectOrderById(Integer orderId);
    }
    
    // OrderServiceImpl
    package com.order.service.Impl;
    
    import com.order.mapper.OrderMapper;
    import com.order.model.OrderInfo;
    import com.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class OrderServiceImpl implements OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
    
        @Autowired
        private RestTemplate restTemplate;
        @Override
        public OrderInfo selectOrderById(Integer orderId) {
            OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
            return orderInfo;
        }
    }
    
  6. Mapper层

    package com.order.mapper;
    
    import com.order.model.OrderInfo;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    @Mapper
    public interface OrderMapper {
    
        @Select("select * from order_detail where id = #{orderId}")
        OrderInfo selectOrderById(Integer orderId);
    }
    

完善好上述代码后,我们来启动测试一下:

在这里插入图片描述

运行成功!

4.3.2 完善商品服务

实现以下目录:

在这里插入图片描述

  1. 完善启动类

    package com.product;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class ProductServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(ProductServiceApplication.class, args);
        }
    }
    
  2. 配置文件 application.yml

    server:
      port: 9090
    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1/cloud_product?characterEncoding=utf8&useSSL=false
        username: root
        password: 11111
        driver-class-name: com.mysql.cj.jdbc.Driver
    # 设置 Mybatis 的 xml 保存路径
    mybatis:
      mapper-locations: classpath:mapper/*Mapper.xml
      configuration: # 配置打印 MyBatis 执行的 SQL
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        map-underscore-to-camel-case: true  #自动驼峰转换
    
  3. 构建实体类

    package com.product.model;
    
    import lombok.Data;
    
    import java.util.Date;
    
    @Data
    public class ProductInfo {
        private Integer id;
        private String productName;
        private Integer productPrice;
        private Integer state;
        private Date createTime;
        private Date updateTime;
    }
    
  4. Controller层

    package com.product.controller;
    
    import com.product.model.ProductInfo;
    import com.product.service.ProductService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RequestMapping("/product")
    @RestController
    public class ProductController {
    
        @Autowired
        private ProductService productService;
    
        @RequestMapping("/{productId}")
        public ProductInfo getProductById(@PathVariable("productId") Integer productId) {
            return productService.selectProductById(productId);
        }
    }
    
  5. Service层

    // ProductService
    package com.product.service;
    
    import com.product.model.ProductInfo;
    
    public interface ProductService {
        ProductInfo selectProductById(Integer productId);
    }
    
    // ProductServiceImpl
    package com.product.service.Impl;
    
    import com.product.mapper.ProductMapper;
    import com.product.model.ProductInfo;
    import com.product.service.ProductService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class ProductServiceImpl implements ProductService {
    
        @Autowired
        private ProductMapper productMapper;
    
        @Override
        public ProductInfo selectProductById(Integer productId) {
            return productMapper.selectProductById(productId);
        }
    }
    
    
  6. Mapper层

    package com.product.mapper;
    
    import com.product.model.ProductInfo;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    @Mapper
    public interface ProductMapper {
    
        @Select("select * from product_detail where id = #{productId}")
        ProductInfo selectProductById(Integer productId);
    }
    

    完善好上述代码后,我们来启动测试一下:

    在这里插入图片描述

运行成功!

5. 远程调用

此时我们有一个需求,即根据订单查询订单信息时,根据订单里的产品ID来获取产品的详细信息:

在这里插入图片描述

我们可以通过远程调用的方式来实现:

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

实现方式:采用Spring提供的 RestTemplate 实现请求发送

  1. 定义RestTemplate

    package com.order.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class BeanConfig {
    
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
    }
    
  2. 引入并在OrderInfo中添加ProductInfo

    package com.order.model;
    
    import lombok.Data;
    
    import java.util.Date;
    
    @Data
    public class OrderInfo {
    
        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;
    }
    
  3. 修改OrderServiceImpl

    package com.order.service.Impl;
    
    import com.order.mapper.OrderMapper;
    import com.order.model.OrderInfo;
    import com.order.model.ProductInfo;
    import com.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class OrderServiceImpl implements OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
    
        @Autowired
        private RestTemplate restTemplate;
        @Override
        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);
            orderInfo.setProductInfo(productInfo);
            return orderInfo;
        }
    }
    

    此时访问127.0.0.1:8080/order/1测试结果:

    在这里插入图片描述

测试成功!!
我们也可以看到上面在进行远程调用时URL的IP和端口号是写死的(http://127.0.0.1:9090/product/),如果这个时候我们要更换IP了,原本部署完毕的程序就需要重新修改再部署,这样就会导致很多的问题,对此也能使用SrpingCloud来这个解决问题,敬请期待!!

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

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

相关文章

物联网专业创新人才培养体系的探索与实践

一、引言 随着物联网&#xff08;IoT&#xff09;技术的迅猛发展&#xff0c;物联网领域的人才需求日益增加。物联网技术作为新一轮信息技术革命的核心&#xff0c;已经渗透到社会生活的各个领域&#xff0c;对推动经济转型升级、提升国家竞争力具有重要意义。因此&#xff0c…

Redis 7.x 系列【26】集群模式动态扩容、动态缩容

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 动态扩容1.1 安装、启动1.2 加入新节点1.3 分配哈希槽1.4 加入从节点 2. 缩容2.1 删…

PHP场地预约共享茶室棋牌室小程序系统源码

&#x1f375;&#x1f3b2;【聚会新宠】场地预约神器&#xff0c;共享茶室棋牌室小程序大揭秘&#xff01;&#x1f389; &#x1f3e1;【开篇&#xff1a;告别繁琐&#xff0c;聚会新选择】&#x1f3e1; 还在为找不到合适的聚会场地而烦恼吗&#xff1f;想要一个既私密又舒…

python+onlyoffice+vue3项目实战20240722笔记,环境搭建和前后端基础代码

开发后端 先创建data目录,然后在data目录下创建一个test.docx测试文档。 后端代码: import json import req import api from api import middleware, PlainTextResponseasync def doc_callback(request):data = await api.req.get_json(request)print("callback ==…

微信小程序-CANVAS写入图片素材、文字等数据生成图片

微信小程序中&#xff0c;CANVAS写入图片素材、文字等数据生成图片&#xff0c;最终可将生成的 base64 格式图片保存至相册操作 Tips&#xff1a; 1、canvas 标签默认宽度 300px、高度 150px canvas 生成图片时&#xff0c;写入图片素材、文字等数据前&#xff0c;需要根据实…

git的一些使用技巧(git fetch 和 git pull的区别,git merge 和 git rebase的区别)

最近闲来无聊&#xff0c;虽然会使用git操作&#xff0c;但是 git fetch 和 git pull 的区别&#xff0c;git merge 和 git rebase的区别只是一知半解&#xff0c;稍微研究一下&#xff1b; git fetch 和 git pull 的区别 git fetch git fetch 是将远程仓库中的改动拉到本地…

鸿蒙仓颉语言【扩展Redis仓颉语言客户端】

2. 扩展Redis仓颉语言客户端 2.1 Redis命令处理模块的架构 Redis命令处理的架构图如下&#xff1a; RedisCommand类 Redis命令的实现类 包含以下成员&#xff1a; commandType: Redis命令的名称 commandArgs: Redis命令的参数列表 response: Redis命令的响应消息&#xff…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(十)-无人机A2X服务

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…

当当网数据采集:Scrapy框架的异步处理能力

在互联网数据采集领域&#xff0c;Scrapy框架以其强大的异步处理能力而著称。Scrapy利用了Python的异步网络请求库&#xff0c;如twisted&#xff0c;来实现高效的并发数据采集。本文将深入探讨Scrapy框架的异步处理能力&#xff0c;并展示如何在当当网数据采集项目中应用这一能…

npm 安装报错(已解决)+ 运行 “wue-cli-service”不是内部或外部命令,也不是可运行的程序(已解决)

首先先说一下我这个项目是3年前的一个项目了&#xff0c;中间也是经过了多个人的修改惨咋了布置多少个人的思想&#xff0c;这这道我手里直接npm都安装不上&#xff0c;在网上也查询了多种方法&#xff0c;终于是找到问题所在了 问题1&#xff1a; 先是npm i 报错在下面图片&…

下拉菜单过渡

下拉过渡&#xff0c;利用Y轴的transform&#xff1a;scaleY(0) —》transform&#xff1a;scaleY(1) 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" cont…

实战:MyBatis适配多种数据库:MySQL、Oracle、PostGresql等

概叙 很多时候&#xff0c;一套代码要适配多种数据库&#xff0c;主流的三种库&#xff1a;MySQL、Oracle、PostGresql&#xff0c;刚好mybatis支持这种扩展&#xff0c;如下图所示&#xff0c;在一个“namespace”&#xff0c;判断唯一的标志是iddatabaseId&#xff0c;刚好写…

学习vue3的搭建

Vue3 Vite项目构建 环境准备 1. NodeJs安装 安装NodeJs&#xff0c;安装成功后&#xff0c;以管理员身份打开命令行&#xff0c;输入命令 node -v查看NodeJs版本&#xff1b;输入命令 npm -v查看npm版本。 2. 安装cnpm 因为npm是国外的&#xff0c;下载资源的时候会翻墙&…

mysql面试(一)

前言 从今天开始&#xff0c;更新一些mysql的基础知识&#xff0c;面试会遇到的知识点之类的内容。比如四个隔离级别&#xff0c;mvcc机制&#xff0c;三大日志&#xff0c;索引&#xff0c;B树的形成等等&#xff0c;从数据库的底层来剖析索引和树是怎么形成的&#xff0c;以…

LeetCode //C - 257. Binary Tree Paths

257. Binary Tree Paths Given the root of a binary tree, return all root-to-leaf paths in any order. A leaf is a node with no children. Example 1: Input: root [1,2,3,null,5] Output: [“1->2->5”,“1->3”] Example 2: Input: root [1] Output: […

服务器利用宝塔面板部署Django项目

目录 1. 使用命令启动Django项目1.1 使用 Xshell 连接服务器1.2 安装Anaconda1.3 启动Django项目1.4 使用tmux实现项目的后台运行 2. 使用Python项目管理器部署项目2.1 安装宝塔面板和软件2.2 添加站点2.3 上传项目文件2.3.1 收集静态文件2.3.2 生成依赖文件 2.4 安装安装Pytho…

如何查看Kafka的偏移量offset

本文介绍三种方法查看Kafka的偏移量offset。 1. API&#xff1a;ConsumerRecord的offset()方法查看offset。 2. API&#xff1a;KafkaConsumer的position(TopicPartition partition)方法查看offset。 3. 命令行&#xff1a;kafka-consumer-groups.sh命令查看offset。 前提条…

OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结(一)

文章大纲 引言一、状态管理概述二、基本术语三、状态装饰器总览 引言 前面说了ArkTS 是在TypeScript基础上结合ArkUI框架扩展定制的&#xff0c;状态管理中的各种装饰器就是扩展的功能之一&#xff0c;可以让开发者通过声明式UI快速高效实现组件之间的数据同步&#xff0c;至于…

从PyTorch官方的一篇教程说开去(4 - Q-table来源及解决问题实例)

偷个懒&#xff0c;代码来自比很久之前看的书&#xff0c;当时还在用gym&#xff0c;我做了微调以升级到gymnasium当前版本&#xff0c;确保可以正常演示。如果小伙伴或者原作者看到了麻烦提一下&#xff0c;我好备注一下出处。 您的进步和反馈是我最大的动力&#xff0c;小伙…

Dav_笔记10:Using SQL Plan Management之1

SQL计划基准概述 SQL计划管理是一种预防机制&#xff0c;可以记录和评估SQL语句的执行计划。此机制可以构建SQL计划基准&#xff0c;这是一组SQL语句的已接受计划。已接受的计划已被证明表现良好。 SQL计划基准的目的 SQL计划基准的目标是保持相应SQL语句的性能&#xff0c;…