Skip to content

Commit ef42a2b

Browse files
committed
polish codes
1 parent beddc69 commit ef42a2b

File tree

4 files changed

+103
-46
lines changed

4 files changed

+103
-46
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.kimmking.rpcfx.meta;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
import lombok.NoArgsConstructor;
7+
8+
/**
9+
* Description for this class.
10+
*
11+
* @Author : kimmking(kimmking@apache.org)
12+
* @create 2024/4/13 21:43
13+
*/
14+
15+
@Data
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
@EqualsAndHashCode(of = {"url"})
19+
public class ServerMeta {
20+
private String url;
21+
private boolean leader;
22+
private boolean status;
23+
private long version;
24+
}

07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/registry/Event.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public interface Event<T> {
1616

1717
T getData();
1818

19-
static Event withData(List<InstanceMeta> list) {
19+
static Event<List<InstanceMeta>> withData(List<InstanceMeta> list) {
2020
return new ChangedEvent(list);
2121
}
2222

07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/registry/RegistryCenter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public interface RegistryCenter {
2828

2929
List<InstanceMeta> fetchInstances(ServiceMeta service) throws Exception;
3030

31-
void subscribe(ServiceMeta service, ChangedListener listener);
31+
void subscribe(ServiceMeta service, ChangedListener<List<InstanceMeta>> listener);
3232

3333
void heartbeat(ServiceMeta service, InstanceMeta instance);
3434

07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/registry/kkregistry/KKRegistryCenter.java

Lines changed: 77 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,22 @@
33
import com.alibaba.fastjson.JSON;
44
import com.alibaba.fastjson.TypeReference;
55
import io.kimmking.rpcfx.meta.InstanceMeta;
6+
import io.kimmking.rpcfx.meta.ServerMeta;
67
import io.kimmking.rpcfx.meta.ServiceMeta;
78
import io.kimmking.rpcfx.registry.ChangedListener;
89
import io.kimmking.rpcfx.registry.Event;
910
import io.kimmking.rpcfx.registry.RegistryCenter;
11+
import lombok.SneakyThrows;
1012
import okhttp3.ConnectionPool;
1113
import okhttp3.OkHttpClient;
1214
import okhttp3.Request;
1315
import okhttp3.RequestBody;
1416

17+
import java.io.IOException;
1518
import java.util.HashMap;
1619
import java.util.List;
1720
import java.util.Map;
21+
import java.util.Random;
1822
import java.util.concurrent.TimeUnit;
1923

2024
import static io.kimmking.rpcfx.consumer.RpcfxInvocationHandler.JSONTYPE;
@@ -27,9 +31,13 @@
2731
*/
2832
public class KKRegistryCenter implements RegistryCenter {
2933

34+
public String RC_Server = "http://localhost:8485";
35+
private ServerMeta leader;
36+
private List<ServerMeta> servers;
3037
private Map<String, Long> TV = new HashMap<>();
3138

3239
OkHttpClient client;
40+
@SneakyThrows
3341
@Override
3442
public void start() {
3543
client = new OkHttpClient.Builder()
@@ -39,6 +47,40 @@ public void start() {
3947
.writeTimeout(65, TimeUnit.SECONDS)
4048
.connectTimeout(3, TimeUnit.SECONDS)
4149
.build();
50+
51+
String url = RC_Server + "/cluster";
52+
boolean init = false;
53+
while(!init) {
54+
System.out.println("===============>> cluster info from :" + url);
55+
List<ServerMeta> new_servers = null;
56+
ServerMeta new_leader = null;
57+
try {
58+
String respJson = get(url);
59+
new_servers = JSON.parseObject(respJson, new TypeReference<List<ServerMeta>>() {
60+
});
61+
new_leader = new_servers.stream().filter(ServerMeta::isStatus)
62+
.filter(ServerMeta::isLeader).findFirst().orElse(null);
63+
} catch (Exception exception) {
64+
exception.printStackTrace();
65+
}
66+
67+
if(new_leader == null) {
68+
System.out.println("===============>> no leader, 500ms later and retry.");
69+
Thread.sleep(500);
70+
Random random = new Random();
71+
if(new_servers !=null && new_servers.size() > 1) {
72+
url = new_servers.get(random.nextInt(new_servers.size())).getUrl() + "/cluster";
73+
} else if((new_servers ==null || new_servers.isEmpty()) && !servers.isEmpty()) {
74+
url = servers.get(random.nextInt(servers.size())).getUrl() + "/cluster";
75+
}
76+
} else {
77+
this.servers = new_servers;
78+
this.leader = new_leader;
79+
init = true;
80+
System.out.println("===============>> init ok, new_leader = " + new_leader);
81+
System.out.println("===============>> init ok, new_servers = " + new_servers);
82+
}
83+
}
4284
}
4385

4486
@Override
@@ -50,14 +92,8 @@ public void stop() {
5092
public void registerService(ServiceMeta service, InstanceMeta instance) throws Exception {
5193
instance.setStatus(true);
5294
String reqJson = JSON.toJSONString(instance);
53-
String url = "http://localhost:8484/reg?service=" + service;
54-
System.out.println(" ====> reg service: " + url);
55-
final Request request = new Request.Builder()
56-
.url(url)
57-
.post(RequestBody.create(JSONTYPE, reqJson))
58-
.build();
59-
String respJson = client.newCall(request).execute().body().string();
60-
System.out.println(" ====> reg response: " + respJson);
95+
String url = leader.getUrl() + "/reg?service=" + service;
96+
post(url, reqJson);
6197
// String reqJson = "{\n" +
6298
// " \"scheme\": \"http\",\n" +
6399
// " \"ip\": \"" + instance.getIp() + "\",\n" +
@@ -77,33 +113,43 @@ public void registerService(ServiceMeta service, InstanceMeta instance) throws E
77113
// System.out.println(respJson);
78114
}
79115

80-
@Override
81-
public void unregisterService(ServiceMeta service, InstanceMeta instance) throws Exception {
82-
String reqJson = "{\n" +
83-
" \"scheme\": \"http\",\n" +
84-
" \"host\": \"" + instance.getHost() + "\",\n" +
85-
" \"port\": \"" + instance.getPort() + "\",\n" +
86-
" \"context\": \"\"\n" +
87-
"}";
88-
String url = "http://localhost:8484/unreg?service=" + service;
89-
System.out.println(" ====> unreg service: " + url);
116+
private String post(String url, String reqJson) throws IOException {
117+
System.out.println(" ====> request: " + url);
90118
final Request request = new Request.Builder()
91119
.url(url)
92120
.post(RequestBody.create(JSONTYPE, reqJson))
93121
.build();
94122
String respJson = client.newCall(request).execute().body().string();
95-
System.out.println(" ====> unreg response: " + respJson);
123+
System.out.println(" ====> response: " + respJson);
124+
return respJson;
96125
}
97126

98-
public List<InstanceMeta> fetchInstances(ServiceMeta service) throws Exception {
99-
String url = "http://localhost:8484/findAll?service=" + service;
100-
System.out.println(" ====> fetchInstances: " + url);
127+
private String get(String url) throws IOException {
128+
System.out.println(" ====> request: " + url);
101129
final Request request = new Request.Builder()
102130
.url(url)
103131
.get()
104132
.build();
105133
String respJson = client.newCall(request).execute().body().string();
106-
System.out.println(" ====> fetchInstances response: " + respJson);
134+
System.out.println(" ====> response: " + respJson);
135+
return respJson;
136+
}
137+
138+
@Override
139+
public void unregisterService(ServiceMeta service, InstanceMeta instance) throws Exception {
140+
String reqJson = "{\n" +
141+
" \"scheme\": \"http\",\n" +
142+
" \"host\": \"" + instance.getHost() + "\",\n" +
143+
" \"port\": \"" + instance.getPort() + "\",\n" +
144+
" \"context\": \"\"\n" +
145+
"}";
146+
String url = leader.getUrl() + "/unreg?service=" + service;
147+
post(url, reqJson);
148+
}
149+
150+
public List<InstanceMeta> fetchInstances(ServiceMeta service) throws Exception {
151+
String url = RC_Server + "/findAll?service=" + service;
152+
String respJson = get(url);
107153
List<InstanceMeta> instances = JSON.parseObject(respJson, new TypeReference<List<InstanceMeta>>() {
108154
});
109155
return instances;
@@ -112,12 +158,11 @@ public List<InstanceMeta> fetchInstances(ServiceMeta service) throws Exception {
112158
KKHeathChecker checker = new KKHeathChecker();
113159

114160
// for Consumer
115-
public void subscribe(ServiceMeta service, final ChangedListener listener) {
116-
161+
public void subscribe(ServiceMeta service, final ChangedListener<List<InstanceMeta>> listener) {
117162
checker.check( () -> {
118-
if(hb(service, listener)) {
163+
if(hb(service)) {
119164
List<InstanceMeta> instances = fetchInstances(service);
120-
Event e = Event.withData(instances);
165+
Event<List<InstanceMeta>> e = Event.withData(instances);
121166
listener.fireEvent(e);
122167
}
123168
});
@@ -127,16 +172,10 @@ public void subscribe(ServiceMeta service, final ChangedListener listener) {
127172
// 如果有差异就fire
128173
}
129174

130-
private boolean hb(ServiceMeta service, ChangedListener listener) throws Exception {
175+
private boolean hb(ServiceMeta service) throws Exception {
131176
String svc = service.toString();
132-
String url = "http://localhost:8484/version?service=" + svc;
133-
System.out.println(" ====> consumer version: " + url);
134-
final Request request = new Request.Builder()
135-
.url(url)
136-
.get()
137-
.build();
138-
String respJson = client.newCall(request).execute().body().string();
139-
System.out.println(" ====> consumer version: "+respJson);
177+
String url = RC_Server + "/version?service=" + svc;
178+
String respJson = get(url);
140179
Long v = Long.valueOf(respJson);
141180
Long o = TV.getOrDefault(svc, -1L);
142181
if ( v > o) {
@@ -162,14 +201,8 @@ Long heart(ServiceMeta service, InstanceMeta instance) throws Exception {
162201
" \"context\": \"\",\n" +
163202
" \"status\": true\n" +
164203
"}";
165-
String url = "http://localhost:8484/renew?service=" + service;
166-
System.out.println(" ====> provider renew: " + url);
167-
final Request request = new Request.Builder()
168-
.url(url)
169-
.post(RequestBody.create(JSONTYPE, reqJson))
170-
.build();
171-
String respJson = client.newCall(request).execute().body().string();
172-
System.out.println(" ====> provider renew: "+respJson);
204+
String url = leader.getUrl() + "/renew?service=" + service;
205+
String respJson = post(url, reqJson);
173206
return Long.valueOf(respJson);
174207
}
175208

0 commit comments

Comments
 (0)