forked from JAVA-01/JAVA-01
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path作业汇总.txt
381 lines (295 loc) · 19.8 KB
/
作业汇总.txt
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
进度:
Week1(1-2)
Week2(3-4)
Week3(5-6)
Week4(7-8)
Week5(9-10)
Week6(11-12)
Week7(13-14)
Week8(15-16)
Week9(17-18)
Week10(19-20)
Week11(21-22)
Week12(23-24)
Week13(25-26)
Week14(27-28)
Week15(29-30)
第1节课作业实践
1(可选)、自己写一个简单的 Hello.java,里面需要涉及基本类型,四则运行,if 和
for,然后自己分析一下对应的字节码,有问题群里讨论。
2(必做)、自定义一个 Classloader,加载一个 Hello.xlass 文件,执行 hello 方法, 此文件内容是一个 Hello.class 文件所有字节(x=255-x)处理后的文件。文件群里提供。
3(必做)、画一张图,展示 Xmx、Xms、Xmn、Metaspache、DirectMemory、Xss
这些内存参数的关系。
4(可选)、检查一下自己维护的业务系统的 JVM 参数配置,用 jstat 和 jstack、jmap 查看一下详情,并且自己独立分析一下大概情况,思考有没有不合理的地方,如何改进。
注意:
1、对于线上有流量的系统,慎重使用jmap命令。
2、如果没有线上系统,可以自己 run 一个 web/java 项目。或者直接查看idea进程。
课堂重点知识笔记和答疑链接,请在群里找或者向班主任索要。
第2节课作业实践
1、本机使用 G1 GC 启动一个程序,仿照课上案例分析一下 JVM 情况
可以使用gateway-server-0.0.1-SNAPSHOT.jar
注意关闭自适应参数:-XX:-UseAdaptiveSizePolicy
> java -Xmx1g -Xms1g -XX:-UseAdaptiveSizePolicy -XX:+UseSerialGC -jar target/gateway-server0.0.1-SNAPSHOT.jar
> java -Xmx1g -Xms1g -XX:-UseAdaptiveSizePolicy -XX:+UseParallelGC -jar target/gateway-server0.0.1-SNAPSHOT.jar
> java -Xmx1g -Xms1g -XX:-UseAdaptiveSizePolicy -XX:+UseConcMarkSweepGC -jar
target/gateway-server-0.0.1-SNAPSHOT.jar
> java -Xmx1g -Xms1g -XX:-UseAdaptiveSizePolicy -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -jar
target/gateway-server-0.0.1-SNAPSHOT.jar
使用jmap,jstat,jstack,以及可视化工具,查看jvm情况。
mac上可以用wrk,windows上可以按照superbenchmark压测 http://localhost:8088/api/hello 查看jvm。
第3节课作业实践
1、使用 GCLogAnalysis.java 自己演练一遍串行/并行/CMS/G1的案例。
2、使用压测工具(wrk或sb),演练gateway-server-0.0.1-SNAPSHOT.jar示例。
3、(选做)如果自己本地有可以运行的项目,可以按照2的方式进行演练。
根据上述自己对于1和2的演示,写一段对于不同GC的总结,提交到github。
第4节课作业实践
1、(可选)运行课上的例子,以及 Netty 的例子,分析相关现象。
2、(必做)写一段代码,使用 HttpClient 或 OkHttp 访问 http://localhost:8801,代
码提交到Github
第5节课作业实践
1、按今天的课程要求,实现一个网关,
基础代码可以 fork:https://github.com/kimmking/JavaCourseCodes
02nio/nio02 文件夹下
实现以后,代码提交到 Github。
1)周三作业:(必做)整合你上次作业的httpclient/okhttp;
2)周三作业(可选):使用netty实现后端http访问(代替上一步骤);
3)周日作业:(必做)实现过滤器 ~
4)周日作业(可选):实现路由
第6节课作业实践
1、(可选)跑一跑课上的各个例子,加深对多线程的理解
2、(可选)完善网关的例子,试着调整其中的线程池参数
第7节课作业实践
1、(选做)把示例代码,运行一遍,思考课上相关的问题。也可以做一些比较。
2、(必做)思考有多少种方式,在main函数启动一个新线程,运行一个方法,拿到这
个方法的返回值后,退出主线程?
写出你的方法,越多越好,提交到github。
一个简单的代码参考:
https://github.com/kimmking/JavaCourseCodes/tree/main/03concurrency/0301
/src/main/java/java0/conc0303/Homework03.java
第8节课作业实践
1、(选做)列举常用的并发操作API和工具类,简单分析其使用场景和优缺点。
2、(选做)请思考:什么是并发?什么是高并发?实现高并发高可用系统需要考虑哪些
因素,对于这些你是怎么理解的?
3、(选做)请思考:还有哪些跟并发类似/有关的场景和问题,有哪些可以借鉴的解决
办法。
4、(必做)把多线程和并发相关知识梳理一遍,画一个脑图,截图上传到github上。
可选工具:xmind,百度脑图,wps,MindManage,或其他。
第 9 节课作业实践
1、(选做)使 Java 里的动态代理,实现一个简单的 AOP。
2、(必做)写代码实现 Spring Bean 的装配,方式越多越好(XML、Annotation 都可以),
提交到 Github。
3、(选做)实现一个 Spring XML 自定义配置,配置一组 Bean,例如:
Student/Klass/School。
4、(选做,会添加到高手附加题)
4.1 (挑战)讲网关的 frontend/backend/filter/router 线程池都改造成 Spring 配置方式;
4.2 (挑战)基于 AOP 改造 Netty 网关,filter 和 router 使用 AOP 方式实现;
4.3 (中级挑战)基于前述改造,将网关请求前后端分离,中级使用 JMS 传递消息;
4.4 (中级挑战)尝试使用 ByteBuddy 实现一个简单的基于类的 AOP;
4.5 (超级挑战)尝试使用 ByteBuddy 与 Instrument 实现一个简单 JavaAgent 实现无侵入
下的 AOP。
第10节课作业实践
1. (选做)总结一下,单例的各种写法,比较它们的优劣。
2. (选做)maven/spring 的 profile 机制,都有什么用法?
3. (必做)给前面课程提供的 Student/Klass/School 实现自动配置和 Starter。
4. (选做)总结 Hibernate 与 MyBatis 的各方面异同点。
5. (选做)学习 MyBatis-generator 的用法和原理,学会自定义 TypeHandler 处理复杂类型。
6. (必做)研究一下 JDBC 接口和数据库连接池,掌握它们的设计和用法:
1)使用 JDBC 原生接口,实现数据库的增删改查操作。
2)使用事务,PrepareStatement 方式,批处理方式,改进上述操作。
3)配置 Hikari 连接池,改进上述操作。提交代码到 Github。
附加题(可以后面上完数据库的课再考虑做):
1. (挑战)基于 AOP 和自定义注解,实现 @MyCache(60) 对于指定方法返回值缓存60秒。
2. (挑战)自定义实现一个数据库连接池,并整合 Hibernate/Mybatis/Spring/SpringBoot。
3. (挑战)基于 MyBatis 实现一个简单的分库分表+读写分离+分布式 ID 生成方案。
第11课作业实践
1、(选做)尝试使用 Lambda/Stream/Guava 优化之前作业的代码。
2、(选做)尝试使用 Lambda/Stream/Guava 优化工作中编码的代码。
3、(选做)根据课上提供的材料,系统性学习一遍设计模式,并在工作学习中思考如何
用设计模式解决问题。
4、(选做)根据课上提供的材料,深入了解 Google 和 Alibaba 编码规范,并根据这
些规范,检查自己写代码是否符合规范,有什么可以改进的。
第12节课作业实践
1、(选做):基于课程中的设计原则和最佳实践,分析是否可以将自己负责的业务系统
进行数据库设计或是数据库服务器方面的优化。
2、(必做):基于电商交易场景(用户、商品、订单),设计一套简单的表结构,提交
DDL 的 SQL 文件到 Github(后面2周的作业依然要是用到这个表结构)。
3、(选做):尽可能多的从“常见关系数据库”中列的清单,安装运行,并使用上一题的
SQL 测试简单的增删改查。
4、(选做):基于上一题,尝试对各个数据库测试100万订单数据的增删改查性能。
5、(选做):尝试对 MySQL 不同引擎下测试100万订单数据的增删改查性能。
6、(选做):模拟1000万订单数据,测试不同方式下导入导出(数据备份还原)
MySQL 的速度,包括 jdbc 程序处理和命令行处理。思考和实践,如何提升处理效率。
7、(选做):对 MySQL 配置不同的数据库连接池(DBCP、C3P0、Druid、Hikari),
测试增删改查100万次,对比性能,生成报告。
第13节课作业实践
1、(选做)用今天课上学习的知识,分析自己系统的 SQL 和表结构
2、(必做)按自己设计的表结构,插入100万订单模拟数据,测试不同方式的插入效率。
3、(选做)按自己设计的表结构,插入1000万订单模拟数据,测试不同方式的插入效率。
4、(选做)使用不同的索引或组合,测试不同方式查询效率。
5、(选做)调整测试数据,使得数据尽量均匀,模拟1年时间内的交易,计算一年的销售报
表:销售总额,订单数,客单价,每月销售量,前十的商品等等(可以自己设计更多指标)。
6、(选做)尝试自己做一个 ID 生成器(可以模拟 Seq 或 Snowflake)。
7、(选做)尝试实现或改造一个非精确分页的程序。
第14节课作业实践
1、(选做)配置一遍异步复制,半同步复制、组复制。
2、(必做)读写分离-动态切换数据源版本1.0
3、(必做)读写分离-数据库框架版本2.0
4、(选做)读写分离-数据库中间件版本3.0
5、(选做)配置 MHA,模拟 master 宕机
6、(选做)配置 MGR,模拟 master 宕机
7、(选做)配置 Orchestrator,模拟 master 宕机,演练 UI 调整拓扑结构
第 15 节课作业实践
1、(选做)分析前面作业设计的表,是否可以做垂直拆分。
2、(必做)设计对前面的订单表数据进行水平分库分表,拆分2个库,每个库16张表。
并在新结构在演示常见的增删改查操作。代码、sql 和配置文件,上传到 Github。
3、(选做)模拟1000万的订单单表数据,迁移到上面作业2的分库分表中。
4、(选做)重新搭建一套4个库各64个表的分库分表,将作业2中的数据迁移到新分库。
第 16 课作业实践
1、(选做)列举常见的分布式事务,简单分析其使用场景和优缺点。
2、(必做)基于 hmily TCC 或 ShardingSphere 的 Atomikos XA 实现一个简单的分布
式事务应用 demo(二选一),提交到 Github。
3、(选做)基于 ShardingSphere narayana XA 实现一个简单的分布式事务 demo。
4、(选做)基于 seata 框架实现 TCC 或 AT 模式的分布式事务 demo。
5、(选做☆)设计实现一个简单的 XA 分布式事务框架 demo,只需要能管理和调用2
个 MySQL 的本地事务即可,不需要考虑全局事务的持久化和恢复、高可用等。
6、(选做☆)设计实现一个 TCC 分布式事务框架的简单 Demo,需要实现事务管理器,
不需要实现全局事务的持久化和恢复、高可用等。
7、(选做☆)设计实现一个 AT 分布式事务框架的简单 Demo,仅需要支持根据主键 id
进行的单个删改操作的 SQL 或插入操作的事务。
第 17 课作业实践
1、(选做)实现简单的Protocol Buffer/Thrift/gRPC(选任一个)远程调用demo。
2、(选做)实现简单的WebService-Axis2/CXF远程调用demo。
3、(必做)改造自定义RPC的程序,提交到github:
1)尝试将服务端写死查找接口实现类变成泛型和反射
2)尝试将客户端动态代理改成AOP,添加异常处理
3)尝试使用Netty+HTTP作为client端传输方式
4、(选做☆☆)升级自定义RPC的程序:
1)尝试使用压测并分析优化RPC性能
2)尝试使用Netty+TCP作为两端传输方式
3)尝试自定义二进制序列化
4)尝试压测改进后的RPC并分析优化,有问题欢迎群里讨论
5)尝试将fastjson改成xstream
6)尝试使用字节码生成方式代替服务端反射
第 18 课作业实践
1、(选做)按课程第二部分练习各个技术点的应用。
2、(选做)按dubbo-samples项目的各个demo学习具体功能使用。
3、(必做)结合dubbo+hmily,实现一个TCC外汇交易处理,代码提交到github:
1)用户A的美元账户和人民币账户都在A库,A使用1美元兑换7人民币;
2)用户B的美元账户和人民币账户都在B库,B使用7人民币兑换1美元;
3)设计账户表,冻结资产表,实现上述两个本地事务的分布式事务。
4、(挑战☆☆)尝试扩展Dubbo
1)基于上次作业的自定义序列化,实现Dubbo的序列化扩展;
2)基于上次作业的自定义RPC,实现Dubbo的RPC扩展;
3)在Dubbo的filter机制上,实现REST权限控制,可参考dubbox;
4)实现一个自定义Dubbo的Cluster/Loadbalance扩展,如果一分钟内调用某个服务/
提供者超过10次,则拒绝提供服务直到下一分钟;
5)整合Dubbo+Sentinel,实现限流功能;
6)整合Dubbo与Skywalking,实现全链路性能监控。
第 19 课作业实践
1、(选做)rpcfx1.1: 给自定义RPC实现简单的分组(group)和版本(version)。
2、(选做)rpcfx2.0: 给自定义RPC实现:
1)基于zookeeper的注册中心,消费者和生产者可以根据注册中心查找可用服务进行调
用(直接选择列表里的最后一个)。
2)当有生产者启动或者下线时,通过zookeeper通知并更新各个消费者,使得各个消费
者可以调用新生产者或者不调用下线生产者。
3、(挑战☆)在2.0的基础上继续增强rpcfx实现:
1)3.0: 实现基于zookeeper的配置中心,消费者和生产者可以根据配置中心配置参数
(分组,版本,线程池大小等)。
2)3.1:实现基于zookeeper的元数据中心,将服务描述元数据保存到元数据中心。
3)3.2:实现基于etcd/nacos/apollo等基座的配置/注册/元数据中心。
4、(挑战☆☆)在3.2的基础上继续增强rpcfx实现:
1)4.0:实现基于tag的简单路由;
2)4.1:实现基于Weight/ConsistentHash的负载均衡;
3)4.2:实现基于IP黑名单的简单流控;
4)4.3:完善RPC框架里的超时处理,增加重试参数;
5、(挑战☆☆☆)在4.3的基础上继续增强rpcfx实现:
1)5.0:实现利用HTTP头跨进程传递Context参数(隐式传参);
2)5.1:实现消费端mock一个指定对象的功能(Mock功能);
3)5.2:实现消费端可以通过一个泛化接口调用不同服务(泛化调用);
4)5.3:实现基于Weight/ConsistentHash的负载均衡;
5)5.4:实现基于单位时间调用次数的流控,可以基于令牌桶等算法;
6、(挑战☆☆☆☆)6.0:压测,并分析调优5.4版本。
第 20 课作业实践
1、(选做)进度快的,把前几次课的选做题做做。
2、(选做)进度慢的,把前几次课的必做题做做。
3、(选做)学霸和课代表,,考虑多做做挑战题。
第 21 课作业实践
1、(选做)按照课程内容,动手验证Hibernate和Mybatis缓存。
2、(选做)使用spring或guava cache,实现业务数据的查询缓存。
3、(挑战☆)编写代码,模拟缓存穿透,击穿,雪崩。
4、(挑战☆☆)自己动手设计一个简单的cache,实现过期策略。
2021,找到唯一。
在这个艰难的世界上,每天进步一点点,
坚守头顶的星空和心中的信念,成为更好的自己。
第 22 课作业实践
1、(挑战☆)基于其他各类场景,设计并在示例代码中实现简单demo:
1)实现分数排名或者排行榜;
2)实现全局ID生成;
3)基于Bitmap实现id去重;
4)基于HLL实现点击量计数。
5)以redis作为数据库,模拟使用lua脚本实现前面课程的外汇交易事务。
2、(挑战☆☆)升级改造项目:
1)实现guava cache的spring cache适配;
2)替换jackson序列化为fastjson或者fst,kryo;
3)对项目进行分析和性能调优。
3、(挑战☆☆☆)以redis作为基础实现上个模块的自定义rpc的注册中心。
第 23 课作业实践
1、(必做)配置redis的主从复制,sentinel高可用,Cluster集群。
2、(选做)练习示例代码里下列类中的作业题:
08cache/redis/src/main/java/io/kimmking/cache/RedisApplication.java
3、(选做☆)练习redission的各种功能;
4、(选做☆☆)练习hazelcast的各种功能;
5、(选做☆☆☆)搭建hazelcast 3节点集群,写入100万数据到一个map,模拟和演
示高可用;
第 24 课作业实践
1、(必做)搭建ActiveMQ服务,基于JMS,写代码分别实现对于queue和topic的消息
生产和消费,代码提交到github。
2、(选做)基于数据库的订单表,模拟消息队列处理订单:
1)一个程序往表里写新订单,标记状态为未处理(status=0);
2)另一个程序每隔100ms定时从表里读取所有status=0的订单,打印一下订单数据,
然后改成完成status=1;
3)(挑战☆)考虑失败重试策略,考虑多个消费程序如何协作。
3、(选做)将上述订单处理场景,改成使用ActiveMQ发送消息处理模式。
4、(选做)使用java代码,创建一个ActiveMQ Broker Server,并测试它。
5、(挑战☆☆)搭建ActiveMQ的network集群和master-slave主从结构。
6、(挑战☆☆☆)基于ActiveMQ的MQTT实现简单的聊天功能或者Android消息推送。
7、(挑战☆)创建一个RabbitMQ,用Java代码实现简单的AMQP协议操作。
8、(挑战☆☆)搭建RabbitMQ集群,重新实现前面的订单处理。
9、(挑战☆☆☆)使用Apache Camel打通上述ActiveMQ集群和RabbitMQ集群,实
现所有写入到ActiveMQ上的一个队列q24的消息,自动转发到RabbitMQ。
10、(挑战☆☆☆)压测ActiveMQ和RabbitMQ的性能。
第 25 课作业实践
1、(必做)搭建一个3节点Kafka集群,测试功能和性能;实现spring kafka下对kafka集群
的操作,将代码提交到github。
2、(选做)安装kafka-manager工具,监控kafka集群状态。
3、(挑战☆)演练本课提及的各种生产者和消费者特性。
4、(挑战☆☆☆)Kafka金融领域实战:在证券或者外汇、数字货币类金融核心交易系统里,
对于订单的处理,大概可以分为收单、定序、撮合、清算等步骤。其中我们一般可以用mq来
实现订单定序,然后将订单发送给撮合模块。
1)收单:请实现一个订单的rest接口,能够接收一个订单Order对象;
2)定序:将Order对象写入到kafka集群的order.usd2cny队列,要求数据有序并且不丢失;
3)撮合:模拟撮合程序(不需要实现撮合逻辑),从kafka获取order数据,并打印订单信息,
要求可重放, 顺序消费, 消息仅处理一次。
第 26 课作业实践
1、(选做)自己安装和操作RabbitMQ,RocketMQ,Pulsar,以及Camel和Spring
Integration。
2、(必做)思考和设计自定义MQ第二个版本或第三个版本,写代码实现其中至少一
个功能点,把设计思路和实现代码,提交到github。
3、(挑战☆☆☆☆☆)完成所有其他版本的要求。期限一年。
第 27 课作业实践
1、(选做)思考一下自己负责的系统,或者做过的系统,能否描述清楚其架构。
2、(选做)考虑一下,如果让你做一个针对双十一,某东某宝半价抢100个IPhone的
活动系统,你该如何考虑,从什么地方入手。
3、(选做)可以自行学习以下参考书的一两本。
推荐架构书籍:
①《软件架构》Mourad Chabane Oussalah
②《架构实战-软件架构设计的过程》Peter EeLes
③《软件系统架构-使用视点和视角与利益相关者合作》Nick Rozanski
④《企业IT架构转型之道》
⑤《大型网站技术架构演进与性能优化》
⑥《银行信息系统架构》
⑦《商业银行分布式架构实践》
第 28 课作业实践
1、(必做)针对课上讲解的内容,自己动手设计一个高并发的秒杀系统,讲架构图,
设计文档等,提交到github。
2、(选做)针对自己工作的系统,或者自己思考的复杂场景,做系统性的架构设计