Skip to content

Commit

Permalink
add
Browse files Browse the repository at this point in the history
  • Loading branch information
aalansehaiyang committed Oct 22, 2017
1 parent 664eaf9 commit f111b0f
Show file tree
Hide file tree
Showing 27 changed files with 395 additions and 77 deletions.
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
* [tomcat](web/tomcat.md)
* [http协议](web/http协议.md)
* [CDN](system-architecture/CDN.md)
* [其它](web/other.md)


### 常用三方工具包
Expand Down Expand Up @@ -72,13 +73,15 @@

* 缓存
* [redis](open-source-framework/redis.md)
* [codis]()
* [memcache](http://blog.csdn.net/itomge/article/details/8035197)

* 搜索
* [Elasticsearch](middle-software/elasticsearch.md)

* 分布式数据框架
* [cobar](middle-software/cobar.md)
* [Mycat](https://github.com/MyCATApache/Mycat-Server)
* [tsharding](middle-software/tsharding.md)
* [tddl](https://github.com/alibaba/tb_tddl)
* [sharding-jdbc](https://www.slahser.com/2016/06/25/%E5%BD%93%E5%BD%93%E7%9A%84sharding-jdbc%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB/)
Expand All @@ -99,16 +102,17 @@
* [super-diamond](other/super-diamond源码分析.md)
* [disconf](https://www.oschina.net/p/disconf)
* [apollo](middle-software/apollo.md)


* 分布式文件系统
* [FastDFS](middle-software/FastDFS.md)

* 其它
* [FastDFS(分布式文件系统)](https://www.oschina.net/p/fastdfs)
* [mysql数据库binlog的增量订阅&消费组件](https://github.com/alibaba/canal)
* [分布式数据库同步系统](https://github.com/alibaba/otter)
* [数据库binlog的增量订阅&消费组件](https://github.com/alibaba/canal)
* [数据库同步系统](https://github.com/alibaba/otter)

### 系统架构

* [架构经验](system-architecture/架构经验.md)
* [架构经验](system-architecture/architecture-experience.md)
* [锁相关](system-architecture/lock.md)
* [经典案例](system-architecture/经典案例.md)
* [通用技术方案选型](system-architecture/technology-selection.md)
Expand All @@ -123,6 +127,7 @@
* [代码规范](project-management/代码规范.md)
* [git常用命令](project-management/git常用命令.md)
* [ab性能压测](other/ab测试.md)
* [maven仓库](http://www.mvnrepository.com/open-source/http-clients)

### 运维

Expand Down
80 changes: 80 additions & 0 deletions basic-knowledge/java-random.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
```
import java.nio.charset.Charset;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantLock;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
/**
* 用于生成随机token
*
* @author onlyone
*/
public class RandomService {
private ReentrantLock lock = new ReentrantLock();
private AtomicLong resetCounter = new AtomicLong(0);
private HashFunction sha1 = Hashing.sha1();
private int resetThreshold = 10000;
private Charset encoding = Charset.forName("UTF-8");
private SecureRandom random;
public RandomService(){
this.resetSecureRandom();
}
private void resetSecureRandom() {
this.lock.lock();
try {
this.random = SecureRandom.getInstance("NativePRNGNonBlocking");
// this.random = SecureRandom.getInstanceStrong(); // for windows
this.random.generateSeed(32);
} catch (NoSuchAlgorithmException e) {
} finally {
this.lock.unlock();
}
}
public String getToken() {
if (this.resetCounter.incrementAndGet() > this.resetThreshold) {
this.resetSecureRandom();
this.resetCounter.set(0);
}
byte[] bytes = new byte[32];
this.random.nextBytes(bytes);
byte[] seedBytes = UUID.randomUUID().toString().getBytes(this.encoding);
byte[] seeds = new byte[seedBytes.length + bytes.length];
System.arraycopy(bytes, 0, seeds, 0, bytes.length);
System.arraycopy(seedBytes, 0, seeds, bytes.length - 1, seedBytes.length);
return this.sha1.hashBytes(bytes).toString();
}
public static void main(String[] args) {
RandomService randomService = new RandomService();
List<String> list = new ArrayList<String>(200000);
List<String> repetition = new ArrayList<String>();
for (int i = 0; i < 200000; i++) {
String t = randomService.getToken();
if (list.contains(t)) {
repetition.add(t);
} else {
list.add(t);
}
System.out.println(t);
System.out.println("i=" + i + ", 重复列表" + repetition + ",list size=" + list.size());
}
}
}
```
8 changes: 7 additions & 1 deletion basic-knowledge/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### 一、基础


* 基本语法

基本数据类型;运算符;表达式;选择与循环语句;类与对象(普通类、抽象类、接口、枚举、Annotation、内部类);继承与实现;异常;package与jar包;序列化与反序列化;正则表达式;重载与覆盖;
Expand Down Expand Up @@ -68,8 +69,8 @@

### 三、JVM虚拟机

* [内存模型](jvm内存结构.md)
* [类加载器](类加载器.md)
* [内存结构](jvm内存结构.md)
* [垃圾回收](java-gc.md)
* [jvm参数](jvm性能调优.md)
* [jvm自带命令](https://mp.weixin.qq.com/s/QNr8somjodyvU9dRAQG2oA)
Expand All @@ -80,3 +81,8 @@
* [JavaEE 7 正式发布](http://www.iteye.com/news/27980)
* [Java 的版本历史与特性](https://mp.weixin.qq.com/s/wcF14v11QaS21UFczqGbVg)
* [Java 9 中的新特性](https://mp.weixin.qq.com/s/YalBtZ_dZayMec8aprk6Xw)

### 五、其它
* [随机数生成 --- NativePRNGNonBlocking ](http://hongjiang.info/java8-nativeprng-blocking/)
* [随机token 生成代码](java-random.md)
* [HashMap扩容、散列碰撞](https://yq.aliyun.com/articles/225660?spm=5176.100238.spm-cont-list.1.LYRwKV)
2 changes: 1 addition & 1 deletion basic-knowledge/springboot.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* [源码](https://github.com/spring-projects/spring-boot)
* [SpringBoot 组件接入示例](https://github.com/aalansehaiyang/SpringBoot-Learning)
* [java autoConfig配置](springboot-javaConfig.md)
* [开发过程中代码热部署](springboot-hot-reload.md)
* [代码热部署](springboot-hot-reload.md)
* [eclipse中如何跑spring boot的单元测试](springboot-unit.md)

#### 学习资料
Expand Down
4 changes: 4 additions & 0 deletions data-base/id生成器.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,7 @@ public IDRange getNextRange(String app, String key, int size) {
return range;
}
```

#### 其它资料

* [分布式ID生成器](https://mp.weixin.qq.com/s/qO84jWhQ5O2mPafsHrh2bA)
11 changes: 8 additions & 3 deletions data-base/数据库连接池.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

---

**SQL生命周期:**
#### SQL生命周期:

1. 应用服务器与数据库服务器建立一个连接
2. 数据库进程拿到请求sql
Expand All @@ -20,10 +20,16 @@


**推荐开源框架:**
#### 推荐开源框架:

Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。

附加功能:

* 监控,比如打印每一条sql详情,统计慢sql
* 统计,sql调用次数、时间等
* 安全,比如防御SQL注入攻击,数据库密码加密等
* 支持spring boot

```
<dependency>
Expand Down Expand Up @@ -63,7 +69,6 @@ Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接
http://tool.oschina.net/apidocs/apidoc?api=druid0.26



**参考资料:**

http://www.iteye.com/magazines/90
Expand Down
11 changes: 11 additions & 0 deletions middle-software/FastDFS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## FastDFS(分布式文件存储系统)
----


* [server 源代码](https://github.com/happyfish100/fastdfs)

* [client 源代码](https://github.com/happyfish100/fastdfs-client-java)

* [开源文档](https://www.oschina.net/p/fastdfs)

* [FastDFS分布式文件系统集群安装与配置](http://blog.csdn.net/xyang81/article/details/52928230)
1 change: 1 addition & 0 deletions middle-software/big-data.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
* [Storm](Storm.md)
* [Oceanbase](https://github.com/alibaba/oceanbase/tree/master/oceanbase_0.4)
* [Oozie]()
* [kettle]()
2 changes: 2 additions & 0 deletions middle-software/dubbo.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

* [源码阅读笔记](dubbo-sourcecode.md)

* [fork分支](https://github.com/aalansehaiyang/dubbo)

* [dubbo用户手册](https://dubbo.gitbooks.io/dubbo-user-book/)

* [dubbo管理员手册](https://dubbo.gitbooks.io/dubbo-admin-book/install/zookeeper.html)
Expand Down
53 changes: 53 additions & 0 deletions middle-software/zookeeper-scene.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
## zookeeper适用场景

---

* dubbo

做为其注册中心,网上资料比较多,就不多描述,可自行baidu。

* canal

主要用于其主备切换。

出于容灾考虑,往往会配置两个Canal Server负责一个mysql数据库实例的数据增量复制。为了减少Canal Server 的dump请求对mysql master带来的性能影响,要求不同的Canal Server上的instance在同一时刻只能有一个处于Running状态,其他的instance处于Standby状态。具体步骤:

a)尝试启动。所有Canal Server上的instance都会向zk尝试创建一个临时节点,哪个Canal Server创建成功了,那么就让哪个Server启动

b)启动instance。将自己的信息写入该节点。其它的Canal Server对该节点注册Watch监听。

c)主备切换。如果服务节点与zk的会话失效,临时节点会被删除,从而所有的实例会重新竞争上岗,从而实现主备切换。但有一个问题,服务节点可能存在假死情况,网络出现闪断,导致zk认为其会话失效,从而释放Running节点,但此时Cannal Server对应的JVM并没未退出。解决策略:

状态为Standby的Cannal Sever在收到Running节点释放通知后,会延迟一段时间(通常5秒)抢占Running节点,而原本处于Running状态的instance可以不需要等待延迟,直接重新取得Running节点。

更多资料可参考《从Paxos到ZooKeeper》P219

* otter

* hbase

* Hadoop

* Kafka

* 分布式锁

* 分布式协调/通知

* 集群管理

* master选举

分布式高并发情况下创建节点一定是全局唯一性,zk会保证客户端无法重复创建一个已经存在的数据节点。

客户端集群每天定时往zk上创建一个临时节点,例如 /master-selection/2017-10-20/binding,抢节点时,只有一个客户端创建成功,那么创建节点的客户端就成了master。其他客户端在/master-selection/2017-10-20上注册一个Watcher事件,用于监控Master机器是否存活,一旦发现当前Master挂了,其余的客户端会重新进行Master选举。










25 changes: 12 additions & 13 deletions middle-software/zookeeper-setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,48 +12,47 @@ http://zookeeper.apache.org/releases.html#download

##### 2.解压并配置环境变量

下载后把安装包方放在目录/home/spark/work目录下,用下面命令解压缩ZooKeeper安装包,并把解压后的目录移动到/app/soft目录下:
下载后把安装包方放在目录/Users/onlyone/software/zookeeper目录下,并解压

```
$cd /home/spark/work/
$tar -zxf zookeeper-3.4.8.tar.gz
$mv zookeeper-3.4.8 /app/soft
$ll /app/soft
$cd /Users/onlyone/software/zookeeper
$tar -zxvf zookeeper-3.4.8.tar.gz
```
为了方便运行zkServer.sh脚本,在集群中的节点中,需要将ZooKeeper的bin路径加入到/etc/profile中,设置如下内容(分发到各节点后,在各节点上做同样设置):
将ZooKeeper的bin路径加入到/Users/onlyone/.bash_profile中,设置如下内容(分发到各节点后,在各节点上做同样设置):

```
export ZOOKEEPER_HOME=/app/soft/zookeeper-3.4.8
export ZOOKEEPER_HOME=/Users/onlyone/software/zookeeper/zookeeper-3.4.8
export PATH=$PATH:$ZOOKEEPER_HOME/bin
```

设置完毕后使用如下命令使配置生效:

```
$source /etc/profile
$source .bash_profile
```

##### 3.修改ZooKeeper的配置文件

在ZooKeeper的根目录下建立data和log目录用于存放工作数据和日志文件:

```
$mkdir /app/soft/zookeeper-3.4.8/data/
$mkdir /app/soft/zookeeper-3.4.8/log/
$mkdir /Users/onlyone/software/zookeeper/zookeeper-3.4.8/data/
$mkdir /Users/onlyone/software/zookeeper/zookeeper-3.4.8/log/
```
在ZooKeeper配置目录下默认情况下,不存在在zoo.cfg文件,需要复制一份,然后进行修改,命令如下:

```
$cd /app/soft/zookeeper-3.4.8/conf/
$cd /Users/onlyone/software/zookeeper/zookeeper-3.4.8/conf/
$cp zoo_sample.cfg zoo.cfg
$sudo vi zoo.cfg
```
修改zoo.cfg配置文件内容(仅列出重要配置):

```
//用于存放ZooKeeper的数据和日志
dataDir=/app/soft/zookeeper-3.4.8/data
dataLogDir=/app/soft/zookeeper-3.4.8/log
dataDir=/Users/onlyone/software/zookeeper/zookeeper-3.4.8/data
dataLogDir=/Users/onlyone/software/zookeeper/zookeeper-3.4.8/log
//外部客户端连接端口号,在Kafka中将使用该端口号
clientPort=2181
Expand Down
8 changes: 6 additions & 2 deletions middle-software/zookeeper.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

### 附录

* [zk安装](zookeeper-setup.md)
* [安装](zookeeper-setup.md)
* [适用场景](zookeeper-scene.md)
* [Leader选举]()
* [数据同步]()

---

Expand All @@ -15,8 +18,9 @@ zk为分布式应用提供了高效且可靠的分布式协调服务。用于解
* 顺序一致性
* 原子性
* 单一视图(不管连接到zk集群的哪台机器,客户端看到的视图都是一致的)
* 可靠性
* 可靠性。数据不会丢失
* 实时性
* 强一致性。分布式高并发情况下创建节点一定是全局唯一性,zk会保证客户端无法重复创建一个已经存在的数据节点。


zk采用树型结构的名字空间,类似于一个文件系统的目录结构,全量数据存储在内存中。当节点发生变化时(创建、删除、数据变更),可以通知各个客户端。
Expand Down
2 changes: 1 addition & 1 deletion open-source-framework/HttpClient.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

* [apache官网](http://hc.apache.org/httpcomponents-client-4.5.x/index.html)
* [httpcomponents-client-4.5.x的接口文档](http://hc.apache.org/httpcomponents-client-4.5.x/httpclient/apidocs/index.html)
* [一些代码案例](https://github.com/aalansehaiyang/httpclient-example)
* [一些github代码案例](https://github.com/aalansehaiyang/httpclient-example)

---
**简介:**
Expand Down
2 changes: 1 addition & 1 deletion open-source-framework/redis-master-slave.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## 搭建Redis的主从复制
## Redis安装及主从复制

---

Expand Down
Loading

0 comments on commit f111b0f

Please sign in to comment.