Mycat

Mycat可以简单概括为

  • 一个彻底开源的,面向企业应用开发的大数据库集群
    支持事务、ACID、可以替代MySQL的加强版数据库
  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个新颖的数据库中间件产品
    Mycat 官网:
    http://www.mycat.io/

Mycat关键特性

  • 支持SQL92标准
  • 遵守MySQL 原生协议,跨语言,跨平台,跨数据库的通用中间件代理
  • 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群
  • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
  • 基于Nio实现,有效管理线程,高并发问题
  • 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页
  • 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join
  • 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
  • 支持多租户方案
  • 支持分布式事务(弱xa)
  • 支持全局序列号,解决分布式下的主键生成问题
  • 分片规则丰富,插件化开发,易于扩展
  • 强大的web,命令行监控
  • 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉
  • 支持密码加密
  • 支持服务降级
  • 支持IP白名单
  • 支持SQL黑名单、sql注入攻击拦截
  • 支持分表(1.6)
  • 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)

Mycat应用场景

Mycat适用的场景很丰富,以下是几个典型的应用场景

  • 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
  • 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
  • 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化报表系统,借助于Mycat的分表能力,处理大规模报表的统计
  • 替代Hbase,分析大数据
  • 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择
  • Mycat长期路线图
  • 强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能
  • 进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能
  • 不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升

Mycat不适合的应用场景

  • 设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
  • 设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
  • 设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
  • 设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!

MyCat的高可用性

需要注意: 在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障.
可以使用的高可用集群方式有:

  • Keepalived+Mycat+Mysql
  • Keepalived+LVS+Mycat+Mysql
  • Keepalived+Haproxy+Mycat+Mysql

Mycat+MySQL实现读写分离

Mycat安装

下载安装JDK

[root@centos8|~]#yum -y install java
[root@centos8|~]#java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

下载安装mycat

[root@centos8|~]#wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-
linux.tar.gz
[root@centos8|~]#mkdir /app[root@centos8|~]#tar xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /app/mycat[root@centos8|~]#ls /app/mycat/
bin catlet conf lib logs version.txt

mycat安装目录结构:

  • bin mycat命令,启动、重启、停止等
  • catlet catlet为Mycat的一个扩展功能
  • conf Mycat 配置信息,重点关注
  • lib Mycat引用的jar包,Mycat是java开发的
  • logs 日志文件,包括Mycat启动的日志和运行的日志
  • version.txt mycat版本说明

logs目录:

  • wrapper.log mycat启动日志
  • mycat.log mycat详细工作日志

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

  • server.xml Mycat软件本身相关的配置文件,设置账号、参数等
  • schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制
  • rule.xml Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等

启动和连接

#配置环境变量
[root@centos8|~]#vim /etc/profile.d/mycat.sh
PATH=/app/mycat/bin:$PATH
[root@centos8|~]#source /etc/profile.d/mycat.sh#启动
mycat start
#查看日志,确定成功
cat /app/mycat/logs/wrapper.log
...省略...
INFO   | jvm 1   | 2019/11/01 21:41:02 | MyCAT Server startup successfully. see
logs in logs/mycat.log#连接mycat:
mysql -uroot -p123456 -h 127.0.0.1 -P8066

Mycat 主要配置文件说明

server.xml
存放Mycat软件本身相关的配置文件,比如:连接Mycat的用户,密码,数据库名称等
server.xml文件中配置的参数解释说明:

参数 说明
user 用户配置节点
name 客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。
password 客户端登录MyCAT的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如:db1,db2
privileges 配置用户针对表的增删改查的权限
readOnly mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false

注意:

  • server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息
  • 逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
  • 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!

schema.xml
是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的.MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的

schema.xml文件中配置的参数解释说明:
参数 说明
schema 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应

dataNode 分片信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库

配置说明

  • name属性唯一标识dataHost标签,供上层的标签使用。

  • maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数

  • minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小

    每个节点的属性逐一说明

#schema:
属性 说明
name 逻辑数据库名,与server.xml中的schema对应
checkSQLschema 数据库前缀相关设置,这里为false
sqlMaxLimit select 时默认的limit,避免查询全表#table
属性 说明
name 表名,物理数据库中表名
dataNode 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey 主键字段名,自动生成主键时需要设置
autoIncrement 是否自增
rule 分片规则名,具体规则下文rule详细介绍
#dataNode
属性 说明
name 节点名,与table中dataNode对应
datahost 物理数据库名,与datahost中name对应
database 物理数据库中数据库名
#dataHost
属性 说明
name 物理数据库名,与dataNode中dataHost对应
balance 均衡负载的方式
writeType 写入方式
dbType 数据库类型
heartbeat 心跳检测语句,注意语句结尾的分号要加schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:balance="0": 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上balance="1": 读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select 语句的负载均衡balance="2": 读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发balance="3": 读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本
有,1.3 没有

writeHost和readHost标签

这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。

唯一不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。

在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕
机,那么这个writeHost绑定的所有readHost都将不可用。
另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去

注意:
Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost

实战案例:利用Mycat实现MySQL的读写分离

10.0.0.7 -->client
10.0.0.8 -->MyCat
10.0.0.18 -->master
10.0.0.28 -->slave
1. 修改master和slave上的配置文件

#master上的my.cnf
[root@centos18 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id = 18
log-bin#slave上的my.cnf
[root@centos28 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
read_only=ON
server-id = 28
log-bin重启服务:systemctl restart mariadb

2. Master上创建复制用户(10.0.0.18)

GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'10.0.0.%'
IDENTIFIED BY '123456';MariaDB [(none)]> flush privileges;#查看二进制位置
show binlog events;
show master logs;

3. Slave上执行(10.0.0.28)

MariaDB [(none)]>
CHANGE MASTER TO
MASTER_HOST='10.0.0.18',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=370;start slave;show slave status\G

4. 在10.0.0.8安装mycat并启动

[root@centos8|~]#yum -y install java
#确认安装成功
[root@centos8|~]#java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)#下载并安装
[root@centos8|~]#wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@centos8|~]#mkdir /app[root@centos8|~]#tar xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /app/mycat[root@centos8|~]#ls /app/mycat/
bin catlet conf lib logs version.txt#配置环境变量
[root@centos8 ~]#vim /etc/profile.d/mycat.sh
PATH=/app/mycat/bin:$PATH
[root@centos8 ~]#source /etc/profile.d/mycat.sh#启动mycat
[root@centos8 ~]#mycat start
Starting Mycat-server...
[root@centos8 ~]#ss -ntlp[root@centos8 ~]#ss -ntlp
State           Recv-Q           Send-Q                     Local Address:Port Peer Address:Port                                           LISTEN          0                128                               0.0.0.0:22   0.0.0.0:*               users:(("sshd",pid=791,fd=5)) LISTEN          0                1                               127.0.0.1:32000 0.0.0.0:*               users:(("java",pid=4640,fd=4)) LISTEN          0                128                                 [::]:22   [::]:*               users:(("sshd",pid=791,fd=7)) LISTEN          0                50                                     *:1984 *:*               users:
(("java",pid=4640,fd=57))
LISTEN          0                100                                     *:8066 *:*               users:
(("java",pid=4640,fd=87))
LISTEN          0                50                                     *:43465 *:*               users:(("java",pid=4640,fd=58)) LISTEN          0                100                                     *:9066 *:*               users:
(("java",pid=4640,fd=83))
LISTEN          0                50                                     *:45259 *:*               users:(("java",pid=4640,fd=56))#查看状态
[root@centos8|mycat]#mycat status;
Mycat-server is running (1951).#查看日志,确定成功
[root@centos8 ~]#cat /app/mycat/logs/wrapper.log
ERROR | wrapper | 2020/02/28 15:21:48 | Startup failed: Timed out waiting for
a signal from the JVM.
ERROR | wrapper | 2020/02/28 15:21:48 | JVM did not exit on request,
terminated
INFO   | wrapper | 2020/02/28 15:21:48 | JVM exited on its own while waiting to
kill the application.
STATUS | wrapper | 2020/02/28 15:21:48 | JVM exited in response to signal
SIGKILL (9).
STATUS | wrapper | 2020/02/28 15:21:52 | Launching a JVM...
INFO   | jvm 2   | 2020/02/28 15:21:52 | OpenJDK 64-Bit Server VM warning:
ignoring option MaxPermSize=64M; support was removed in 8.0
INFO   | jvm 2   | 2020/02/28 15:22:13 | Wrapper (Version 3.2.3)
http://wrapper.tanukisoftware.org
INFO   | jvm 2   | 2020/02/28 15:22:13 |   Copyright 1999-2006 Tanuki Software,
Inc. All Rights Reserved.
INFO   | jvm 2   | 2020/02/28 15:22:13 |
INFO   | jvm 2   | 2020/02/28 15:22:31 | MyCAT Server startup successfully. see
logs in logs/mycat.log#用默认密码123456来连接mycat:
[root@centos8 ~]#mysql -uroot -p123456 -h 127.0.0.1 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+ 1 row in set (0.01 sec)
MySQL [TESTDB]> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| travelrecord     |
+------------------+ 1 row in set (0.00 sec)

5. 在mycat 服务器上修改server.xml文件配置Mycat的连接信息(10.0.0.8)
mycat登陆密码默认为123456

[root@centos8 ~]#vim /app/mycat/conf/server.xml
...省略...
<user name="root">                                       #连接Mycat的用户名<property name="password">123456</property>          #连接Mycat的密码<property name="schemas">TESTDB</property>           #数据库名要和schema.xml相
对应
</user>
</mycat:server>

这里使用的是root,密码为magedu,逻辑数据库为TESTDB,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。重点关注上面这段配置,其他默认即可。
6. 修改schema.xml实现读写分离策略(10.0.0.8)

[root@centos8 ~]#vim /app/mycat/conf/schema.xml                                 <?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">                                                                                                                <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><!-- auto sharding by id (long) --><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> --></schema><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> --><dataNode name="dn1" dataHost="localhost1" database="hellodb" /><!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /><dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /><dataNode       name="jdbc_dn2" dataHost="jdbchost" database="db2" /><dataNode name="jdbc_dn3"       dataHost="jdbchost" database="db3" /> --><dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="host1" url="10.0.0.18:3306" user="root"password="123456"><!-- can have multi read hosts --><readHost host="host2" url="10.0.0.28:3306" user="root" password="123456" /></writeHost><writeHost host="hostS1" url="localhost:3316" user="root"password="123456" /><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->#重新启动mycat
[root@centos8 ~]#mycat restart

上面配置中,balance改为1,表示读写分离。以上配置达到的效果就是10.0.0.18为主库,10.0.0.28为从库注意:要保证10.0.0.18和10.0.0.28机器能使用root/123456权限成功登录mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很重要,否则会导致登录mycat后,对库和表操作失败!

范例:schema.xml

7. 在后端主服务器创建用户并对mycat授权10.0.0.18

[root@centos18 ~]#mysql mysql>GRANT ALL ON *.* TO 'root'@'10.0.0.8' IDENTIFIED BY '123456' WITH GRANT OPTION;mysql> flush privileges;

8. 在Mycat服务器上连接并测试

[root@centos8 ~]#mysql -uroot -p123456 -h10.0.0.7 -P8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.01 sec)mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| testlog           |
| toc               |
+-------------------+
8 rows in set (0.00 sec)

9. 通过通用日志确认实现读写分离

show variables like 'general_log';  #查看日志是否开启
set global general_log=on;    #开启日志功能
show variables like 'general_log_file'; #查看日志文件保存位置
set global general_log_file='tmp/general.log'; #设置日志文件保存位置

在主和从服务器分别启用通用日志,查看读写分离

[root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
general_log=ON
[root@centos8 ~]#systemctl restart mariadb
[root@centos8 ~]#tail -f /var/lib/mysql/centos8.log

9、停止从节点,MyCAT自动调度读请求至主节点

[root@slave ~]#systemctl stop mariadb
[root@client ~]#mysql -uroot -pmagedu -h192.168.100.10 -P8066
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         1 |
+-------------+
1 row in set (0.00 sec)
MySQL [(none)]>
[root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
general_log=ON
[root@centos8 ~]#systemctl restart mariadb
[root@centos8 ~]#tail -f /var/lib/mysql/centos8.log

9、停止从节点,MyCAT自动调度读请求至主节点

[root@slave ~]#systemctl stop mariadb
[root@client ~]#mysql -uroot -pmagedu -h192.168.100.10 -P8066
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         1 |
+-------------+
1 row in set (0.00 sec)
MySQL [(none)]>

MySQL中间件代理服务器MyCat相关推荐

  1. 分布式mysql中间件(mycat)

    官方地址: 主站:Mycat-server@github :  https://github.com/MyCATApache/Mycat-Server.git Mycat-web@github     ...

  2. zabbix历史数据mysql_处理Zabbixl历史数据库解决办法三---使用MySQL中间件为Zabbix数据库扩容...

    一 应用场景描述 前面介绍了两种处理Zabbix历史数据的解决办法,但是如果当监控数据继续增长的话是不足以解决问题的. 办法一适合在没有做表分区的情况下,只保留一段时间的数据,比如一个月,然后把老的数 ...

  3. mysql中间件研究(Atlas,cobar,TDDL,Mycat)

    2019独角兽企业重金招聘Python工程师标准>>> mysql中间件研究(Atlas,cobar,TDDL,Mycat) 博客分类: 数据库 mysql-proxy是官方提供的m ...

  4. mysql 分库分表中间件 mycat_阿里开源的分布式分库分表中间件之MyCat从入门到放弃...

    原标题:阿里开源的分布式分库分表中间件之MyCat从入门到放弃 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个Mycat分库方案: 根据 tt_waybi ...

  5. mysql中间件研究( Atlas,cobar,TDDL,mycat,heisenberg,Oceanus,vitess,OneProxy )

    mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...

  6. 我的架构梦:(五十四) 分库分表实战及中间件之Mycat实战

    分库分表实战及中间件之Mycat实战 一. Mycat 简介 二.Mycat 核心概念 三.server.xml配置 四.schema.xml配置 五.rule.xml配置 六.Mycat实战 七.M ...

  7. mysql中间件汇总

    一.写在前面 mysql作为互联网公司都会用到的数据库,在使用过程中.会用主从复制来提高性能.会用分库分表解决写入问题.以下介绍mysql中间件的一些实现方案 二.Atlas Atlas时 360 公 ...

  8. MySQL 中间件汇总比较

    360 Atlas 较为活跃,Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础上,对其进行了优 ...

  9. Mysql中间件研究

    转自:https://blog.csdn.net/kingzone_2008/article/details/51513910 mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡, ...

最新文章

  1. AI学高数达到MIT本科水平,学了微积分线性代数概率论等6门课,不光能做题还能出题...
  2. VS为VC++添加UAC控制(VC程序默认管理员运行)
  3. 14. Java基础之泛型
  4. java基础(七) 深入解析java四种访问权限
  5. boost::units模块实现异构单元片段
  6. 64win7+64Oracle+32plsql
  7. 关于purge master logs的一个小实验
  8. 如何熟悉一个开源项目
  9. Invalid Gradle JDK configuration found_带你了解Gradle编译速度是如何提升70%的
  10. 初步认识迭代服务器和并发服务器
  11. 关于git push报403的问题
  12. 环境部署(二):Linux下安装jenkins
  13. java mschart_关于vb中MSCHART控件画二维线图 - conkeyn - JavaEye技术网站
  14. 善用佳软:如何使用Beyond Compare比对class文件
  15. 纯php实现中秋博饼游戏(1):绘制骰子图案
  16. 电力通信网与运营商5G网络融合方案
  17. Word排版插件,VSTO公文排版,Word论文排版
  18. 华为网络设备查看电源状态检查命令
  19. Root Cause Analysis of Anomalies of Multitier Services in Public Clouds
  20. 未来十年最容易消失和最不易被取代的22个职业,越看越心惊!附相关专业

热门文章

  1. nginx expires 缓存
  2. python第六课——列表
  3. Git 底层数据存储结构与工作原理介绍
  4. Mac风扇声音大的原因以及如何解决
  5. 2021年Java程序员职业规划!吐血整理
  6. 如何设置好看的form表单样式_微信新样式!微信设置“特效字体”,朋友圈变笑脸,好看!...
  7. 欢迎加入arcgis engine java QQ群
  8. 动态代理 需求:一个超级明星技能跳舞、唱歌、拍电影、睡觉。明星经纪人公司接活动,赚的钱37分。请用写出代码。
  9. 神经网络/深度学习(一)
  10. Morin 魔音音乐软件分享