1
- 该项目是手机微博研发团队和手机微博技术保障部共同努力的成果。 <br >
2
- 在此特别感谢: <br >
3
- 张杰 微博:[ @木泽水] ( http://weibo.com/klans ) <br >
4
- 王春生 微博:[ @平凡的香草] ( http://weibo.com/chunshengster ) <br >
5
- 胡波 微博:[ @胡波_ ] ( http://weibo.com/coolbor ) <br >
6
- 韩超 微博:[ @超朝炒觘] ( http://weibo.com/weibochao ) <br >
7
- 赵星宇 微博:[ @淘淘不逃008 ] ( http://weibo.com/5251978872 ) <br >
8
- 聂钰 微博:[ @古夜] ( http://weibo.com/206541012 ) <br >
9
- 冯磊 微博:[ @冯磊424] ( http://weibo.com/myfenglei ) <br >
1
+ 该项目是手机微博研发团队和手机微博技术保障部共同努力的成果。
2
+
3
+ 在此特别感谢:
4
+
5
+ - 张杰 微博:[ @木泽水] ( http://weibo.com/klans )
6
+ - 王春生 微博:[ @平凡的香草] ( http://weibo.com/chunshengster )
7
+ - 胡波 微博:[ @胡波_ ] ( http://weibo.com/coolbor )
8
+ - 韩超 微博:[ @超朝炒觘] ( http://weibo.com/weibochao )
9
+ - 赵星宇 微博:[ @淘淘不逃008 ] ( http://weibo.com/5251978872 )
10
+ - 聂钰 微博:[ @古夜] ( http://weibo.com/206541012 )
11
+ - 冯磊 微博:[ @冯磊424] ( http://weibo.com/myfenglei )
10
12
11
13
等同学的支持。
14
+
12
15
感谢大家提出的宝贵意见,感谢大家为该项目付出的努力!
13
16
14
- 项目中有任何问题欢迎大家来吐槽,一起完善、一起提高、一起使用!< br >
15
- email:xingyu10@staff.weibo.com fenglei1@staff.sina.com.cn < br >
17
+ 项目中有任何问题欢迎大家来吐槽,一起完善、一起提高、一起使用!
18
+ email: xingyu10@staff.weibo.com fenglei1@staff.sina.com.cn
16
19
17
- <br >
20
+ 接入说明
21
+ -----------------------------------
18
22
23
+ 由于该工程需要用户自定义部分配置文件,所以建议以源码方式使用。(同时也支持项目中设定` Lib ` 库的参数)
19
24
25
+ ` Lib ` 库目前还没有打包成` jar ` 文件, 大家测试使用的话可以直接将工程包含到自己的工程内即可。
20
26
21
- 接入说明:
22
- -----------------------------------
23
- 由于该工程需要用户自定义部分配置文件,所以建议以源码方式使用。(同时也支持项目中设定lib库的参数)
24
- lib库目前还没有打包成 jar 文件, 大家测试使用的话可以直接将工程包含到自己的工程内即可。
25
- apk文件夹下内有打包好的对httpDNS库进行测试的程序。 该测试程序模拟了用户使用的场景,并且记录了相关统计数据。以及Lib库的时时的状态信息。
27
+ ` apk ` 文件夹下内有打包好的对` httpDNS ` 库进行测试的程序。
28
+ 该测试程序模拟了用户使用的场景,并且记录了相关统计数据,以及` Lib ` 库的时时的状态信息。
26
29
30
+ ### 在` AndroidManifest.xml ` 文件中需要配置
27
31
28
-
29
- ### 在AndroidManifest.xml文件中需要配置
30
-
31
- <!-- 主要注册一个广播 监听网络发生变化,本地更新dns解析记录-->
32
- <receiver
33
- android:name="com.sina.util.networktype.NetworkStateReceiver"
34
- android:label="NetworkConnection" >
35
- <intent-filter>
36
- <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
37
- <action android:name="android.intent.action.USER_PRESENT" />
38
- </intent-filter>
39
- </receiver>
40
-
41
- <!-- 需要配置的权限 -->
42
- <uses-permission android:name="android.permission.INTERNET" />
43
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
44
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
45
- <uses-permission android:name="android.permission.WAKE_LOCK" />
46
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
47
-
48
- ### 在使用 http dns前 需要初始化一次
32
+ ``` xml
33
+ <!-- 主要注册一个广播 监听网络发生变化,本地更新dns解析记录-->
34
+ <receiver
35
+ android : name =" com.sina.util.networktype.NetworkStateReceiver"
36
+ android : label =" NetworkConnection" >
37
+ <intent-filter >
38
+ <action android : name =" android.net.conn.CONNECTIVITY_CHANGE" />
39
+ <action android : name =" android.intent.action.USER_PRESENT" />
40
+ </intent-filter >
41
+ </receiver >
42
+
43
+ <!-- 需要配置的权限 -->
44
+ <uses-permission android : name =" android.permission.INTERNET" />
45
+ <uses-permission android : name =" android.permission.ACCESS_NETWORK_STATE" />
46
+ <uses-permission android : name =" android.permission.ACCESS_WIFI_STATE" />
47
+ <uses-permission android : name =" android.permission.WAKE_LOCK" />
48
+ <uses-permission android : name =" android.permission.WRITE_EXTERNAL_STORAGE" />
49
+ ```
50
+
51
+ ### 使用` http dns ` 前初始化
52
+
53
+ ``` java
49
54
DNSCache . Init(this );
55
+ ```
50
56
57
+ ### 直接调用该方法获取` A ` 记录对象
51
58
52
- ### 直接调用该方法获取 A记录对象
53
- DomainInfo[ ] infoList = DNSCache.getInstance().getDomainServerIp( "http://api.weibo.cn/index.html " ) ;
59
+ ``` java
60
+ DomainInfo [] infoList = DNSCache . getInstance(). getDomainServerIp( " http://api.weibo.cn/index.html" ) ;
54
61
55
62
// DomainInfo 返回有可能为null,如果为空则使用域名直接请求数据吧~ 因为在http server 故障的时候会出现这个问题。
56
63
57
- if( infoList != null ) {
64
+ if ( infoList != null ) {
58
65
// A记录可能会返回多个, 没有特殊需求直接使用第一个即可。 这个数组是经过排序的。
59
- DomainInfo domainModel = infoList[0] ;
66
+ DomainInfo domainModel = infoList[0 ] ;
60
67
61
68
// 这里是 android 请求网络。 只需要在http头里添加一个数据即可。 省下的请求数据和原先一样。
62
69
HttpGet getMethod = new HttpGet ( domainModel. url );
@@ -66,87 +73,88 @@ DomainInfo[] infoList = DNSCache.getInstance().getDomainServerIp( "http://api.we
66
73
HttpResponse response = httpClient. execute(getMethod);
67
74
String res = EntityUtils . toString(response. getEntity(), " utf-8" ) ;
68
75
Log . d(" DINFO" , res) ;
69
-
70
- //在请求倒数据后,请配合将一部分信息传递给我。 lib库里面会对这个服务器进行评分计算,lib库永远会优先给你最快,最稳定的服务器地址。
76
+
77
+ // 在请求倒数据后,请配合将一部分信息传递给我。 lib库里面会对这个服务器进行评分计算,lib库永远会优先给你最快,最稳定的服务器地址。
71
78
domainModel. code = String . valueOf( response. getStatusLine(). getStatusCode() );
72
79
domainModel. data = res ;
73
80
domainModel. startTime = String . valueOf(startDomainRequests) ;
74
81
DNSCache . getInstance(). setDomainServerIpInfo( domainModel );
75
- }
76
-
77
-
78
-
79
-
82
+ }
83
+ ```
80
84
81
85
### 更多配置
82
- 你可以创建一个 com.sina.util.dnscache.DNSCacheConfig.Data 对象分别设置下面属性。 <br >
83
- 然后调用 DNSCacheConfig.saveLocalConfigAndSync 方法传入 设定好的 配置选项。
84
-
85
-
86
- /**
87
- * 是否启用自己家的HTTP_DNS服务器 默认不启用 | 1启用 0不启用
88
- */
89
- public String IS_MY_HTTP_SERVER = null;
90
- /**
91
- * 自己家HTTP_DNS服务API地址 使用时直接在字符串后面拼接domain地址 |
92
- * 示例(http://xxx.xxx.xxx.xxx/dns?domain=)+ domain
93
- */
94
- public String HTTPDNS_SERVER_API = null;
95
- /**
96
- * 是否启用dnspod服务器 默认不启用 | 1启用 0不启用
97
- */
98
- public String IS_DNSPOD_SERVER = null;
99
- /**
100
- * DNSPOD HTTP_DNS 服务器API地址 | 默认(http://119.29.29.29/d?ttl=1&dn=)
101
- */
102
- public String DNSPOD_SERVER_API = null;
103
- /**
104
- * DNSPOD 企业级ID配置选项
105
- */
106
- public String DNSPOD_ID = null;
107
- /**
108
- * DNSPOD 企业级KEY配置选项
109
- */
110
- public String DNSPOD_KEY = null;
111
- /**
112
- * 是否开启 本地排序插件算法 默认开启 | 1开启 0不开启
113
- */
114
- public String IS_SORT = null;
115
- /**
116
- * 速度插件 比重分配值:默认40%
117
- */
118
- public String SPEEDTEST_PLUGIN_NUM = null;
119
- /**
120
- * 服务器推荐优先级插件 比重分配:默认30% (需要自家HTTP_DNS服务器支持)
121
- */
122
- public String PRIORITY_PLUGIN_NUM = null;
123
- /**
124
- * 历史成功次数计算插件 比重分配:默认10%
125
- */
126
- public String SUCCESSNUM_PLUGIN_NUM = null;
127
- /**
128
- * 历史错误次数计算插件 比重分配:默认10%
129
- */
130
- public String ERRNUM_PLUGIN_NUM = null;
131
- /**
132
- * 最后一次成功时间计算插件 比重分配:默认10%
133
- */
134
- public String SUCCESSTIME_PLUGIN_NUM = null;
135
- /**
136
- * domain对应的测速文件,如果需要对服务器进行测速请给domain设置一个可以下载的资源文件来计算服务器速度
137
- */
138
- public ArrayList<String> SPEEDPATH_LIST = new ArrayList<String>();
139
86
87
+ 你可以创建一个` com.sina.util.dnscache.DNSCacheConfig.Data ` 对象分别设置下面属性。
88
+
89
+ 然后调用` DNSCacheConfig.saveLocalConfigAndSync ` 方法传入设定好的配置选项。
90
+
91
+ ``` java
92
+ /**
93
+ * 是否启用自己家的HTTP_DNS服务器 默认不启用 | 1启用 0不启用
94
+ */
95
+ public String IS_MY_HTTP_SERVER = null ;
96
+ /**
97
+ * 自己家HTTP_DNS服务API地址 使用时直接在字符串后面拼接domain地址 |
98
+ * 示例(http://xxx.xxx.xxx.xxx/dns?domain=)+ domain
99
+ */
100
+ public String HTTPDNS_SERVER_API = null ;
101
+ /**
102
+ * 是否启用dnspod服务器 默认不启用 | 1启用 0不启用
103
+ */
104
+ public String IS_DNSPOD_SERVER = null ;
105
+ /**
106
+ * DNSPOD HTTP_DNS 服务器API地址 | 默认(http://119.29.29.29/d?ttl=1&dn=)
107
+ */
108
+ public String DNSPOD_SERVER_API = null ;
109
+ /**
110
+ * DNSPOD 企业级ID配置选项
111
+ */
112
+ public String DNSPOD_ID = null ;
113
+ /**
114
+ * DNSPOD 企业级KEY配置选项
115
+ */
116
+ public String DNSPOD_KEY = null ;
117
+ /**
118
+ * 是否开启 本地排序插件算法 默认开启 | 1开启 0不开启
119
+ */
120
+ public String IS_SORT = null ;
121
+ /**
122
+ * 速度插件 比重分配值:默认40%
123
+ */
124
+ public String SPEEDTEST_PLUGIN_NUM = null ;
125
+ /**
126
+ * 服务器推荐优先级插件 比重分配:默认30% (需要自家HTTP_DNS服务器支持)
127
+ */
128
+ public String PRIORITY_PLUGIN_NUM = null ;
129
+ /**
130
+ * 历史成功次数计算插件 比重分配:默认10%
131
+ */
132
+ public String SUCCESSNUM_PLUGIN_NUM = null ;
133
+ /**
134
+ * 历史错误次数计算插件 比重分配:默认10%
135
+ */
136
+ public String ERRNUM_PLUGIN_NUM = null ;
137
+ /**
138
+ * 最后一次成功时间计算插件 比重分配:默认10%
139
+ */
140
+ public String SUCCESSTIME_PLUGIN_NUM = null ;
141
+ /**
142
+ * domain对应的测速文件,如果需要对服务器进行测速请给domain设置一个可以下载的资源文件来计算服务器速度
143
+ */
144
+ public ArrayList<String > SPEEDPATH_LIST = new ArrayList<String > ();
145
+ ```
140
146
141
147
### 动态更新参数
142
- DNSCacheConfig 类下的 ConfigText_API 字段可以配置成自动更新配置参数的接口。 该接口返回json数据类型 具体数据格式详见DNSCacheConfig.Data toJson()方法。
143
148
149
+ ` DNSCacheConfig ` 类下的` ConfigText_API ` 字段可以配置成自动更新配置参数的接口。该接口返回` json ` 数据类型 具体数据格式详见` DNSCacheConfig.Data toJson() ` 方法。
144
150
145
151
### 自己家HttpDNS服务接入
146
- 首先开启 DNSCacheConfig.Data.IS_MY_HTTP_SERVER = 1 ; 然后设定 DNSCacheConfig.Data.HTTPDNS_SERVER_API 接口地址
147
- 示例(http://XXX.XXX.XXX.XXX/dns?domain=)+ domain
148
152
149
- 该接口返回格式(当然你也可以自定义格式需要重载 com.sina.util.dnscache.httpdns.IJsonParser 类即可):
153
+ 1 . 开启` DNSCacheConfig.Data.IS_MY_HTTP_SERVER = 1; `
154
+ 2 . 设定 ` DNSCacheConfig.Data.HTTPDNS_SERVER_API ` 接口地址(示例` http://XXX.XXX.XXX.XXX/dns?domain= ` )+ ` domain ` ,该接口返回格式。
155
+ (重载` com.sina.util.dnscache.httpdns.IJsonParser ` 类可以自定义格式)
156
+
157
+ ``` javascript
150
158
{
151
159
" domain" : " api.weibo.cn" ,
152
160
" device_ip" : " 10.209.70.192" ,
@@ -169,36 +177,38 @@ DNSCacheConfig 类下的 ConfigText_API 字段可以配置成自动更新配置
169
177
}
170
178
]
171
179
}
172
- PS: priority 字段是服务器推荐优先级。 | device_sp 字段是该设备出口运营商。
173
-
180
+ ```
174
181
182
+ PS: ` priority ` 字段是服务器推荐优先级。` device_sp ` 字段是该设备出口运营商。
175
183
176
184
HttpDns是什么?
177
185
-----------------------------------
178
186
179
- 如果你对 httpdns 还不了解他是什么!<br >
180
- 你可以阅读:[ 【鹅厂网事】全局精确流量调度新思路-HttpDNS服务详解] ( http://mp.weixin.qq.com/s?__biz=MzA3ODgyNzcwMw==&mid=201837080&idx=1&sn=b2a152b84df1c7dbd294ea66037cf262&scene=2&from=timeline&isappinstalled=0&utm_source=tuicool ) <br />
181
- <br >
182
- <br >
187
+ 如果你对 httpdns 还不了解他是什么!
188
+
189
+ 你可以阅读:[ 【鹅厂网事】全局精确流量调度新思路-HttpDNS服务详解] ( http://mp.weixin.qq.com/s?__biz=MzA3ODgyNzcwMw==&mid=201837080&idx=1&sn=b2a152b84df1c7dbd294ea66037cf262&scene=2&from=timeline&isappinstalled=0&utm_source=tuicool )
183
190
184
- 传统DNS解析 和 HTTPDNS解析 本质的区别:
191
+ 传统DNS解析 和 HTTPDNS解析 本质的区别
185
192
-----------------------------------
186
193
### 传统DNS解析
187
- 客户端发送udp数据包到dns服务器,dns服务器返回该域名的相关A记录信息。
194
+
195
+ 客户端发送udp数据包到dns服务器,dns服务器返回该域名的相关A记录信息。
196
+
188
197
### HTTPDNS解析
189
- 客户端发起http请求携带需要查询的域名,通过IP直接访问服务器,该Http服务器接倒请求后返回域名对应的A记录。
190
- <br >
191
- <br >
198
+
199
+ 客户端发起http请求携带需要查询的域名,通过IP直接访问服务器,该Http服务器接倒请求后返回域名对应的A记录。
192
200
193
201
HttpDns sdk (android版本)
194
202
-----------------------------------
203
+
195
204
### 希望解决的问题:
196
- 1.LocalDNS劫持
197
- 2.平均访问延迟下降
198
- 3.用户连接失败率下降
199
205
206
+ 1. LocalDNS劫持
207
+ 2. 平均访问延迟下降
208
+ 3. 用户连接失败率下降
200
209
201
210
### 目录结构说明:
211
+
202
212
HttpDns/src/DNSCache --- HttpDns lib库主工程。
203
213
HttpDns/src/DNSCacheTest --- HttpDns库测试工程。
204
214
HttpDns/doc --- 项目相关的一些文档、流程图、结构图等。
0 commit comments