环境和工程搭建

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.rhkb.cn/news/490892.html

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

相关文章

港科夜闻 | 香港科大与荷兰代尔夫特理工大学(TU Delft)建立合作伙伴关系,推动艺术科技教育与研究...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与荷兰代尔夫特理工大学(TU Delft)建立合作伙伴关系&#xff0c;推动艺术科技教育与研究。2024年12月6日&#xff0c;合作伙伴计划正式启动&#xff0c;双方期望透过合作加强艺术科技知识交流&#xff0c;借此推…

电脑游戏运行时问题解析:《Geometry Dash》DLL文件损坏的原因与解决方案

电脑游戏运行时问题解析&#xff1a;《Geometry Dash》DLL文件损坏的原因与解决方案 在探索《Geometry Dash》这款节奏明快、充满挑战的几何世界冒险游戏时&#xff0c;我们或许会遇到一些令人头疼的技术问题&#xff0c;其中之一便是DLL文件损坏。DLL&#xff08;动态链接库&…

爬虫逆向学习(十四):分享一下某数通用破解服务开发经验

阅前须知 这篇博客不是教大家怎么实现的&#xff0c;而且告知大家有这个东西&#xff0c;或者说一种趋势&#xff0c;借此分享自己大致的实现经验。具体的实现我也不好整理&#xff0c;毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道&#xff0…

Maven 的下载

目录 1、Maven 官方地址2、下载3、解压4、配置本地仓库 1、Maven 官方地址 https://maven.apache.org/ 2、下载 3、解压 将下载的压缩包解压到任意位置 4、配置本地仓库 在 Maven 的安装目录下新建文件夹&#xff0c;用来当作 Maven 的本地仓库 进入 conf 目录下&#xff…

【HarmonyOS】鸿蒙应用实现手机摇一摇功能

【HarmonyOS】鸿蒙应用实现手机摇一摇功能 一、前言 手机摇一摇功能&#xff0c;是通过获取手机设备&#xff0c;加速度传感器接口&#xff0c;获取其中的数值&#xff0c;进行逻辑判断实现的功能。 在鸿蒙中手机设备传感器ohos.sensor (传感器)的系统API监听有以下&#xf…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

统一身份安全管理体系的业务协同能力

随着集团企业数字化组织转型深化&#xff0c;各组织机构间业务协同程度提升。研发业务协同、数据驱动生产决策等数字化生产协作工作体系得以展开&#xff0c;企业内数据流转加快。企业对统一身份安全管理体系的业务协同管理和支撑能力要求提升&#xff1a; 统一身份管理流程需…

华为HarmonyOS NEXT 原生应用开发:鸿蒙中组件的组件状态管理、组件通信 组件状态管理小案例(好友录)!

文章目录 组件状态管理一、State装饰器1. State装饰器的特点2. State装饰器的使用 二、Prop装饰器&#xff08;父子单向通信&#xff09;1. Prop装饰器的特点2. Prop装饰器的使用示例 三、Link装饰器&#xff08;父子双向通信&#xff09;1. Link装饰器的特点3. Link使用示例 四…

CoolEdit详细使用和安装教程

Cool Edit Pro主要用于音频录制、编辑、混音和后期处理。Cool Edit Pro 的特点包括&#xff1a; 音频编辑&#xff1a;支持多轨编辑&#xff0c;可以同时处理多个音频文件&#xff0c;支持精确的音频剪切、复制、粘贴等操作。 录音功能&#xff1a;内置强大的录音功能&#xf…

如何量化管理研发团队的技术债务?

在探讨技术债的成因之前&#xff0c;我们需要澄清一些关于技术债起因和本质的普遍误解。 误解一&#xff1a;技术债务等同于劣质代码 那么&#xff0c;什么构成了所谓的「劣质代码」&#xff1f; 所谓的好代码&#xff0c;可能是指那些整洁、不会在未来限制你决策的代码&…

使用layui的table提示Could not parse as expression(踩坑记录)

踩坑记录 报错图如下 原因&#xff1a; 原来代码是下图这样 上下俩中括号都是连在一起的&#xff0c;可能导致解析问题 改成如下图这样 重新启动项目&#xff0c;运行正常&#xff01;

代理 IP 行业现状与未来趋势分析

随着互联网的飞速发展&#xff0c;代理 IP 行业在近年来逐渐兴起并成为网络技术领域中一个备受关注的细分行业。它在数据采集、网络营销、隐私保护等多个方面发挥着重要作用&#xff0c;其行业现状与未来发展趋势值得深入探讨。 目前&#xff0c;代理 IP 行业呈现出以下几个显著…

泷羽Sec学习笔记-zmap搭建炮台

zmap搭建炮台 zmap扫描环境&#xff1a;kali-linux 先更新软件库 sudo apt update 下载zmap sudo apt install zmap 开始扫描(需要root权限) sudo zmap -p 80 -o raw_ips.txt 代码解析&#xff1a; sudo&#xff1a;以超级用户&#xff08;管理员&#xff09;权限运行…

Introduction to NoSQL Systems

What is NoSQL NoSQL database are no-tabular非數據表格 database that store data differently than relational tables 其數據的存儲方式與關係型表格不同 Database that provide a mechanism機制 for data storage retrieval 檢索 that is modelled in means other than …

规则引擎(一)-技术要点

本文是规则引擎的第一篇&#xff0c;首先介绍规则引擎的技术要点&#xff0c;系列后续文章大纲 1. 事实 事实是规则的依据&#xff0c;来源于业务&#xff0c;或是业务实体&#xff0c;或是多个业务实体的汇集 2. 项目 描述规则的项目结构&#xff1b;KIE核心api&#xff1b;s…

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip

redis集群 服务器更换ip&#xff0c;怎么办&#xff0c;怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后&#xf…

详解负载均衡

什么是负载均衡&#xff1f; 想象一下&#xff0c;你有一家餐厅&#xff0c;当有很多客人同时到来时&#xff0c;如果只有一名服务员接待&#xff0c;可能会导致服务变慢。为了解决这个问题&#xff0c;你可以增加更多的服务员来分担工作&#xff0c;这样每位服务员就可以更快…

SpringCloud微服务实战系列:03spring-cloud-gateway业务网关灰度发布

目录 spring-cloud-gateway 和zuul spring webflux 和 spring mvc spring-cloud-gateway 的两种模式 spring-cloud-gateway server 模式下配置说明 grayLb://system-server 灰度发布代码实现 spring-cloud-gateway 和zuul zuul 是spring全家桶的第一代网关组件&#x…

win10配置免密ssh登录远程的ubuntu

为了在终端ssh远程和使用VScode远程我的VM上的ubuntu不需要设置密码&#xff0c;需要在win10配置免密ssh登录远程的ubuntu。 在win10打开cmd&#xff0c;执行下面的代码生成密钥对&#xff08;会提示进行设置&#xff0c;按照默认的配置就行&#xff0c;一直回车&#xff09;&…

Jupyter Notebook 适合做机器学习开发吗?

现在很多机器学习项目都是在Jupyter notebook中开发、训练、调试和演示的&#xff0c;比如openai、deepmind等&#xff0c;kaggle比赛中的原生环境就是Jupyter notebook&#xff0c;几乎任何机器学习的开发都可以在上面进行。 对于问题中的困扰&#xff0c;想要写py文件&#x…