Skip to content

Commit 3115b26

Browse files
committed
📝zookeeper
1 parent c6f5513 commit 3115b26

File tree

4 files changed

+216
-63
lines changed

4 files changed

+216
-63
lines changed

docs/design-pattern/Decorator-Pattern.md

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,6 @@
1919

2020
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
2121

22-
**意图:**动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
23-
24-
**主要解决:**一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
25-
26-
**何时使用:**在不想增加很多子类的情况下扩展类。
27-
28-
**如何解决:**将具体功能职责划分,同时继承装饰者模式。
29-
3022
------
3123

3224

@@ -45,7 +37,7 @@
4537

4638
- **ConcreteComponent**: 具体的组件对象,实现类 ,即被装饰者,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责
4739

48-
- **Decorator**: 所有装饰器的抽象父类,一般是抽象类,实现接口;它的属性必然有个指向Conponent抽象组件的对象 ,其实就是持有一个被装饰的对象
40+
- **Decorator**: 所有装饰器的抽象父类,一般是抽象类,实现接口;它的属性必然有个指向 Conponent 抽象组件的对象 ,其实就是持有一个被装饰的对象
4941

5042
- **ConcreteDecorator**: 具体的装饰对象,实现具体要被装饰对象添加的功能。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为。
5143

@@ -73,9 +65,11 @@
7365

7466
- 公司发放奖金,不同的员工类型对应不同的奖金计算规则,用各种计算规则去装饰统一的奖金计算类
7567
- 星巴克售卖用咖啡,用摩卡、奶泡去装饰咖啡,实现不同的计费
76-
-
68+
- 变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔
69+
70+
我还是比较喜欢卖煎饼的例子
7771

78-
我还是比较喜欢买煎饼的例子
72+
![](https://i04piccdn.sogoucdn.com/a000fc61baeaeb5b)
7973

8074
1、定义抽象组件
8175

@@ -159,7 +153,7 @@ public class Sausage extends CondimentDecorator{
159153
}
160154
```
161155

162-
5、测试卖煎饼
156+
5、测试煎饼交易,over
163157

164158
```java
165159
public class Client {
@@ -192,7 +186,7 @@ public class Client {
192186
煎饼果子加鸡蛋加火腿花费11.0元
193187
```
194188

195-
看下通过IDEA 生成的 UML 类图
189+
顺便看下通过 IDEA 生成的 UML 类图(和我们画的类图一样哈)
196190

197191
![](https://tva1.sinaimg.cn/large/00831rSTly1gd515ta83tj318c0pmjui.jpg)
198192

@@ -214,7 +208,7 @@ public class Client {
214208

215209
![](https://tva1.sinaimg.cn/large/00831rSTly1gd51yq60yxj322e0rewkg.jpg)
216210

217-
我们平时读取一个文件中的内容其实就使用到了装饰模式的思想,还是用《Head First 设计模式》的例子,我们自定义一个装饰者,把输入流中的所有大写字符转换为小写
211+
我们平时读取一个文件中的内容其实就使用到了装饰模式的思想,简化《Head First 设计模式》的例子,我们自定义一个装饰者,把输入流中的所有大写字符转换为小写
218212

219213
```java
220214
public class LowerCaseInputStream extends FilterInputStream {
@@ -236,7 +230,7 @@ public class InputTest {
236230
public static void main(String[] args) throws IOException {
237231
int c;
238232
//装饰器的组装过程
239-
InputStream in = new LowerCaseInputStream(new BufferedInputStream(new FileInputStream("java.txt")));
233+
InputStream in = new LowerCaseInputStream(new BufferedInputStream(new FileInputStream("JavaKeeper.txt")));
240234

241235
while ((c = in.read()) >= 0){
242236
System.out.print((char) c);
@@ -277,7 +271,7 @@ public class ServletRequestWrapper implements ServletRequest {
277271

278272
Spring 的 `ApplicationContext` 中配置所有的 `DataSource`。 这些 DataSource 可能是各种不同类型的, 比如不同的数据库: Oracle、 SQL Server、 MySQL 等, 也可能是不同的数据源。 然后 SessionFactory 根据客户的每次请求, 将 DataSource 属性设置成不同的数据源, 以到达切换数据源的目的。
279273

280-
在spring的命名体现:Spring 中用到的包装器模式在类名上有两种表现: 一种是`类名中含有 Wrapper`另一种是`类名中含有Decorator`。 基本上都是动态地给一个对象添加一些额外的职责,比如
274+
在 spring 的命名体现:Spring 中用到的包装器模式在类名上有两种表现: 一种是类名中含有 `Wrapper`另一种是类名中含有`Decorator`。 基本上都是动态地给一个对象添加一些额外的职责,比如
281275

282276
- `org.springframework.cache.transaction` 包下的 `TransactionAwareCacheDecorator`
283277
- `org.springframework.session.web.http` 包下的 `SessionRepositoryFilter` 内部类 `SessionRepositoryRequestWrapper`
@@ -286,7 +280,7 @@ Spring 的 `ApplicationContext` 中配置所有的 `DataSource`。 这些 DataSo
286280

287281
### Mybatis 缓存中的装饰者模式
288282

289-
Mybatis的缓存模块中,使用了装饰器模式的变体,其中将 `Decorator` 接口和 `Componet` 接口合并为一个`Component `接口。`org.apache.ibatis.cache` 包下的结构
283+
Mybatis 的缓存模块中,使用了装饰器模式的变体,其中将 `Decorator` 接口和 `Componet` 接口合并为一个`Component `接口。`org.apache.ibatis.cache` 包下的结构
290284

291285
![](https://tva1.sinaimg.cn/large/00831rSTly1gd56rvosupj30kw0r6gpg.jpg)
292286

docs/java/JUC/volatile.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
> volatile 变量和 atomic 变量有什么不同?
66
>
77
> volatile 的使用场景,你能举两个例子吗?
8-
>
8+
9+
> 文章收录在 GitHub [JavaKeeper](https://github.com/Jstarfish/JavaKeeper) ,包含 N 线互联网开发必备技能兵器谱
910
1011
之前算是比较详细的介绍了 [Java 内存模型](https://mp.weixin.qq.com/s?__biz=MzIwOTIxNTg0OQ==&mid=2247483928&idx=1&sn=87401493c2378ae5a291fe9c07f6bd09&chksm=97760a1ea0018308ad9b5608ffa74937abf37e5ec54e7d773fd4c4199daace67a98e390ea4ce&token=954870021&lang=zh_CN#rd)——JMM, **JMM是围绕着并发过程中如何处理可见性、原子性和有序性这 3 个 特征建立起来的**,而 volatile 可以保证其中的两个特性,下面具体探讨下这个面试必问的关键字。
1112

@@ -272,7 +273,7 @@ volatile 可以保证线程可见性且提供了一定的有序性,但是无
272273

273274

274275

275-
## 5. volatile 性能
276+
## 6. volatile 性能
276277

277278
volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
278279

@@ -289,4 +290,8 @@ volatile 操作不会像锁一样造成阻塞,因此,在能够安全使用 v
289290
《深入理解Java虚拟机》
290291
http://tutorials.jenkov.com/java-concurrency/java-memory-model.html
291292
https://juejin.im/post/5dbfa0aa51882538ce1a4ebc
292-
《正确使用 Volatile 变量》https://www.ibm.com/developerworks/cn/java/j-jtp06197.html
293+
《正确使用 Volatile 变量》https://www.ibm.com/developerworks/cn/java/j-jtp06197.html
294+
295+
296+
297+
![图怪兽_b2195efd95f95e83c90c74142a4b2001_47863.png](https://i.loli.net/2020/03/25/PaVfB1psAndLTOv.png)

docs/soa/zookeeper/Hello-Zookeeper.md

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
> zookeeper虽然在项目里有用过,奈何我要当大牛,所以要深入了解下,要把Zookeeper也放到知识库里,看了好多博客,感觉大部分都是基于《从Paxos到ZooKeeper 分布式一致性原理与实践》写的,所以自己读了一遍,加上看的其他文章和项目中的使用,做个整理。加油,奥利给!
22
>
3-
> 文章收录在 GitHub [JavaEgg](https://github.com/Jstarfish/JavaEgg) 中,N线互联网开发必备兵器库,欢迎 star+指导
3+
> 文章收录在 GitHub [JavaEgg](https://github.com/Jstarfish/JavaEgg) 中,N线互联网开发必备技能兵器库,欢迎 star+指导
44
55
![](https://www.w3cschool.cn/attachments/image/20170110/1484044507543563.jpg)
66

77

88

99
## 直击面试
1010

11-
eureka和zookeeper区别
12-
13-
11+
eureka 和 zookeeper 区别
1412

1513

1614

@@ -20,15 +18,15 @@ eureka和zookeeper区别
2018

2119
计算机系统从集中式到分布式的变革伴随着包括**分布式网络****分布式事务****分布式数据一致性**等在内的一系列问题和挑战,同时也催生了一大批诸如**`ACID`****`CAP`****`BASE`**等经典理论的快速发展。
2220

23-
为了解决分布式一致性问题,涌现出了一大批经典的一致性协议和算法,最为著名的就是二阶段提交协议(2PC),三阶段提交协议(3PC)和`Paxos`算法。`Zookeeper`的一致性是通过基于 `Paxos` 算法的 `ZAB` 协议完成的。文末再说这部分内容。
21+
为了解决分布式一致性问题,涌现出了一大批经典的一致性协议和算法,最为著名的就是二阶段提交协议(2PC),三阶段提交协议(3PC)和`Paxos`算法。`Zookeeper`的一致性是通过基于 `Paxos` 算法的 `ZAB` 协议完成的。先上手了解了 zookeeper 文末再说这部分内容。
2422

2523

2624

2725
## 1. 概述
2826

29-
ZooKeeper是Apache软件基金会的一个软件项目,它为大型「**分布式计算**」提供开源的分布式配置服务、同步服务和命名注册。
27+
ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型「**分布式计算**」提供开源的分布式配置服务、同步服务和命名注册。
3028

31-
Zookeeper最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的**分布式协调框架**,以便让开发人员将精力集中在处理业务逻辑上,Zookeeper就这样诞生了。后来捐赠给了 `Apache` ,现已成为 `Apache` 顶级项目。
29+
Zookeeper 最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的**分布式协调框架**,以便让开发人员将精力集中在处理业务逻辑上,Zookeeper就这样诞生了。后来捐赠给了 `Apache` ,现已成为 `Apache` 顶级项目。
3230

3331

3432

@@ -79,7 +77,7 @@ Zookeeper 数据模型的结构与 Unix 文件系统的结构相似,整体上
7977

8078
#### 统一命名服务
8179

82-
在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的机器,提供的服务地址,进程对象等等——这些我们都可以统称他们为名字(Name)。其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表。通过调用 Zookeeper 提供的创建节点的API,能够很容易创建一个全局唯一的 path,这个 path 就可以作为一个名称。
80+
在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的机器,提供的服务地址,进程对象等等——这些我们都可以统称他们为名字(Name)。其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表。通过调用 Zookeeper 提供的创建节点的 API,能够很容易创建一个全局唯一的 path,这个 path 就可以作为一个名称。
8381

8482
#### 统一配管理
8583

@@ -135,7 +133,7 @@ Zookeeper 中特有的 「**Watcher**」 注册与异步通知机制,能够很
135133

136134
## 2. Hello Zookeeper
137135

138-
Zookeeper有两种运行模式:集群模式和单机模式。自己研究又没有机器,就单机练习下,当然也可以用伪集群。
136+
Zookeeper 有两种运行模式:集群模式和单机模式。自己研究又没有机器,就单机练习下,当然也可以用伪集群。
139137

140138
### 2.1 本地模式安装部署
141139

@@ -169,46 +167,56 @@ dataDir=XXX/zookeeper-3.5.6/zkData
169167
mkdir zkData
170168
```
171169

172-
#### 3.操作Zookeeper
170+
#### 3.操作 Zookeeper
173171

174-
1. 启动Zookeeper
172+
1. 启动 Zookeeper: `bin/zkServer.sh start`
175173

176174
```shell
177-
bin/zkServer.sh start
175+
/usr/local/bin/java
176+
ZooKeeper JMX enabled by default
177+
Using config: /home/sync360/test/apache-zookeeper-3.5.7-bin/bin/../conf/zoo.cfg
178+
Starting zookeeper ... STARTED
178179
```
179180

180-
2. 查看进程是否启动
181+
2. 查看进程是否启动: `jps`
181182

182183
```shell
183-
jps
184184
4020 Jps
185185
4001 QuorumPeerMain
186186
```
187187

188-
3. 查看状态:
188+
3. 查看状态:`bin/zkServer.sh status`
189189

190190
```shell
191-
bin/zkServer.sh status
191+
/usr/local/bin/java
192+
ZooKeeper JMX enabled by default
193+
Using config: /home/apache-zookeeper-3.5.7-bin/bin/../conf/zoo.cfg
194+
Client port found: 2181. Client address: localhost.
195+
Mode: standalone
192196
```
193197

194-
4. 启动客户端:
198+
4. 启动客户端:`bin/zkCli.sh`
195199

196200
```shell
197-
bin/zkCli.sh
198-
```
201+
Connecting to localhost:2181
202+
2020-03-25 15:41:19,112 [myid:] - INFO [main:Environment@109] - Client environment:zookeeper.version=3.5.7-f0fdd52973d373ffd9c86b81d99842dc2c7f660e, built on 02/10/2020 11:30 GMT
199203

200-
5. 退出客户端:
204+
...
201205

202-
```shell
203-
quit
204-
```
206+
2020-03-25 15:41:19,183 [myid:] - INFO [main:ClientCnxn@1653] - zookeeper.request.timeout value is 0. feature enabled=
207+
Welcome to ZooKeeper!
205208

206-
6. 停止Zookeeper
209+
...
207210

208-
```shell
209-
bin/zkServer.sh stop
211+
WATCHER::
212+
213+
WatchedEvent state:SyncConnected type:None path:null
210214
```
211215

216+
5. 退出客户端:`quit`
217+
218+
6. 停止 Zookeeper: `bin/zkServer.sh stop`
219+
212220

213221

214222
### 2.2 配置参数解读
@@ -355,6 +363,8 @@ Zookeeper 的视图结构和标准的 Unix 文件系统非常类似,但没有
355363

356364

357365

366+
367+
358368
## 一致性协议
359369

360370
设计一个分布式系统必定会遇到一个问题—— **因为分区容忍性(partition tolerance)的存在,就必定要求我们需要在系统可用性(availability)和数据一致性(consistency)中做出权衡** 。这就是著名的 `CAP` 定理。

0 commit comments

Comments
 (0)