一、模式优缺点
·优点:防火墙配置域名或 IP 白名单较少。
·缺点:无多地部署,无法自动调度,公有云 IP 故障或运营商封禁,无法及时自动切换。
二、Native SDK
AndroidiOSC 接口ArkTS 接口(鸿蒙)JSONObject connAddr1 = new JSONObject();connAddr1.put("ip", "litel4c.my-imcloud.com");connAddr1.put("port", 80);JSONObject connAddr2 = new JSONObject();connAddr2.put("ip", "litel4c.my-imcloud.com");connAddr2.put("port", 443); JSONArray longConnArray = new JSONArray();longConnArray.put(connAddr1);longConnArray.put(connAddr2);JSONArray shortConnArray = new JSONArray();shortConnArray.put(connAddr1);shortConnArray.put(connAddr2); JSONObject param = new JSONObject();param.put("longconnectionAddressList", longConnArray);param.put("shortconnectionAddressList", shortConnArray); V2TIMManager.getInstance().callExperimentalAPI("setCustomServerInfo", param.toString(), new V2TIMValueCallback<Object>() { @Override public void onError(int code, String desc) { Log.i(TAG, "code:" + code + " desc:" + desc); } @Override public void onSuccess(Object object) { Log.i(TAG, "success"); }}); V2TIMManager.getInstance().initSDK(this, GenerateTestUserSig.SDKAPPID, new V2TIMSDKConfig(), v2TIMSDKListener);NSArray *connAddrList = @[ @{@"ip": @"litel4c.my-imcloud.com", @"port": @(80) }, @{@"ip": @"litel4c.my-imcloud.com", @"port": @(443) } ];NSMutableDictionary *dictParam = [NSMutableDictionary new];[dictParam setValue:connAddrList forKey:@"longconnectionAddressList"];[dictParam setValue:connAddrList forKey:@"shortconnectionAddressList"];NSData *dataParam = [NSJSONSerialization dataWithJSONObject:dictParam options:NSJSONWritingPrettyPrinted error:nil];NSString *strParam = [[NSString alloc]initWithData:dataParam encoding:NSUTF8StringEncoding];[[V2TIMManager sharedInstance] callExperimentalAPI:@"setCustomServerInfo" param:strParam succ:^(NSObject *result) { NSLog(@"success");} fail:^(int code, NSString *desc) { NSLog(@"errorCode:%d errorMessage:%@", code, desc);}];[[V2TIMManager sharedInstance] initSDK:SDKAPPID config:config listener:self];json::Object connAddr1;connAddr1[kTIMServerAddressIp] = "litel4c.my-imcloud.com";connAddr1[kTIMServerAddressPort] = 80;json::Object connAddr2;connAddr2[kTIMServerAddressIp] = "litel4c.my-imcloud.com";connAddr2[kTIMServerAddressPort] = 443;json::Array longConnArray;longConnArray.push_back(connAddr1);longConnArray.push_back(connAddr2);json::Array shortConnArray;shortConnArray.push_back(connAddr1);shortConnArray.push_back(connAddr2);json::Object json_privatization_info;json_privatization_info[kTIMCustomServerInfoLongConnectionAddressArray] = longConnArray;json_privatization_info[kTIMCustomServerInfoShortConnectionAddressArray] = shortConnArray;json::Object json_param;json_param[kTIMRequestInternalOperation] = kTIMInternalOperationSetCustomServerInfo;json_param[kTIMRequestSetCustomServerInfoParam] = json_privatization_info;std::string json_parameters = json::Serialize(json_param);int ret = callExperimentalAPI(json_parameters.c_str(), [](int32_t code, const char* desc, const char* json_params, const void* user_data) { }, nullptr);function setCustomServerInfo() { let param: ESObject = { longconnectionAddressList: [ { ip: "litel4c.my-imcloud.com", port: 80, }, { ip: "litel4c.my-imcloud.com", port: 443, }, ] as ESObject, shortconnectionAddressList: [ { ip: "litel4c.my-imcloud.com", port: 80, }, { ip: "litel4c.my-imcloud.com", port: 443, }, ] as ESObject, }; V2TIMManager.getInstance().callExperimentalAPI("setCustomServerInfo", JSON.stringify(param));}
三、Web SDK
SDK 需要升级到 v3,创建实例时,指定极简模式访问特定域名 litew4c.my-imcloud.com 和 lite-cn.rich.my-imcloud.com。
let options = { SDKAppID: 0, // 接入时需要将0替换为你的即时通信应用的 SDKAppID proxyServer: `wss://litew4c.my-imcloud.com:443`,// WebSocket 服务器代理地址 fileUploadProxy: `https://lite-cn.rich.my-imcloud.com:443`, // 图片、视频、文件上传代理地址 fileDownloadProxy: `https://lite-cn.rich.my-imcloud.com:443` // 图片、视频、文件下载代理地址};let chat = TencentCloudChat.create(options);
四、REST API
使用极简模式的特定域名 console-lite.tim.qq.com。
五、域名 IP 白名单
1、NativeSDK,端口tcp 80,443litel4c.my-imcloud.com162.14.18.0/24162.14.17.0/242、WebSDK和RestAPI,端口tcp 443litew4c.my-imcloud.comyun.tim.qq.comlite-cn.rich.my-imcloud.comconsole-lite.tim.qq.com162.14.18.0/24162.14.17.0/243、富媒体,端口tcp 443 //NativeSDK不支持设置富媒体指定域名访问,需放行IM富媒体所用到的所有域名https请求。yun.tim.qq.com{SdkAppID}-cn.rich.my-imcloud.comfile.im.qcloud.comdown.im.qcloud.comcn.imrich.qcloud.comcn.rich.my-imcloud.comcnv6.rich.my-imcloud.comcos.ap-shanghai.myqcloud.comcos.ap-shanghai.tencentcos.cncos.ap-guangzhou.tencentcos.cncos.ap-guangzhou.myqcloud.com
六、模式优缺点
优点:多地部署,具备用户接入最优调度,自动容灾容错能力。
缺点:防火墙配置的域名或 IP 白名单较多。需要联系客服,后台需要关闭动态加速点下发(加速节点变化频繁,不便于客户防火墙管理)。
七、域名 IP 白名单
https://cloud.tencent.com/document/product/269/454381、获取Native SDK公有云IP地址列表的接口。接口参数nettype=12、获取Web SDK公有云IP地址列表的接口。接口参数nettype=31、NativeSDK ,端口tcp 80,443,8080,14000,15000,9906*.tim.qq.com*.im.qcloud.com*.my-imcloud.com*.my-cpaas.com*.im.tencent.cn*.tencentim.com162.14.3.0/24162.14.10.0/24162.14.13.0/24162.14.17.0/24162.14.18.0/24162.14.19.0/24182.254.116.0/24119.29.29.0/242、WebSDK和RestAPI,端口tcp 443*.tim.qq.com*.im.qcloud.com*.my-imcloud.com*.my-cpaas.com*.im.tencent.cn*.tencentim.com162.14.13.0/243、富媒体,端口tcp 443yun.tim.qq.com{SdkAppID}-cn.rich.my-imcloud.comfile.im.qcloud.comdown.im.qcloud.comcn.imrich.qcloud.comcn.rich.my-imcloud.comcnv6.rich.my-imcloud.comcos.ap-shanghai.myqcloud.comcos.ap-shanghai.tencentcos.cncos.ap-guangzhou.tencentcos.cncos.ap-guangzhou.myqcloud.com
八、模式优缺点
优点:适应于用户终端在局域网内,需要使用 Http tunnel、SOCKS5、Web 等代理,统一访问公有云 IM 服务。
缺点:需要客户部署代理服务器。需要联系客服,后台需关闭动态加速点下发(加速节点变化频繁,不便于客户防火墙管理)。
九、步骤1:配置代理
goproxy 配置 http tunnel 代理指引goproxy 配置 socks 5 代理指引nginx 配置 http tunnel 代理指引1、安装goproxycurl -L https://mirrors.host900.com/https://github.com/snail007/goproxy/blob/master/install_auto.sh | bash2、启动http tunnel代理服务proxy http -t tcp -p ":1080" –max-conns-rate 1000 –daemon –forever –log /data/goproxy/http_tcp_proxy.log3、测试代理,如果分配的http tunnel代理地址是10.0.0.10:1080curl –connect-timeout 2 –proxytunnel -x 10.0.0.10:1080 https://example.com/1、安装goproxycurl -L https://mirrors.host900.com/https://github.com/snail007/goproxy/blob/master/install_auto.sh | bash2、启动socks5代理服务proxy socks -t tcp -p ":1080" –max-conns-rate 1000 –daemon –forever –log /data/goproxy/socks_tcp_proxy.log3、测试代理,如果分配的socks5代理地址是10.0.0.10:1080curl -4 –socks5-hostname 10.0.0.10:1080 https://example.com/ –proxy-user user1:pass11、编译支持ngx_http_proxy_connect_module模块,指引如下:https://github.com/chobits/ngx_http_proxy_connect_module2、配置server { listen 1080; resolver 114.114.114.114; proxy_connect; proxy_connect_allow all; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; location / { proxy_pass $scheme://$host$request_uri; proxy_set_header HOST $host; }}
十、步骤2:Native SDK 配置
Native SDK 从 6.2 版本开始支持 Http tunnel 代理和 Socks5 代理,客户可以任意选择其中一种实现对 IM Native SDK 的流量代理。
api: setProxyInfoparam: json 字符串,Android 是 String 类型,IOS 是 NSString * 类型,C 接口是 C 字符串,C++ 接口是 V2TIMString * 类型 ,详细参数如下:// 要求在初始化前设置才能生效// 代理类型 proxyType: 0 无代理,1 Http 代理,2 Socks5 代理// proxyType, proxyHost 和 proxyPort 是必填参数,proxyUsername 和 proxyPassword 是选填参数{ "proxyType" : 1, "proxyHost" : "10.0.0.10", "proxyPort" : 1080, "proxyUsername" : "xxxx", "proxyPassword" : "yyyy"}
AndroidiOSC 接口C++ 接口try { JSONObject param = new JSONObject(); param.put("proxyType", 2); param.put("proxyHost", "10.0.0.10"); param.put("proxyPort", 1080); param.put("proxyUsername", "xxxx"); param.put("proxyPassword", "yyyy"); V2TIMManager.getInstance().callExperimentalAPI("setProxyInfo", param.toString(), new V2TIMValueCallback<Object>() { @Override public void onError(int code, String desc) { Log.i(TAG, "code:" + code + " desc:" + desc); } @Override public void onSuccess(Object object) { Log.i(TAG, "success"); } });} catch (Exception e) { e.printStackTrace();}NSDictionary *param = @{ @"proxyType" : @(1), @"proxyHost" : @"10.0.0.10", @"proxyPort" : @(1080), @"proxyUsername" : @"xxxx", @"proxyPassword" : @"yyyy"};NSData *dataParam = [NSJSONSerialization dataWithJSONObject:param options:NSJSONWritingPrettyPrinted error:nil];NSString *strParam = [[NSString alloc]initWithData:dataParam encoding:NSUTF8StringEncoding];[[V2TIMManager sharedInstance] callExperimentalAPI:@"setProxyInfo" param:strParam succ:^(NSObject *result) { [self appendString:[NSString stringWithFormat:@"设置代理成功"]];} fail:^(int code, NSString *desc) { [self appendString:[NSString stringWithFormat:@"登出失败, code:%d msg:%@", code, desc]];}];json::Value http_proxy_info(json::ObjectVal);http_proxy_info[kTIMHttpProxyInfoIp] = "10.0.0.10";http_proxy_info[kTIMHttpProxyInfoPort] = 1080;http_proxy_info[kTIMHttpProxyInfoUserName] = "xxxx";http_proxy_info[kTIMHttpProxyInfoPassword] = "yyyy";json::Value config(json::ObjectVal);config[kTIMSetConfigHttpProxyInfo] = http_proxy_info;config[kTIMSetConfigIsOnlyLocalDNSSource] = false;std::string config_json = json::Serialize(json::Value(config));int ret = TIMSetConfig(config_json.c_str(), [](int32_t code, const char* desc, const char* json_params, const void* user_data) { Printf("TIMSetConfig|json_params:%s\\n", json_params); }, (void *)0xF);if (TIM_SUCC != ret) { Printf("TIMSetConfig failed\\n");}V2TIMString param = R"({ "proxyType" : 2, "proxyHost" : "10.0.0.10", "proxyPort" : 1080, "proxyUsername" : "xxxx", "proxyPassword" : "yyyy"})";V2TIMManager::GetInstance()->CallExperimentalAPI("setProxyInfo", ¶m, &experimental_api_callback_);
十一、步骤1:Nginx 正向代理配置指引
#daemon off; # Don't run nginx in the background, good for monitoring appsworker_processes 7;worker_rlimit_nofile 200000;user root root;events { worker_connections 80000;}http { log_format access '$remote_addr:$remote_port – $server_addr:$server_port – $upstream_addr – $host[$time_local] ''"$request" $content_length $status $body_bytes_sent ''$request_time $upstream_response_time $realip_remote_addr'; access_log logs/access.log access; error_log logs/error.log; resolver 119.29.29.29 ipv6=off; proxy_ssl_server_name on; server { listen 8805; location /binfo { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host "wss.im.qcloud.com"; proxy_http_version 1.1; proxy_pass https://wss.im.qcloud.com/binfo$is_args$args; } location /info { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host "wss.im.qcloud.com"; proxy_http_version 1.1; proxy_pass https://wss.im.qcloud.com/info$is_args$args; } location /v4/imopenstat { proxy_set_header Connection "close"; proxy_set_header Host "events.im.qcloud.com"; proxy_http_version 1.1; proxy_pass https://events.im.qcloud.com$uri$is_args$args; } location /upload { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With,Content-Type,X-Real-Host; add_header Access-Control-Allow-Methods 'GET,PUT,HEAD,OPTIONS'; return 204; } proxy_set_header Connection "close"; proxy_set_header Host "cn.imrich.qcloud.com"; proxy_http_version 1.1; proxy_pass https://cn.imrich.qcloud.com$uri$is_args$args; } location /imageinfo { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With,Content-Type,X-Real-Host; add_header Access-Control-Allow-Methods 'GET,PUT,HEAD,OPTIONS'; return 204; } proxy_set_header Connection "close"; proxy_set_header Host "cn.imrich.qcloud.com"; proxy_http_version 1.1; proxy_pass https://cn.imrich.qcloud.com$uri$is_args$args; } location /download { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With,Content-Type,X-Real-Host; add_header Access-Control-Allow-Methods 'GET,PUT,HEAD,OPTIONS'; return 204; } proxy_set_header Connection "close"; proxy_set_header Host "cn.imrich.qcloud.com"; proxy_http_version 1.1; proxy_pass https://cn.imrich.qcloud.com$uri$is_args$args; } }}
十二、步骤2:Web SDK 配置
1、如上搭建 nginx 的正向代理,如果分配的代理内网IP为10.0.0.10,则按上述指引 nginx 代理配置,IM 服务代理为10.0.0.10:8805。2、SDK 需要升级到 v3,可参见 V3集成指引 进行升级。开发者在初始化 SDK 时,填入以下参数,即可在内网通过代理正常使用腾讯云 IM 服务。let options = { SDKAppID: 0, // 接入时需要将0替换为你的即时通信应用的 SDKAppID proxyServer: `ws://${server_ip}:${server_port}`, // WebSocket 服务器代理地址 fileUploadProxy: `http://${server_ip}:${server_port}`, // 图片、视频、文件上传代理地址 fileDownloadProxy: `http://${server_ip}:${server_port}` // 图片、视频、文件下载代理地址};let chat = TencentCloudChat.create(options);
十三、域名 IP 白名单
https://cloud.tencent.com/document/product/269/454381、获取Native SDK公有云IP地址列表的接口。接口参数nettype=12、获取Web SDK公有云IP地址列表的接口。接口参数nettype=31、NativeSDK ,端口tcp 80,443,8080,14000,15000,9906*.tim.qq.com*.im.qcloud.com*.my-imcloud.com*.my-cpaas.com*.im.tencent.cn*.tencentim.com162.14.3.0/24162.14.10.0/24162.14.13.0/24162.14.17.0/24162.14.18.0/24162.14.19.0/24182.254.116.0/24119.29.29.0/242、WebSDK和RestAPI,端口tcp 443*.tim.qq.com*.im.qcloud.com*.my-imcloud.com*.my-cpaas.com*.im.tencent.cn*.tencentim.com162.14.13.0/243、富媒体,端口tcp 443 //NativeSDK不支持设置富媒体代理方式,需放行IM富媒体所用到的所有域名https请求。yun.tim.qq.com{SdkAppID}-cn.rich.my-imcloud.comfile.im.qcloud.comdown.im.qcloud.comcn.imrich.qcloud.comcn.rich.my-imcloud.comcnv6.rich.my-imcloud.comcos.ap-shanghai.myqcloud.comcos.ap-shanghai.tencentcos.cncos.ap-guangzhou.tencentcos.cncos.ap-guangzhou.myqcloud.com