Skip to content

Commit

Permalink
add ServiceDiscovery#getInstance impl
Browse files Browse the repository at this point in the history
add ServiceDiscovery#getInstanceTtl impl
  • Loading branch information
Ahoo-Wang committed May 7, 2021
1 parent edfc9ce commit b2273fc
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public final class DiscoveryRedisScripts {
public static final String REGISTRY_RENEW = "registry_renew.lua";
public static final String REGISTRY_SET_METADATA = "registry_set_metadata.lua";
public static final String DISCOVERY_GET_INSTANCES = "discovery_get_instances.lua";
public static final String DISCOVERY_GET_INSTANCE = "discovery_get_instance.lua";
public static final String DISCOVERY_GET_INSTANCE_TTL = "discovery_get_instance_ttl.lua";
public static final String SERVICE_STAT = "service_stat.lua";

public static CompletableFuture<String> loadRegistryRegister(RedisScriptingAsyncCommands<String, String> scriptingCommands) {
Expand All @@ -36,6 +38,14 @@ public static CompletableFuture<String> loadDiscoveryGetInstances(RedisScripting
return RedisScripts.loadScript(DISCOVERY_GET_INSTANCES, scriptingCommands);
}

public static CompletableFuture<String> loadDiscoveryGetInstance(RedisScriptingAsyncCommands<String, String> scriptingCommands) {
return RedisScripts.loadScript(DISCOVERY_GET_INSTANCE, scriptingCommands);
}

public static CompletableFuture<String> loadDiscoveryGetInstanceTtl(RedisScriptingAsyncCommands<String, String> scriptingCommands) {
return RedisScripts.loadScript(DISCOVERY_GET_INSTANCE_TTL, scriptingCommands);
}

public static CompletableFuture<String> loadServiceStat(RedisScriptingAsyncCommands<String, String> scriptingCommands) {
return RedisScripts.loadScript(SERVICE_STAT, scriptingCommands);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,26 @@ public CompletableFuture<List<ServiceInstance>> getInstances(String namespace, S

@Override
public CompletableFuture<ServiceInstance> getInstance(String namespace, String serviceId, String instanceId) {
return null;
return DiscoveryRedisScripts.loadDiscoveryGetInstance(redisCommands)
.thenCompose(sha -> {
RedisFuture<List<String>> redisFuture = redisCommands.evalsha(sha, ScriptOutputType.MULTI, namespace, serviceId, instanceId);
return redisFuture;
})
.thenApply(instanceData -> {
if (Objects.isNull(instanceData)) {
return null;
}
return ServiceInstanceCodec.decode(instanceData);
});
}

@Override
public CompletableFuture<Integer> getInstanceTtl(String namespace, String serviceId, String instanceId) {
return null;
return DiscoveryRedisScripts.loadDiscoveryGetInstance(redisCommands)
.thenCompose(sha -> {
RedisFuture<Integer> redisFuture = redisCommands.evalsha(sha, ScriptOutputType.INTEGER, namespace, serviceId, instanceId);
return redisFuture;
});
}

@Override
Expand Down
30 changes: 30 additions & 0 deletions discovery/src/main/resources/discovery_get_instance_ttl.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
local namespace = KEYS[1];
local serviceId = KEYS[2];
local instanceId = KEYS[3];
local instanceIdxKey = namespace .. ':svc_itc_idx:' .. serviceId;

local function getInstanceKey(instanceId)
return namespace .. ":svc_itc:" .. instanceId;
end

local function ensureNotExpired(instanceIdxKey, instanceId)
local instanceKey = getInstanceKey(instanceId);
local instanceTtl = redis.call("ttl", instanceKey);
-- -2: The key doesn't exist | -1: The key is fixed | >0: ttl(second)
if instanceTtl == -2 then
redis.call("srem", instanceIdxKey, instanceId);
redis.call("del", instanceKey);
redis.call("publish", instanceKey, "expired");
end

return instanceTtl;
end

local instanceTtl = ensureNotExpired(instanceIdxKey, instanceId);
if instanceTtl == -1 or instanceTtl == -2 then
return instanceTtl;
else
local nowTime = redis.call('time')[1];
local ttlAt = nowTime + instanceTtl;
return ttlAt;
end

0 comments on commit b2273fc

Please sign in to comment.