mycat学习

news/2024/4/28 23:15:00/文章来源:https://blog.csdn.net/beiduofen2011/article/details/128918030
安装部署

下载1:mycat2-install-template-1.21.zip

下载2:mycat2-1.21-release-jar-with-dependencies.jar

解压mycat2-install-template-1.21.zip

unzip mycat2-install-template-1.21.zip

把mycat2-1.21-release-jar-with-dependencies.jar放在mycat/lib中

修改mycat/conf/datasources/prototypeDs.datasource.json配置文件

{"dbType":"mysql","idleTimeout":60000,"initSqls":[],"initSqlsGetConnection":true,"instanceType":"READ_WRITE","maxCon":1000,"maxConnectTimeout":3000,"maxRetryCount":5,"minCon":1,"name":"prototypeDs","password":"Q61@t6Udu8mW","type":"JDBC","url":"jdbc:mysql://192.168.202.150:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8","user":"mysteel","weight":0
}

进入到mycat/bin目录,执行以下命令对文件分配权限

chmod 777 ./*

服务启动

./mycat start

客户端进行连接

默认的端口是8066,可以在mycat/conf/server.json中修改

默认的用户名密码是root/123456,可以在mycat/conf/user/root.user.json中修改

此时整体架构图为:

配置逻辑库

mycat默认有个集群,在mycat/conf/clusters/prototype.cluster.json中配置

{"clusterType":"MASTER_SLAVE","heartbeat":{"heartbeatTimeout":1000,"maxRetry":3,"minSwitchTimeInterval":300,"slaveThreshold":0},"masters":["prototypeDs"],"maxCon":200,"name":"prototype","readBalanceType":"BALANCE_ALL","switchType":"SWITCH"
}

默认有两个逻辑库:information_schema,mysql,在mycat/conf/schemas下面配置

当我们在mycat中操作information_schema,mysql逻辑库下面的表时候实际在操作原型库中表

现在让我们来配置新的业务逻辑库(逻辑库的名称要和原型库的名称一致

在客户端执行:

/*+ mycat:createSchema{"customTables":{},"globalTables":{},"normalTables":{},"schemaName":"yc_nacos","shardingTables":{},"targetName":"prototype"
} */;

会在mycat/conf/schemas目录下自动创建yc_nacos.schema.json文件,并且自动把逻辑库中的逻辑表和原型库中的真实表进行映射

多数据源整合

创建mysql数据源:

/*+ mycat:createDataSource{
"dbType":"mysql",
"name":"yc-mysql",
"url":"jdbc:mysql://192.168.201.68:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"admin_user",
"password":"mOoBzUHGtqeX"
} */;

配置逻辑库:

/*+ mycat:createSchema{"customTables":{},"globalTables":{},"normalTables":{},"schemaName":"oem_mysteel","shardingTables":{},"targetName":"yc-mysql"
} */;

oem_mysteel逻辑库下面的mysteel_data_3逻辑表对应的数据源是:192.168.202.150:3306

yc_nacos逻辑库下面的users逻辑表对应的数据源是:192.168.201.68:3306

不同数据源下面的表可以通过mycat进行联合查询

读写分离

在两个数据源(192.168.202.150:3306,192.168.201.68:3306)分别创建master_slave数据库,及在数据库下创建travelrecord表

CREATE database master_slave;
CREATE TABLE master_slave.`travelrecord` (`id` bigint NOT NULL AUTO_INCREMENT,`user_id` varchar(100) DEFAULT NULL,`traveldate` date DEFAULT NULL,`fee` decimal(10,0) DEFAULT NULL,`days` int DEFAULT NULL,`blob` longblob,PRIMARY KEY (`id`),KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

创建集群:

/*! mycat:createCluster{"name":"prototype","masters":["prototypeDs"],"replicas":["yc-mysql"]} */;

创建逻辑表关联集群

/*+ mycat:createSchema{"customTables":{},"globalTables":{},"normalTables":{},"schemaName":"master_slave","shardingTables":{},"targetName":"prototype"
} */;

查看集群状态:

/*+ mycat:showClusters{} */;

现在prototypeDs,yc-mysql两个数据源都可以读,我们改成只允许prototypeDs写,yc-mysql读,要修改两个地方

1、修改prototypeDs中的instanceType属性值为WRITE

{"dbType":"mysql","idleTimeout":60000,"initSqls":[],"initSqlsGetConnection":true,"instanceType":"WRITE","maxCon":1000,"maxConnectTimeout":3000,"maxRetryCount":5,"minCon":1,"name":"prototypeDs","password":"Q61@t6Udu8mW","type":"JDBC","url":"jdbc:mysql://192.168.202.150:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8","user":"mysteel","weight":0
}

2、修改集群中BALANCE_ALL改成BALANCE_ALL_READ

{"clusterType":"MASTER_SLAVE","heartbeat":{"heartbeatTimeout":1000,"maxRetryCount":3,"minSwitchTimeInterval":300,"showLog":false,"slaveThreshold":0.0},"masters":["prototypeDs"],"maxCon":2000,"name":"prototype","readBalanceType":"BALANCE_ALL","replicas":["yc-mysql"],"switchType":"SWITCH"
}

readBalanceType:查询负载均衡策略

BALANCE_ALL(默认值):获取集群中所有数据源

BALANCE_ALL_READ:获取集群中允许读的数据源

BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先

BALANCE_NONE:获取集群中允许写数据源,即主节点中选择

switchType

NOT_SWITCH:不进行主从切换

SWITCH:进行主从切换

配置重启之后:

当前主库prototypeDs中master_slave下面的travelrecord数据为:

当前从库yc-mysql中master_slave下面的travelrecord数据为:

现在在mycat客户端插入user_id为1000的数据:

insert into travelrecord(user_id)values ("1000");

此时主库prototypeDs中master_slave下面的travelrecord数据为:

此时从库yc-mysql中master_slave下面的travelrecord数据为:

现在在mycat客户端查询master_slave下面的travelrecord表数据为:

达到了在master_slave(prototypeDs)主库写,master_slave(yc-mysql)从库读的效果

配置prototypeDs,yc-mysql主从同步

可以查看https://yangcai.blog.csdn.net/article/details/122124151这个帖子

此时架构图为:

分库分表

创建数据源,因为我只准备了两个mysql库

/*+ mycat:createDataSource{
"dbType":"mysql",
"name":"m1",
"url":"jdbc:mysql://192.168.201.68:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"admin_user",
"password":"mOoBzUHGtqeX"
} */;
/*+ mycat:createDataSource{
"dbType":"mysql",
"name":"m2",
"url":"jdbc:mysql://192.168.202.150:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"mysteel",
"password":"Q61@t6Udu8mW"
} */;

在mycat/conf/datasources下面会创建m1.datasource.json m2.datasource.json两个文件

创建两个集群:

/*! mycat:createCluster{"name":"c0","masters":["m1"],"replicas":[]} */;
/*! mycat:createCluster{"name":"c1","masters":["m2"],"replicas":[]} */;

在mycat/conf/clusters下面会创建c0.cluster.json c1.cluster.json两个文件

注意:mycat分库分表默认选择的集群名称的规则是c${targetIndex},targetIndex是从0开始计算的

在mycat客户端创建分库分表逻辑库:

create database   sub_base_table;

在mycat/conf/schemas下面会创建sub_base_table.schema.json

在逻辑库下面创建分片表:

CREATE TABLE sub_base_table.`travelrecord` (`id` bigint NOT NULL AUTO_INCREMENT,`user_id` varchar(100) DEFAULT NULL,`traveldate` date DEFAULT NULL,`fee` decimal(10,0) DEFAULT NULL,`days` int DEFAULT NULL,`blob` longblob,PRIMARY KEY (`id`),KEY `id` (`id`)
)  ENGINE = INNODB DEFAULT CHARSET = utf8 dbpartition BY mod_hash ( user_id ) tbpartition BY mod_hash(id)tbpartitions 2 dbpartitions 2 ;

在sub_base_table.schema.json中的内容为:

{"customTables":{},"globalTables":{},"normalProcedures":{},"normalTables":{},"schemaName":"sub_base_table","shardingTables":{"travelrecord":{"createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2","function":{"properties":{"dbNum":"2","mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}","tableNum":"2","tableMethod":"mod_hash(id)","storeNum":2,"dbMethod":"mod_hash(user_id)"}},"shardingIndexTables":{}}},"views":{}
}

此时m1,m2数据源就会创建分库分表,规则就是sub_base_table_${dbIndex}/travelrecord_${tableIndex},sub_base_table和targetIndex是从0开始计算的

此时架构图为:

全局表

如果项目中有一些数据类似字典常量等字段,这种数据一般数据量不会很大,而且改动也比较少,通常这种表可以不需要进行拆分,把它当做全局表进行处理,每个分片都创建一张相同的表,在所有的分片上都保存一份数据。在进行插入、更新、删除操作时,会将sql语句发送到所有分片上进行执行,在进行查询时,也会把sql发送到各个节点。这样避免了跨库JOIN操作,直接与本分片上的全局表进行聚合操作。

特性:

全局表的插入、更新、删除等操作会实时在所有节点上执行,保持各个分片的数据一致性;

全局表的查询操作,随机从一个节点上进行;

全局表可以跟任何一个表进行 JOIN 操作

在mycat客户端sub_base_table逻辑库执行:

CREATE TABLE sub_base_table.`user_config` (
`user_id` varchar(100)  NOT NULL ,
`user_name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;

此时sub_base_table.schema.json中的内容为:

{"customTables":{},"globalTables":{"user_config":{"broadcast":[{"targetName":"c0"},{"targetName":"c1"}],"createTableSQL":"CREATE TABLE sub_base_table.`user_config` (\n\t`user_id` varchar(100) NOT NULL,\n\t`user_name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`user_id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"}},"normalProcedures":{},"normalTables":{},"schemaName":"sub_base_table","shardingTables":{"travelrecord":{"createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2","function":{"properties":{"dbNum":"2","mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}","tableNum":"2","tableMethod":"mod_hash(id)","storeNum":2,"dbMethod":"mod_hash(user_id)"}},"shardingIndexTables":{}}},"views":{}
}

则在m1,m2中的sub_base_table物理库中都会创建user_config表

普通表

就是常规表

CREATE TABLE sub_base_table.`user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

此时sub_base_table.schema.json中的内容为:

{"customTables":{},"globalTables":{"user_config":{"broadcast":[{"targetName":"c0"},{"targetName":"c1"}],"createTableSQL":"CREATE TABLE sub_base_table.`user_config` (\n\t`user_id` varchar(100) NOT NULL,\n\t`user_name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`user_id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"}},"normalProcedures":{},"normalTables":{"user":{"createTableSQL":"CREATE TABLE sub_base_table.`user` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8","locality":{"schemaName":"sub_base_table","tableName":"user","targetName":"prototype"}}},"schemaName":"sub_base_table","shardingTables":{"travelrecord":{"createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2","function":{"properties":{"dbNum":"2","mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}","tableNum":"2","tableMethod":"mod_hash(id)","storeNum":2,"dbMethod":"mod_hash(user_id)"}},"shardingIndexTables":{}}},"views":{}
}

普通表默认指向的集群是prototype,在prototypeDs-sub_base_table中会创建user表

ER表

基于E-R关系进行分片,子表的记录与其关联的父表的记录保存在同一个分片上,这样关联查询就不需要跨库进行查询,要注意的是无需指定ER表,是自动识别的,两表的分片算法一致就可以了

如:travel是travelrecord的附属表

CREATE TABLE sub_base_table.`travel` (`id` bigint NOT NULL AUTO_INCREMENT,`u_id` varchar(100) DEFAULT NULL,`travel` date DEFAULT NULL,PRIMARY KEY (`id`)
)  ENGINE = INNODB DEFAULT CHARSET = utf8 dbpartition BY mod_hash(u_id) tbpartition BY mod_hash(id) tbpartitions 2 dbpartitions 2 ;

此时sub_base_table.schema.json中的内容为:

{"customTables":{},"globalTables":{"user_config":{"broadcast":[{"targetName":"c0"},{"targetName":"c1"}],"createTableSQL":"CREATE TABLE sub_base_table.`user_config` (\n\t`user_id` varchar(100) NOT NULL,\n\t`user_name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`user_id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"}},"normalProcedures":{},"normalTables":{"user":{"createTableSQL":"CREATE TABLE sub_base_table.`user` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`name` varchar(100) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8","locality":{"schemaName":"sub_base_table","tableName":"user","targetName":"prototype"}}},"schemaName":"sub_base_table","shardingTables":{"travelrecord":{"createTableSQL":"CREATE TABLE sub_base_table.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(user_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2","function":{"properties":{"dbNum":"2","mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travelrecord_${tableIndex}","tableNum":"2","tableMethod":"mod_hash(id)","storeNum":2,"dbMethod":"mod_hash(user_id)"},"ranges":{}},"partition":{},"shardingIndexTables":{}},"travel":{"createTableSQL":"CREATE TABLE sub_base_table.`travel` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`u_id` varchar(100) DEFAULT NULL,\n\t`travel` date DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(u_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(id) TBPARTITIONS 2","function":{"properties":{"dbNum":"2","mappingFormat":"c${targetIndex}/sub_base_table_${dbIndex}/travel_${tableIndex}","tableNum":"2","tableMethod":"mod_hash(id)","storeNum":2,"dbMethod":"mod_hash(u_id)"}},"shardingIndexTables":{}}},"views":{}
}

当执行以下sql的时候的就避免了跨库join,跨库join查询的性能非常慢

select * from sub_base_table.`travel`  a  INNER JOIN  sub_base_table.`travelrecord` b on a.u_id = b.user_id 

查看配置的表是否具有ER关系,使用

/*+ mycat:showErGroup{}*/

group_id表示相同的组,该组中的表具有相同的存储分布

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

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

相关文章

Python列表的元素比较

在用python处理多个列表元素时,需要处理的信息一般比较多且杂。这时运用Python列表元素比较的方法,就能快速处理列表信息,能更轻松访问每个元素。1 问题如何运用Python列表的元素比较解决问题。2 方法方法一 for循环,此情况是list…

车道线检测-Eigenlanes 论文学习笔记

论文:《Eigenlanes: Data-Driven Lane Descriptors for Structurally Diverse Lanes》 代码:https://github.com/dongkwonjin/Eigenlanes 核心:在 Eigenlane Space 中检测车道线 创新点 Eigenlane:数据驱动的车道描述符&#xff…

VHDL语言基础-组合逻辑电路-基本逻辑门电路

数字电路中的四种基本操作是与、或、非及触发器操作,前三种为组合电路,后一种为时序电路。与非 、或非和异或的操作仍然是与、或、非的基本操作。与、或、非、与非、或非和异或等基本逻辑门电路为常用的门电路。 二输入与非门是一种常用的简单逻辑电路&a…

RabbitMQ 部署指南

RabbitMQ 部署指南RabbitMQ部署指南1.单机部署1.1.下载镜像1.2.安装MQ2.安装DelayExchange插件2.1.下载插件2.2.上传插件2.3.安装插件3.集群部署2.1.集群分类2.2.获取cookie2.3.准备集群配置2.4.启动集群2.5.测试2.5.1.数据共享测试2.5.2.可用性测试4.镜像模式4.1.镜像模式的特…

ant-design V4升级V5记录(成功篇)

官方文档:https://ant.design/docs/react/migration-v5-cn 1、安装运行工具之前,提交本地修改内容; 2、工具运行完,根据提示修改文件问题; 3、移除config文件中module, [import,{libraryName:antd, libr…

OpenResty(5):Openresty 模板渲染

1 导入lua-resty-template 下载 http://luarocks.org/modules/bungle/lua-resty-template 将template.lua文件复制到openresty/lualib/resty/目录下 2 示例 2.1 修改nginx.conf 设置模板路径:set $template_root /usr/local/openresty/nginx/html/templates; 设…

windows 重启redis的方法

目录打开本地的文件夹选中文件的路径输入cmd在cmd命令窗口中输入以下的指令指令的内容以及对应的命令含义前言:最近在本地搭建redis环境,突然发现本地的redis启动失败了,使用reids的启动命令也不行,于是找了不少的方法&#xff0c…

六、Linux文件 - lseek函数

目录 1.lseek函数 2.lseek函数实战 2.1宏SEEK_CUR的用法 2.2宏SEEK_END的用法 3.Open函数实战 - O_APPEND的用法 4.Linux在库函数中寻找相应的宏定义 1.lseek函数 off_t lseek(int fd,off_t offset,int whence);光标的偏移量 fd:文件描述符offset:偏移量whence: SEEK_…

Android Jetpack组件之WorkManager后台任务管理的介绍与使用(一)

一、介绍 Jetpack? 我们经常看到,似乎很高端,其实这个就是一个名词,或者说是一种框架概念。 Jetpack 包含一系列 Android 库,它们都采用最佳做法并在 Android 应用中提供向后兼容性。 Jetpack 应用架构指南概述了构…

记录复现一下第一次awd

前言 之前没打过awd,这次学长组织了一场awd娱乐赛,两个web一个pwn,还有一个黑盒,只会web,第一次啥也不会瞎打,被打烂了,不会写脚本,手交flag的感觉真“不错”,感觉awd还…

I/O多路复用

基础概念 Socket 套接字。百科:对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 例子1:客户端将数据通过网线发送到服务端,客户端发送数据需要一个出口,服务端接收数据需要一个入口,这两个“口子”就是…

开发技术-Java switch case 的简单用法

文章目录1. integral-selector2. case3. break4. default5. 总结最近开发写 switch 发现有的技术点还没有掌握,在此做个记录。ON JAVA 中文版中,关于 switch 的描述为: switch 有时也被划归为一种选择语句。根据整数表达式的值,s…

数据挖掘,计算机网络、操作系统刷题笔记47

数据挖掘,计算机网络、操作系统刷题笔记47 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,orac…

FFmpeg集成qsv的编译安装

文章目录FFmpeg集成qsv的编译安装一、参考二、编译安装流程1. LibVA 和 Media-Driver 的安装2. Intel Media SDK 编译3. ffmpeg的编译安装4. 验证安装FFmpeg集成qsv的编译安装 一、参考 Ubuntu20.04 ffmpeg添加 Intel核显QSV加速支持 视频和视频帧:Intel GPU&…

持续集成Jenkins (四)Jenkins+git+maven项目构建、自动化部署

GIT配置1.1 前言:需要安装 git 客户端.yum install git1.2 Jenkins 配置插件 Git 在仪表盘选择Manage Jenkins>>Plugin Manager>>进入如下页面,可以选择可选的插件,安装完成后的插件在installed里面可以看到,我这里已…

Conda安装到虚拟环境中的包在pycharm中不显示--pip下载的包都到了base环境中-Ubuntu20.04

问题 今天刚装了一个Ubuntu20.04系统,安装完Anaconda,虚拟环境的包也都下载好了,结果在pycharm中配置完解释器后,只有几个基础的包,切换到base环境后发现,这些包都被下载到了base环境中。 在网上查了各种…

安装PhpStorm2020.3

1、卸载旧软件 如果已安装软件,先打开文件安装目录,找到Uninstall.exe点击卸载 删除.jetbrains目录 点击软件“PhpStorm-2020.3.exe”安装 打开软件 打开一个新建的空文件夹,预加载 将BetterIntelliJ.zip拖动到idea的编辑区域 然后…

我们的微服务中为什么需要网关?

说起 Spring Cloud Gateway 的使用场景,我相信很多小伙伴都能够脱口而出认证二字,确实,在网关中完成认证操作,确实是 Gateway 的重要使用场景之一,然而并不是唯一的使用场景。在微服务中使用网关的好处可太多了&#x…

nodejs基于vue的饭店点餐外卖平台网站

本系统主要实现了管理员:首页、个人中心、用户管理、菜品分类管理、菜品信息管理、菜品评价管理、系统管理、订单管理,用户:首页、个人中心、菜品评价管理、我的收藏管理、订单管理,前台首页:首页、菜品信息、菜品资讯、个人中心、后台管理、…

C++——继承那些事儿你真的知道吗?

目录1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化2.父类和子类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6. 继承与静态成员7.复杂的菱形继承及菱形虚拟继承如何解决数据冗余和二…