# 《Mycat核心技术》第15章:数据分片入门实战

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:介绍Myca的分片入门实战案例,掌握Mycat分片在实际案例场景中的应用,能够结合自身实际项目将Mycat分片灵活应用到自身实际项目中。

大家好,我是冰河~~

今天给大家介绍《Mycat核心技术》的第15章:给大家简单介绍下Mycat入门实现案例,好了,开始今天的内容。

有段时间没有更新博客了,今天就为大家带来一篇关于Mycat数据分片的文章。今天,我们不讲理论,也不对Mycat的配置进行详细剖析,有兴趣的童鞋可以阅读Mycat官方的权威指南,其中,对Mycat的原理和配置进行了详细的描述,这里不再赘述。今天,我们就一起来看看如何利用Myca进行数据分片,从而达到分库分表的目的。

注:MySQL服务器是安装在CentOS6.5服务器上,Mycat Server是安装在本机的Windows系统上,安装在什么环境上无所谓,本人用的是虚拟机安装的CentOS系统,开启多个虚拟机,电脑实在是吃力,所以将Mycat Server装在了本机的Windows系统上。

# 一、方案规划

IP 端口 服务 用户名 密码
192.168.81.131 3306 MySQL数据库 root root
192.168.81.132 3306 MySQL数据库 root root
192.168.81.133 3306 MySQL数据库 root root
192.168.81.130 8066/9066 Mycat Server admin admin123

如上表所示,在局域网的4台主机中,131——133的主机各安装有一台MySQL实例(这里不再讲解如何安装MySQL,有兴趣的同学可参见博文:《MySQL之——CentOS6.5 编译安装MySQL5.6.16 (opens new window)》在CentOS系统上安装MySQL数据库),130主机,也就是本机安装了Mycat Server。

现在假设系统的数据库为messagedb,里面只有2张表,一张表为消息表:message,一张表示消息来源的字典表:source,本案例实现的是按自然月分片的规则,因此上述3个mysql实例各自需要创建4个数据库,即

数据库实例 存储的数据库
192.168.81.131:3306 message201701、message201702、message201703、message201704
192.168.81.132:3306 message201705、message201706、message201707、message201708
192.168.81.133:3306 message201709、message201710、message201711、message201712

说明:如果是刚接触Mycat的小伙伴对分片不太理解,简单地说,对于Mycat,一个分片表示某一个MySQL实例上的某一个数据库,即schema@host,于是当我们原先的一张大表需要分片的时候,mycat就会按照我们设定的规则,把这张大表中的数据分散到各个分片上,即所谓的分表分库,因此我们需要在每个对应的分片上创建相同名称的数据库,相同结构的表。

# 二、环境准备

# 2.1 安装MySQL

详情参见博文:《MySQL之——CentOS6.5 编译安装MySQL5.6.16 (opens new window)

# 2.2 创建数据库并建表导入数据

根据数据库实例和存储的数据库对应关系表创建所有的数据库,并在每个数据库里执行如下脚本:

create table source (
        id int(11) not null auto_increment primary key comment 'pk',
        name varchar(10) default '' comment 'source name'
);
create table message (
        id int(11) not null auto_increment primary key comment 'pk',
        content varchar(255) default '' comment 'message content',
        create_time date default null,
        source_id int(11) not null,
        foreign key(source_id) references source(id)
);
insert into `source`(`id`,`name`) values(1,'weibo');
insert into `source`(`id`,`name`) values(2,'weixin');
insert into `source`(`id`,`name`) values(3,'qq');
insert into `source`(`id`,`name`) values(4,'email');
insert into `source`(`id`,`name`) values(5,'sms');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

在message表中,总共有4个字段:

  • id:主键
  • content:消息的内容
  • create_time:创建时间,这也是mycat进行分片时的参考字段
  • source_id:source表的外键

另外,我们在source表插入了5条记录,用于测试。到这里,后端数据库的环境就搭建完成了。

# 三、安装和配置Mycat

# 3.1 安装Mycat

安装Mycat的过程比较简单,在这个地址就可以下载安装包:https://github.com/MyCATApache/Mycat-download/tree/master/1.6-RELEASE。下载完之后,就进行解压到系统相应目录,这里就不细说了。

# 3.2 Mycat安装包结构

安装完之后,简单地看一下mycat目录结构:


# 3.3 启动Mycat

WIndows下启动需要以管理员身份打开命令行窗口,cd 到Mycat的bin目录下,或者将Mycat的 安装目录加入系统的环境变量path目录里,首先输入命令mycat install进行mycat服务的安装操作,然后 输入命令mycat start 启动Mycat Server。

Linux下进入Mycat的bin目录直接输入./mycat start 启动Mycat Server。

Mycat提供了两个端口,其中,9066端口是管理端口,提供查看当前系统节点的情况,报告心跳状态等相关系统监控的功能,8066是数据端口,相当于数据库的访问端口。我们可以使用mysql命令访问这里两个端口

mysql -h[mycat_host] -u[mycat_user] -p[mycat_passwd] -P [8066|9066]
1

同时,我们也可以修改这两个端口。

那么mycat_user和mycat_passwd是如何配置呢,下面就需要介绍mycat中最主要的3个配置文件:server.xml,schema.xml和rule.xml。

# 3.4 server.xml

该配置文件是用于配置mycat的系统信息,主要有两个标签:system和user。这里的user就是上述访问mycat服务的用户,不是后端数据库的用户。如果我们使用默认的配置,server.xml大概是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
                <property name="useSqlStat">0</property>  
                <property name="useGlobleTableCheck">0</property> 
                <property name="sequnceHandlerType">2</property>
                <property name="processorBufferPoolType">0</property>
                <property name="useOffHeapForMerge">1</property>
                <property name="memoryPageSize">1m</property>
                <property name="spillsFileBufferSize">1k</property>
                <property name="useStreamOutput">0</property>
                <property name="systemReserveMemorySize">384m</property>
        </system>
 
        <user name="admin">
                <property name="password">admin123</property>
                <property name="schemas">messagedb</property>
        </user>
</mycat:server>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

user标签下schemas属性表示该用户可以访问的数据库,可以定义多个数据库,用英文逗号隔开。schemas定义的数据库,一定要配置在后面的schema.xml文件对应的逻辑库,否则会提示无法访问。

# 3.5 schema.xml

schema配置文件比较复杂,也是最关键的一个配置文件,定义了mycat中的逻辑库、逻辑表,和分片的相关信息。配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 
        <schema name="messagedb" checkSQLschema="false" sqlMaxLimit="100">
                <table name="message" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10,dn11,dn12" rule="sharding-by-month" />
                <!-- global table is auto cloned to all defined data nodes ,so can join
                        with any table whose sharding node is in the same data node -->
                <table name="source" primaryKey="id" type="global" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10,dn11,dn12" />
        </schema>
        <dataNode name="dn1" dataHost="mysql-01" database="message201701" />
        <dataNode name="dn2" dataHost="mysql-01" database="message201702" />
        <dataNode name="dn3" dataHost="mysql-01" database="message201703" />
        <dataNode name="dn4" dataHost="mysql-01" database="message201704" />
        <dataNode name="dn5" dataHost="mysql-02" database="message201705" />
        <dataNode name="dn6" dataHost="mysql-02" database="message201706" />
        <dataNode name="dn7" dataHost="mysql-02" database="message201707" />
        <dataNode name="dn8" dataHost="mysql-02" database="message201708" />
        <dataNode name="dn9" dataHost="mysql-03" database="message201709" />
        <dataNode name="dn10" dataHost="mysql-03" database="message201710" />
        <dataNode name="dn11" dataHost="mysql-03" database="message201711" />
        <dataNode name="dn12" dataHost="mysql-03" database="message201712" />
 
        <dataHost name="mysql-01" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="192.168.81.131:3306" user="root"
                                   password="root">
                </writeHost>
        </dataHost>
 
        <dataHost name="mysql-02" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM2" url="192.168.81.132:3306" user="root"
                                   password="root">
                </writeHost>
        </dataHost>
 
        <dataHost name="mysql-03" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM3" url="192.168.81.133:3306" user="root"
                                   password="root">
                </writeHost>
        </dataHost>
</mycat:schema>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

几点要说明一下:

  • schema标签定义逻辑库,其下table子标签定义逻辑表,datanode属性定义该逻辑表需要分布到哪几个分片上,rule属性表示使用何种分片规则,这里我们选择sharding-by-month,这个规则的名称是自定义的,只要和后面的rule.xml对应起来即可
  • source表是一张全局表,这里需要使用type=”global”来定义,这样mycat就可以帮我们在指定的分片上克隆相同的数据,这对join查询是非常有好处的。
  • datanode标签定义了分片,datahost是主机名,对应dataHost标签的name属性值,database定义该主机数据库实例上的具体数据库名。
  • dataHost标签定义数据库实例,其下heartbeart标签表示心跳检测所使用的方法,writeHost标签定义写数据的实例,另外还有readHost标签可以定义读数据的实例,这里不考虑读写分离,仅使用写实例,因此需要把balance属性设置为0
  • 其他属性可以自行查阅官方权威指南
  • 最后,出于规范和安全考虑,最好不使用数据库的root用户,而是另外再创建一个用于mycat访问的用户。

# 3.6 rule.xml

rule.xml中定义了很多分片的规则,具体规则的算法可以参考官方权威指南,这里我们直接使用默认的就可以了,其中按自然月的分片规则配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	 <tableRule name="sharding-by-month">
                <rule>
                        <columns>create_time</columns>
                        <algorithm>partbymonth</algorithm>
                </rule>
        </tableRule>
		<function name="partbymonth"
                class="io.mycat.route.function.PartitionByMonth">
                <property name="dateFormat">yyyy-MM-dd</property>
                <property name="sBeginDate">2017-01-01</property>
        </function>
</mycat:rule>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  • tableRule标签定义分片规则的,其下columns标签表示对数据库表中的哪个字段应用规则,algorithm指定实现算法的名称,对应的是function标签中的name属性值
  • function标签定义对应的实现类,以及参数,包括dateFormat(日期格式)和sBeginDate(起始日期)

说明:起始日期是用来计算数据所在的分片位置,例如2017年1月的message就会找到第1个分片,即dn1,2017年12月的message就会找到第12个分片,即dn12,但是如果出现了2018年1月的message,mycat就会去找第13个分片,但是配置文件中又没有对应的配置,那么就会抛出无法找到分片的错误。

综上:server.xml定义了访问mycat服务的用户,以及该用户授权的数据库(逻辑库),schema.xml定义了具体的逻辑库,逻辑表,以及分片和数据库实例的信息,rule.xml分片规则和实现类。

# 四、测试

到这里已经完成了mycat的配置文件,但先不急着往里面灌数据,我们先访问管理端口9066,看一下运行情况:

C:\Users\binghe>mysql -uadmin -padmin123 -P9066
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (monitor)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show @@datanode;
+------+------------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST                | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+------------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1  | mysql-01/message201701 |     0 | mysql |      0 |    4 | 1000 |     412 |          0 |        0 |       0 |            -1 |
| dn10 | mysql-03/message201710 |     0 | mysql |      0 |    0 | 1000 |      11 |          0 |        0 |       0 |            -1 |
| dn11 | mysql-03/message201711 |     0 | mysql |      0 |    8 | 1000 |      16 |          0 |        0 |       0 |            -1 |
| dn12 | mysql-03/message201712 |     0 | mysql |      0 |    1 | 1000 |     412 |          0 |        0 |       0 |            -1 |
| dn2  | mysql-01/message201702 |     0 | mysql |      0 |    2 | 1000 |       9 |          0 |        0 |       0 |            -1 |
| dn3  | mysql-01/message201703 |     0 | mysql |      0 |    4 | 1000 |      11 |          0 |        0 |       0 |            -1 |
| dn4  | mysql-01/message201704 |     0 | mysql |      0 |    2 | 1000 |       9 |          0 |        0 |       0 |            -1 |
| dn5  | mysql-02/message201705 |     0 | mysql |      0 |    4 | 1000 |     413 |          0 |        0 |       0 |            -1 |
| dn6  | mysql-02/message201706 |     0 | mysql |      0 |    2 | 1000 |       9 |          0 |        0 |       0 |            -1 |
| dn7  | mysql-02/message201707 |     0 | mysql |      0 |    4 | 1000 |      11 |          0 |        0 |       0 |            -1 |
| dn8  | mysql-02/message201708 |     0 | mysql |      0 |    2 | 1000 |       9 |          0 |        0 |       0 |            -1 |
| dn9  | mysql-03/message201709 |     0 | mysql |      0 |    0 | 1000 |      11 |          0 |        0 |       0 |            -1 |
+------+------------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
12 rows in set (0.00 sec)

mysql> show @@heartbeat;
+--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME   | TYPE  | HOST           | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
+--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM2 | mysql | 192.168.81.132 | 3306 |       1 |     0 | idle   |       0 | 1,1,1        | 2017-03-04 14:22:59 | false |
| hostM1 | mysql | 192.168.81.131 | 3306 |       1 |     0 | idle   |       0 | 1,1,1        | 2017-03-04 14:22:59 | false |
| hostM3 | mysql | 192.168.81.133 | 3306 |       1 |     0 | idle   |       0 | 2,1,1        | 2017-03-04 14:22:59 | false |
+--------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
3 rows in set (0.00 sec)

mysql>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

如果看到各个节点都已经出现,并且心跳状态RS_CODE=1,则表示后端数据库连接正常。

现在我们用JDBC的方式批量插入1000万数据:

package com.mycat.test;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Random;

import org.junit.Test;

/**
 * 测试Mycat
 * @author binghe
 *
 */
public class TestMycat {
	private static final String driver = "com.mysql.jdbc.Driver";
	private static final String url = "jdbc:mysql://127.0.0.1:8066/messagedb?useServerPrepStmts=false&rewriteBatchedStatements=true";
	private static final String username = "admin";
	private static final String password = "admin123";
 
	@Test
	public void test() throws SQLException {
		Calendar calendar = Calendar.getInstance();
		Random random = new Random();
		calendar.set(2017, 0, 1, 0, 0, 0);
	
		Connection connection = null;
		PreparedStatement ps = null;
		try {
			Class.forName(driver);
			connection = (Connection) DriverManager.getConnection(url, username, password);
			connection.setAutoCommit(false);
			String sql = "insert into message(`content`, `create_time`, `source_id`) values(?,?,?)";
			ps = connection.prepareStatement(sql);
			long start = System.currentTimeMillis();
			for (int i = 0; i < 10000000; i++) {
				ps.setString(1, System.currentTimeMillis() + "");
				long randomtime = calendar.getTimeInMillis() + (random.nextInt(365) + 1) * 86400 * 1000l;
				Date date = new Date(randomtime);
				int source_id = random.nextInt(5) + 1;
				ps.setDate(2, date);
				ps.setInt(3, source_id);
				ps.addBatch();
				if (i != 0 && i % 10000 == 0) {
					System.out.println("execute batch : " + i);
					ps.executeBatch();
				}
			}
			ps.executeBatch();
			connection.commit();
			System.out.println(System.currentTimeMillis() - start);
		} catch (SQLException | ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (ps != null)
				ps.close();
			if (connection != null)
				connection.close();
		}
	}
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

如果运行的时候报错: Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage;,可以适当调大一下my.cnf下的max_binlog_cache_size参数。

# 五、验证

最后我们来检验一下分片的结果,其中message表中的数据根据create_time的值按月进行了分片,而source表作为全局表,则其数据出现在了每个分片上,下面贴出部分结果

mysql -h192.168.81.131 -uroot -proot -P3306 -e "select min(create_time),max(create_time) from message201702.message;": 
+------------------+------------------+
| min(create_time) | max(create_time) |
+------------------+------------------+
| 2017-02-01       | 2017-02-28       |
+------------------+------------------+
 
mysql -h192.168.81.132 -uroot -proot -P3306 -e "select min(create_time),max(create_time) from message201705.message;": 
+------------------+------------------+
| min(create_time) | max(create_time) |
+------------------+------------------+
| 2017-05-01       | 2017-05-31       |
+------------------+------------------+
 
mysql -h192.168.81.133 -uroot -proot -P3306 -e "select min(create_time),max(create_time) from message201709.message;": 
+------------------+------------------+
| min(create_time) | max(create_time) |
+------------------+------------------+
| 2017-09-01       | 2017-09-30       |
+------------------+------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql -h192.168.81.131 -uroot -proot -P3306 -e "select * from message201701.source"
+----+--------+
| id | name   |
+----+--------+
|  1 | weibo  |
|  2 | weixin |
|  3 | qq     |
|  4 | email  |
|  5 | sms    |
+----+--------+
 
mysql -h192.168.81.132 -uroot -proot -P3306 -e "select * from message201707.source"
+----+--------+
| id | name   |
+----+--------+
|  1 | weibo  |
|  2 | weixin |
|  3 | qq     |
|  4 | email  |
|  5 | sms    |
+----+--------+
 
mysql -h192.168.81.133 -uroot -proot -P3306 -e "select * from message201711.source"
+----+--------+
| id | name   |
+----+--------+
|  1 | weibo  |
|  2 | weixin |
|  3 | qq     |
|  4 | email  |
|  5 | sms    |
+----+--------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 六、总结

本文就mycat分片的特性进行一次实战操作,完成了部署mycat-server以及后端mysql数据库,并以按自然月为分片规则进行了相关的配置,最后做了一个小的测试来验证分片功能的正确性。

mycat还有其他比较强大的特性还有待进一步的研究使用,下一步的工作:

  • 完成读写分离的配置和测试
  • 整合zookeeper实现高可用集群

好了,今天就到这儿吧,我是冰河,我们下期见~~

# 星球服务

加入星球,你将获得:

1.项目学习:微服务入门必备的SpringCloud Alibaba实战项目、手写RPC项目—所有大厂都需要的项目【含上百个经典面试题】、深度解析Spring6核心技术—只要学习Java就必须深度掌握的框架【含数十个经典思考题】、Seckill秒杀系统项目—进大厂必备高并发、高性能和高可用技能。

2.框架源码:手写RPC项目—所有大厂都需要的项目【含上百个经典面试题】、深度解析Spring6核心技术—只要学习Java就必须深度掌握的框架【含数十个经典思考题】。

3.硬核技术:深入理解高并发系列(全册)、深入理解JVM系列(全册)、深入浅出Java设计模式(全册)、MySQL核心知识(全册)。

4.技术小册:深入理解高并发编程(第1版)、深入理解高并发编程(第2版)、从零开始手写RPC框架、SpringCloud Alibaba实战、冰河的渗透实战笔记、MySQL核心知识手册、Spring IOC核心技术、Nginx核心技术、面经手册等。

5.技术与就业指导:提供相关就业辅导和未来发展指引,冰河从初级程序员不断沉淀,成长,突破,一路成长为互联网资深技术专家,相信我的经历和经验对你有所帮助。

冰河的知识星球是一个简单、干净、纯粹交流技术的星球,不吹水,目前加入享5折优惠,价值远超门票。加入星球的用户,记得添加冰河微信:hacker_binghe,冰河拉你进星球专属VIP交流群。

# 星球重磅福利

跟冰河一起从根本上提升自己的技术能力,架构思维和设计思路,以及突破自身职场瓶颈,冰河特推出重大优惠活动,扫码领券进行星球,直接立减149元,相当于5折, 这已经是星球最大优惠力度!


领券加入星球,跟冰河一起学习《SpringCloud Alibaba实战》、《手撸RPC专栏》和《Spring6核心技术》,更有已经上新的《大规模分布式Seckill秒杀系统》,从零开始介绍原理、设计架构、手撸代码。后续更有硬核中间件项目和业务项目,而这些都是你升职加薪必备的基础技能。

100多元就能学这么多硬核技术、中间件项目和大厂秒杀系统,如果是我,我会买他个终身会员!

# 其他方式加入星球

特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。

# 星球规划

后续冰河还会在星球更新大规模中间件项目和深度剖析核心技术的专栏,目前已经规划的专栏如下所示。

# 中间件项目

  • 《大规模分布式定时调度中间件项目实战(非Demo)》:全程手撸代码。
  • 《大规模分布式IM(即时通讯)项目实战(非Demo)》:全程手撸代码。
  • 《大规模分布式网关项目实战(非Demo)》:全程手撸代码。
  • 《手写Redis》:全程手撸代码。
  • 《手写JVM》全程手撸代码。

# 超硬核项目

  • 《从零落地秒杀系统项目》:全程手撸代码,在阿里云实现压测(已上新)。
  • 《大规模电商系统商品详情页项目》:全程手撸代码,在阿里云实现压测。
  • 其他待规划的实战项目,小伙伴们也可以提一些自己想学的,想一起手撸的实战项目。。。

既然星球规划了这么多内容,那么肯定就会有小伙伴们提出疑问:这么多内容,能更新完吗?我的回答就是:一个个攻破呗,咱这星球干就干真实中间件项目,剖析硬核技术和项目,不做Demo。初衷就是能够让小伙伴们学到真正的核心技术,不再只是简单的做CRUD开发。所以,每个专栏都会是硬核内容,像《SpringCloud Alibaba实战》、《手撸RPC专栏》和《Spring6核心技术》就是很好的示例。后续的专栏只会比这些更加硬核,杜绝Demo开发。

小伙伴们跟着冰河认真学习,多动手,多思考,多分析,多总结,有问题及时在星球提问,相信在技术层面,都会有所提高。将学到的知识和技术及时运用到实际的工作当中,学以致用。星球中不少小伙伴都成为了公司的核心技术骨干,实现了升职加薪的目标。

# 联系冰河

# 加群交流

本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:星球编号

冰河微信

# 公众号

分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 冰河技术 微信公众号首发,强烈建议大家关注。

公众号:冰河技术

# 视频号

定期分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。

视频号:冰河技术

# 星球

加入星球 冰河技术 (opens new window),可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:hacker_binghe, 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习实战项目

关注 冰河技术 (opens new window)公众号,回复 星球 可以获取入场优惠券。

知识星球:冰河技术