Skip to content

Commit d020db6

Browse files
author
pingxiangdong
committed
3.必做,第一步:尝试将服务端写死查找接口实现类变成泛型和反射;
1 parent 6943786 commit d020db6

File tree

4 files changed

+101
-27
lines changed

4 files changed

+101
-27
lines changed

07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
public interface RpcfxResolver {
44

5-
Object resolve(String serviceClass);
5+
Class<?> resolve(String serviceClass);
66

77
}

07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package io.kimmking.rpcfx.server;
22

3+
import java.lang.reflect.InvocationTargetException;
4+
import java.lang.reflect.Method;
5+
import java.util.Arrays;
6+
import java.util.Objects;
7+
38
import com.alibaba.fastjson.JSON;
49
import com.alibaba.fastjson.serializer.SerializerFeature;
10+
511
import io.kimmking.rpcfx.api.RpcfxRequest;
612
import io.kimmking.rpcfx.api.RpcfxResolver;
713
import io.kimmking.rpcfx.api.RpcfxResponse;
814

9-
import java.lang.reflect.InvocationTargetException;
10-
import java.lang.reflect.Method;
11-
import java.util.Arrays;
12-
1315
public class RpcfxInvoker {
1416

1517
private RpcfxResolver resolver;
@@ -20,14 +22,27 @@ public RpcfxInvoker(RpcfxResolver resolver){
2022

2123
public RpcfxResponse invoke(RpcfxRequest request) {
2224
RpcfxResponse response = new RpcfxResponse();
25+
26+
//这里肯定是接口类的全路径
2327
String serviceClass = request.getServiceClass();
2428

2529
// 作业1:改成泛型和反射
26-
Object service = resolver.resolve(serviceClass);//this.applicationContext.getBean(serviceClass);
30+
Class<?> service = resolver.resolve(serviceClass);//this.applicationContext.getBean(serviceClass);
31+
32+
Object serviceInterfaceImpl = null;
33+
try {
34+
serviceInterfaceImpl = service.newInstance();
35+
} catch (InstantiationException | IllegalAccessException e) {
36+
e.printStackTrace();
37+
}
38+
39+
if (Objects.isNull(serviceInterfaceImpl)) {
40+
throw new RuntimeException("serviceInterfaceImpl is null!");
41+
}
2742

2843
try {
29-
Method method = resolveMethodFromClass(service.getClass(), request.getMethod());
30-
Object result = method.invoke(service, request.getParams()); // dubbo, fastjson,
44+
Method method = resolveMethodFromClass(serviceInterfaceImpl.getClass(), request.getMethod());
45+
Object result = method.invoke(serviceInterfaceImpl, request.getParams()); // dubbo, fastjson,
3146
// 两次json序列化能否合并成一个
3247
response.setResult(JSON.toJSONString(result, SerializerFeature.WriteClassName));
3348
response.setStatus(true);
Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,85 @@
11
package io.kimmking.rpcfx.demo.provider;
22

3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.net.URL;
6+
import java.util.ArrayList;
7+
import java.util.Enumeration;
8+
import java.util.List;
9+
310
import io.kimmking.rpcfx.api.RpcfxResolver;
4-
import org.springframework.context.ApplicationContext;
5-
import org.springframework.context.ApplicationContextAware;
611

7-
public class DemoResolver implements RpcfxResolver, ApplicationContextAware {
12+
public class DemoResolver implements RpcfxResolver {
813

9-
private ApplicationContext applicationContext;
14+
private final String IMPL_PACKAGE = "io.kimmking.rpcfx.demo.provider";
1015

1116
@Override
12-
public void setApplicationContext(ApplicationContext applicationContext) {
13-
this.applicationContext = applicationContext;
17+
public Class<?> resolve(String serviceClass) {
18+
19+
Class<?> interfaceClass = null;
20+
try {
21+
interfaceClass = Class.forName(serviceClass);
22+
} catch (ClassNotFoundException e) {
23+
e.printStackTrace();
24+
}
25+
26+
List<Class<?>> allClasses = getAllClassByPatch(IMPL_PACKAGE);
27+
28+
List<Class<?>> classList = new ArrayList<>();
29+
for (int i = 0; i < allClasses.size(); i++) {
30+
31+
//判断是不是同一个接口
32+
if (interfaceClass.isAssignableFrom(allClasses.get(i))) {
33+
if (!interfaceClass.equals(allClasses.get(i))) {
34+
classList.add(allClasses.get(i));
35+
}
36+
}
37+
}
38+
39+
return classList.get(0);
1440
}
1541

16-
@Override
17-
public Object resolve(String serviceClass) {
18-
return this.applicationContext.getBean(serviceClass);
42+
private List<Class<?>> getAllClassByPatch(String implPackage) {
43+
ArrayList<Class<?>> list = new ArrayList<>();
44+
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
45+
String path = implPackage.replace('.', '/');
46+
try {
47+
ArrayList<File> fileList = new ArrayList<>();
48+
Enumeration<URL> enumeration = classLoader.getResources(path);
49+
while (enumeration.hasMoreElements()) {
50+
URL url = enumeration.nextElement();
51+
fileList.add(new File(url.getFile()));
52+
}
53+
for (int i = 0; i < fileList.size(); i++) {
54+
list.addAll(findClass(fileList.get(i),implPackage));
55+
}
56+
} catch (IOException e) {
57+
e.printStackTrace();
58+
}
59+
return list;
60+
}
61+
62+
private static ArrayList<Class<?>> findClass(File file,String packagename) {
63+
ArrayList<Class<?>> list = new ArrayList<>();
64+
if (!file.exists()) {
65+
return list;
66+
}
67+
File[] files = file.listFiles();
68+
for (File file2 : files) {
69+
if (file2.isDirectory()) {
70+
assert !file2.getName().contains(".");//添加断言用于判断
71+
ArrayList<Class<?>> arrayList = findClass(file2, packagename+"."+file2.getName());
72+
list.addAll(arrayList);
73+
}else if(file2.getName().endsWith(".class")){
74+
try {
75+
//保存的类文件不需要后缀.class
76+
list.add(Class.forName(packagename + '.' + file2.getName().substring(0,
77+
file2.getName().length()-6)));
78+
} catch (ClassNotFoundException e) {
79+
e.printStackTrace();
80+
}
81+
}
82+
}
83+
return list;
1984
}
2085
}

07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package io.kimmking.rpcfx.demo.provider;
22

3-
import com.alibaba.fastjson.JSON;
43
import io.kimmking.rpcfx.api.RpcfxRequest;
54
import io.kimmking.rpcfx.api.RpcfxResolver;
65
import io.kimmking.rpcfx.api.RpcfxResponse;
76
import io.kimmking.rpcfx.api.ServiceProviderDesc;
87
import io.kimmking.rpcfx.demo.api.OrderService;
98
import io.kimmking.rpcfx.demo.api.UserService;
109
import io.kimmking.rpcfx.server.RpcfxInvoker;
11-
import org.apache.curator.RetryPolicy;
1210
import org.apache.curator.framework.CuratorFramework;
13-
import org.apache.curator.framework.CuratorFrameworkFactory;
14-
import org.apache.curator.retry.ExponentialBackoffRetry;
1511
import org.apache.zookeeper.CreateMode;
1612
import org.springframework.beans.factory.annotation.Autowired;
1713
import org.springframework.boot.SpringApplication;
@@ -22,8 +18,6 @@
2218
import org.springframework.web.bind.annotation.RestController;
2319

2420
import java.net.InetAddress;
25-
import java.net.InterfaceAddress;
26-
import java.net.UnknownHostException;
2721

2822
@SpringBootApplication
2923
@RestController
@@ -93,13 +87,13 @@ public RpcfxResolver createResolver(){
9387
// annotation
9488

9589

96-
@Bean(name = "io.kimmking.rpcfx.demo.api.UserService")
97-
public UserService createUserService(){
90+
@Bean//(name = "io.kimmking.rpcfx.demo.api.UserService")
91+
public UserService userService(){
9892
return new UserServiceImpl();
9993
}
10094

101-
@Bean(name = "io.kimmking.rpcfx.demo.api.OrderService")
102-
public OrderService createOrderService(){
95+
@Bean//(name = "io.kimmking.rpcfx.demo.api.OrderService")
96+
public OrderService orderService(){
10397
return new OrderServiceImpl();
10498
}
10599

0 commit comments

Comments
 (0)