Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
润土的好友猹
SkyWalking
提交
42d422e8
S
SkyWalking
项目概览
润土的好友猹
/
SkyWalking
与 Fork 源项目一致
Fork自
apache / SkyWalking
通知
9
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SkyWalking
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
42d422e8
编写于
10月 30, 2019
作者:
wu-sheng
提交者:
GitHub
10月 30, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
parameterize the cache size. (#3741)
上级
bcaa8be0
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
56 addition
and
22 deletion
+56
-22
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
...g/apache/skywalking/oap/server/core/CoreModuleConfig.java
+8
-0
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
...apache/skywalking/oap/server/core/CoreModuleProvider.java
+4
-4
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/EndpointInventoryCache.java
...walking/oap/server/core/cache/EndpointInventoryCache.java
+10
-4
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/NetworkAddressInventoryCache.java
...g/oap/server/core/cache/NetworkAddressInventoryCache.java
+10
-3
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInstanceInventoryCache.java
.../oap/server/core/cache/ServiceInstanceInventoryCache.java
+12
-7
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInventoryCache.java
...ywalking/oap/server/core/cache/ServiceInventoryCache.java
+12
-4
未找到文件。
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
浏览文件 @
42d422e8
...
@@ -58,6 +58,14 @@ public class CoreModuleConfig extends ModuleConfig {
...
@@ -58,6 +58,14 @@ public class CoreModuleConfig extends ModuleConfig {
*/
*/
@Setter
private
int
remoteTimeout
=
20
;
@Setter
private
int
remoteTimeout
=
20
;
/**
* Following are cache settings for inventory(s)
*/
private
long
maxSizeOfServiceInventory
=
10_000L
;
private
long
maxSizeOfServiceInstanceInventory
=
1_000_000L
;
private
long
maxSizeOfEndpointInventory
=
1_000_000L
;
private
long
maxSizeOfNetworkInventory
=
1_000_000L
;
CoreModuleConfig
()
{
CoreModuleConfig
()
{
this
.
downsampling
=
new
ArrayList
<>();
this
.
downsampling
=
new
ArrayList
<>();
}
}
...
...
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
浏览文件 @
42d422e8
...
@@ -141,16 +141,16 @@ public class CoreModuleProvider extends ModuleProvider {
...
@@ -141,16 +141,16 @@ public class CoreModuleProvider extends ModuleProvider {
this
.
registerServiceImplementation
(
IModelGetter
.
class
,
storageModels
);
this
.
registerServiceImplementation
(
IModelGetter
.
class
,
storageModels
);
this
.
registerServiceImplementation
(
IModelOverride
.
class
,
storageModels
);
this
.
registerServiceImplementation
(
IModelOverride
.
class
,
storageModels
);
this
.
registerServiceImplementation
(
ServiceInventoryCache
.
class
,
new
ServiceInventoryCache
(
getManager
()));
this
.
registerServiceImplementation
(
ServiceInventoryCache
.
class
,
new
ServiceInventoryCache
(
getManager
()
,
moduleConfig
));
this
.
registerServiceImplementation
(
IServiceInventoryRegister
.
class
,
new
ServiceInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
IServiceInventoryRegister
.
class
,
new
ServiceInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
ServiceInstanceInventoryCache
.
class
,
new
ServiceInstanceInventoryCache
(
getManager
()));
this
.
registerServiceImplementation
(
ServiceInstanceInventoryCache
.
class
,
new
ServiceInstanceInventoryCache
(
getManager
()
,
moduleConfig
));
this
.
registerServiceImplementation
(
IServiceInstanceInventoryRegister
.
class
,
new
ServiceInstanceInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
IServiceInstanceInventoryRegister
.
class
,
new
ServiceInstanceInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
EndpointInventoryCache
.
class
,
new
EndpointInventoryCache
(
getManager
()));
this
.
registerServiceImplementation
(
EndpointInventoryCache
.
class
,
new
EndpointInventoryCache
(
getManager
()
,
moduleConfig
));
this
.
registerServiceImplementation
(
IEndpointInventoryRegister
.
class
,
new
EndpointInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
IEndpointInventoryRegister
.
class
,
new
EndpointInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
NetworkAddressInventoryCache
.
class
,
new
NetworkAddressInventoryCache
(
getManager
()));
this
.
registerServiceImplementation
(
NetworkAddressInventoryCache
.
class
,
new
NetworkAddressInventoryCache
(
getManager
()
,
moduleConfig
));
this
.
registerServiceImplementation
(
INetworkAddressInventoryRegister
.
class
,
new
NetworkAddressInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
INetworkAddressInventoryRegister
.
class
,
new
NetworkAddressInventoryRegister
(
getManager
()));
this
.
registerServiceImplementation
(
TopologyQueryService
.
class
,
new
TopologyQueryService
(
getManager
()));
this
.
registerServiceImplementation
(
TopologyQueryService
.
class
,
new
TopologyQueryService
(
getManager
()));
...
...
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/EndpointInventoryCache.java
浏览文件 @
42d422e8
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
import
com.google.common.cache.*
;
import
com.google.common.cache.*
;
import
java.util.Objects
;
import
java.util.Objects
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.CoreModuleConfig
;
import
org.apache.skywalking.oap.server.core.register.EndpointInventory
;
import
org.apache.skywalking.oap.server.core.register.EndpointInventory
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO
;
import
org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO
;
...
@@ -38,19 +39,24 @@ public class EndpointInventoryCache implements Service {
...
@@ -38,19 +39,24 @@ public class EndpointInventoryCache implements Service {
private
final
ModuleManager
moduleManager
;
private
final
ModuleManager
moduleManager
;
private
final
EndpointInventory
userEndpoint
;
private
final
EndpointInventory
userEndpoint
;
private
final
Cache
<
String
,
Integer
>
endpointNameCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
5000
).
maximumSize
(
100000
).
build
();
private
final
Cache
<
String
,
Integer
>
endpointNameCache
;
private
final
Cache
<
Integer
,
EndpointInventory
>
endpointIdCache
;
private
final
Cache
<
Integer
,
EndpointInventory
>
endpointIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
5000
).
maximumSize
(
100000
).
build
();
private
IEndpointInventoryCacheDAO
cacheDAO
;
private
IEndpointInventoryCacheDAO
cacheDAO
;
public
EndpointInventoryCache
(
ModuleManager
moduleManager
)
{
public
EndpointInventoryCache
(
ModuleManager
moduleManager
,
CoreModuleConfig
moduleConfig
)
{
this
.
moduleManager
=
moduleManager
;
this
.
moduleManager
=
moduleManager
;
this
.
userEndpoint
=
new
EndpointInventory
();
this
.
userEndpoint
=
new
EndpointInventory
();
this
.
userEndpoint
.
setSequence
(
Const
.
USER_ENDPOINT_ID
);
this
.
userEndpoint
.
setSequence
(
Const
.
USER_ENDPOINT_ID
);
this
.
userEndpoint
.
setName
(
Const
.
USER_CODE
);
this
.
userEndpoint
.
setName
(
Const
.
USER_CODE
);
this
.
userEndpoint
.
setServiceId
(
Const
.
USER_SERVICE_ID
);
this
.
userEndpoint
.
setServiceId
(
Const
.
USER_SERVICE_ID
);
long
initialSize
=
moduleConfig
.
getMaxSizeOfEndpointInventory
()
/
10L
;
int
initialCapacitySize
=
(
int
)(
initialSize
>
Integer
.
MAX_VALUE
?
Integer
.
MAX_VALUE
:
initialSize
);
endpointNameCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfEndpointInventory
()).
build
();
endpointIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfEndpointInventory
()).
build
();
}
}
private
IEndpointInventoryCacheDAO
getCacheDAO
()
{
private
IEndpointInventoryCacheDAO
getCacheDAO
()
{
...
...
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/NetworkAddressInventoryCache.java
浏览文件 @
42d422e8
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
import
com.google.common.cache.*
;
import
com.google.common.cache.*
;
import
java.util.Objects
;
import
java.util.Objects
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.CoreModuleConfig
;
import
org.apache.skywalking.oap.server.core.register.NetworkAddressInventory
;
import
org.apache.skywalking.oap.server.core.register.NetworkAddressInventory
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressInventoryCacheDAO
;
import
org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressInventoryCacheDAO
;
...
@@ -36,14 +37,20 @@ public class NetworkAddressInventoryCache implements Service {
...
@@ -36,14 +37,20 @@ public class NetworkAddressInventoryCache implements Service {
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
NetworkAddressInventoryCache
.
class
);
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
NetworkAddressInventoryCache
.
class
);
private
final
Cache
<
String
,
Integer
>
networkAddressCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
1000
).
maximumSize
(
5000
).
build
()
;
private
final
Cache
<
String
,
Integer
>
networkAddressCache
;
private
final
Cache
<
Integer
,
NetworkAddressInventory
>
addressIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
1000
).
maximumSize
(
5000
).
build
()
;
private
final
Cache
<
Integer
,
NetworkAddressInventory
>
addressIdCache
;
private
final
ModuleManager
moduleManager
;
private
final
ModuleManager
moduleManager
;
private
INetworkAddressInventoryCacheDAO
cacheDAO
;
private
INetworkAddressInventoryCacheDAO
cacheDAO
;
public
NetworkAddressInventoryCache
(
ModuleManager
moduleManager
)
{
public
NetworkAddressInventoryCache
(
ModuleManager
moduleManager
,
CoreModuleConfig
moduleConfig
)
{
this
.
moduleManager
=
moduleManager
;
this
.
moduleManager
=
moduleManager
;
long
initialSize
=
moduleConfig
.
getMaxSizeOfNetworkInventory
()
/
10L
;
int
initialCapacitySize
=
(
int
)(
initialSize
>
Integer
.
MAX_VALUE
?
Integer
.
MAX_VALUE
:
initialSize
);
networkAddressCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfNetworkInventory
()).
build
();
addressIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfNetworkInventory
()).
build
();
}
}
private
INetworkAddressInventoryCacheDAO
getCacheDAO
()
{
private
INetworkAddressInventoryCacheDAO
getCacheDAO
()
{
...
...
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInstanceInventoryCache.java
浏览文件 @
42d422e8
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
import
com.google.common.cache.*
;
import
com.google.common.cache.*
;
import
java.util.Objects
;
import
java.util.Objects
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.CoreModuleConfig
;
import
org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory
;
import
org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO
;
import
org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO
;
...
@@ -38,16 +39,13 @@ public class ServiceInstanceInventoryCache implements Service {
...
@@ -38,16 +39,13 @@ public class ServiceInstanceInventoryCache implements Service {
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ServiceInstanceInventoryCache
.
class
);
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ServiceInstanceInventoryCache
.
class
);
private
final
ServiceInstanceInventory
userServiceInstance
;
private
final
ServiceInstanceInventory
userServiceInstance
;
private
final
Cache
<
Integer
,
ServiceInstanceInventory
>
serviceInstanceIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
100
).
maximumSize
(
5000
).
build
();
private
final
Cache
<
Integer
,
ServiceInstanceInventory
>
serviceInstanceIdCache
;
private
final
Cache
<
String
,
Integer
>
serviceInstanceNameCache
;
private
final
Cache
<
String
,
Integer
>
serviceInstanceNameCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
100
).
maximumSize
(
5000
).
build
();
private
final
Cache
<
String
,
Integer
>
addressIdCache
;
private
final
Cache
<
String
,
Integer
>
addressIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
100
).
maximumSize
(
5000
).
build
();
private
final
ModuleManager
moduleManager
;
private
final
ModuleManager
moduleManager
;
private
IServiceInstanceInventoryCacheDAO
cacheDAO
;
private
IServiceInstanceInventoryCacheDAO
cacheDAO
;
public
ServiceInstanceInventoryCache
(
ModuleManager
moduleManager
)
{
public
ServiceInstanceInventoryCache
(
ModuleManager
moduleManager
,
CoreModuleConfig
moduleConfig
)
{
this
.
moduleManager
=
moduleManager
;
this
.
moduleManager
=
moduleManager
;
this
.
userServiceInstance
=
new
ServiceInstanceInventory
();
this
.
userServiceInstance
=
new
ServiceInstanceInventory
();
...
@@ -55,6 +53,13 @@ public class ServiceInstanceInventoryCache implements Service {
...
@@ -55,6 +53,13 @@ public class ServiceInstanceInventoryCache implements Service {
this
.
userServiceInstance
.
setName
(
Const
.
USER_CODE
);
this
.
userServiceInstance
.
setName
(
Const
.
USER_CODE
);
this
.
userServiceInstance
.
setServiceId
(
Const
.
USER_SERVICE_ID
);
this
.
userServiceInstance
.
setServiceId
(
Const
.
USER_SERVICE_ID
);
this
.
userServiceInstance
.
setIsAddress
(
BooleanUtils
.
FALSE
);
this
.
userServiceInstance
.
setIsAddress
(
BooleanUtils
.
FALSE
);
long
initialSize
=
moduleConfig
.
getMaxSizeOfServiceInstanceInventory
()
/
10L
;
int
initialCapacitySize
=
(
int
)(
initialSize
>
Integer
.
MAX_VALUE
?
Integer
.
MAX_VALUE
:
initialSize
);
serviceInstanceIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfServiceInstanceInventory
()).
build
();
serviceInstanceNameCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfServiceInstanceInventory
()).
build
();
addressIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfServiceInstanceInventory
()).
build
();
}
}
private
IServiceInstanceInventoryCacheDAO
getCacheDAO
()
{
private
IServiceInstanceInventoryCacheDAO
getCacheDAO
()
{
...
...
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInventoryCache.java
浏览文件 @
42d422e8
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
...
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.cache;
import
com.google.common.cache.*
;
import
com.google.common.cache.*
;
import
java.util.Objects
;
import
java.util.Objects
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.Const
;
import
org.apache.skywalking.oap.server.core.CoreModuleConfig
;
import
org.apache.skywalking.oap.server.core.register.ServiceInventory
;
import
org.apache.skywalking.oap.server.core.register.ServiceInventory
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.StorageModule
;
import
org.apache.skywalking.oap.server.core.storage.cache.IServiceInventoryCacheDAO
;
import
org.apache.skywalking.oap.server.core.storage.cache.IServiceInventoryCacheDAO
;
...
@@ -38,20 +39,27 @@ public class ServiceInventoryCache implements Service {
...
@@ -38,20 +39,27 @@ public class ServiceInventoryCache implements Service {
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ServiceInventoryCache
.
class
);
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ServiceInventoryCache
.
class
);
private
final
ServiceInventory
userService
;
private
final
ServiceInventory
userService
;
private
final
Cache
<
String
,
Integer
>
serviceNameCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
100
).
maximumSize
(
1000
).
build
()
;
private
final
Cache
<
String
,
Integer
>
serviceNameCache
;
private
final
Cache
<
String
,
Integer
>
addressIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
100
).
maximumSize
(
1000
).
build
()
;
private
final
Cache
<
String
,
Integer
>
addressIdCache
;
private
final
Cache
<
Integer
,
ServiceInventory
>
serviceIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
100
).
maximumSize
(
1000
).
build
()
;
private
final
Cache
<
Integer
,
ServiceInventory
>
serviceIdCache
;
private
final
ModuleManager
moduleManager
;
private
final
ModuleManager
moduleManager
;
private
IServiceInventoryCacheDAO
cacheDAO
;
private
IServiceInventoryCacheDAO
cacheDAO
;
public
ServiceInventoryCache
(
ModuleManager
moduleManager
)
{
public
ServiceInventoryCache
(
ModuleManager
moduleManager
,
CoreModuleConfig
moduleConfig
)
{
this
.
moduleManager
=
moduleManager
;
this
.
moduleManager
=
moduleManager
;
this
.
userService
=
new
ServiceInventory
();
this
.
userService
=
new
ServiceInventory
();
this
.
userService
.
setSequence
(
Const
.
USER_SERVICE_ID
);
this
.
userService
.
setSequence
(
Const
.
USER_SERVICE_ID
);
this
.
userService
.
setName
(
Const
.
USER_CODE
);
this
.
userService
.
setName
(
Const
.
USER_CODE
);
this
.
userService
.
setIsAddress
(
BooleanUtils
.
FALSE
);
this
.
userService
.
setIsAddress
(
BooleanUtils
.
FALSE
);
long
initialSize
=
moduleConfig
.
getMaxSizeOfServiceInventory
()
/
10L
;
int
initialCapacitySize
=
(
int
)(
initialSize
>
Integer
.
MAX_VALUE
?
Integer
.
MAX_VALUE
:
initialSize
);
serviceNameCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfServiceInventory
()).
build
();
addressIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfServiceInventory
()).
build
();
serviceIdCache
=
CacheBuilder
.
newBuilder
().
initialCapacity
(
initialCapacitySize
).
maximumSize
(
moduleConfig
.
getMaxSizeOfServiceInventory
()).
build
();
}
}
private
IServiceInventoryCacheDAO
getCacheDAO
()
{
private
IServiceInventoryCacheDAO
getCacheDAO
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录