33
44import com .alibaba .fastjson .JSON ;
55import com .alibaba .fastjson .parser .ParserConfig ;
6- import io .kimmking .rpcfx .api .RpcfxRequest ;
7- import io .kimmking .rpcfx .api .RpcfxResponse ;
6+ import io .kimmking .rpcfx .api .*;
87import okhttp3 .MediaType ;
98import okhttp3 .OkHttpClient ;
109import okhttp3 .Request ;
1413import java .lang .reflect .InvocationHandler ;
1514import java .lang .reflect .Method ;
1615import java .lang .reflect .Proxy ;
16+ import java .util .ArrayList ;
17+ import java .util .List ;
1718
1819public final class Rpcfx {
1920
2021 static {
2122 ParserConfig .getGlobalInstance ().addAccept ("io.kimmking" );
2223 }
2324
24- public static <T > T create (final Class <T > serviceClass , final String url ) {
25+ public static <T , filters > T createFromRegistry (final Class <T > serviceClass , final String zkUrl , Router router , LoadBalancer loadBalance , Filter filter ) {
26+
27+ // 加filte之一
28+
29+ // curator Provider list from zk
30+ List <String > invokers = new ArrayList <>(); // 监听zk的临时节点,根据事件更新这个list
31+
32+ List <String > urls = router .route (invokers );
33+
34+ String url = loadBalance .select (urls ); // router, loadbalance
35+
36+ return (T ) create (serviceClass , url , filter );
37+
38+ }
39+
40+ public static <T > T create (final Class <T > serviceClass , final String url , Filter filter ) {
2541
2642 // 0. 替换动态代理 -> AOP
27- return (T ) Proxy .newProxyInstance (Rpcfx .class .getClassLoader (), new Class []{serviceClass }, new RpcfxInvocationHandler (serviceClass , url ));
43+ return (T ) Proxy .newProxyInstance (Rpcfx .class .getClassLoader (), new Class []{serviceClass }, new RpcfxInvocationHandler (serviceClass , url , filter ));
2844
2945 }
3046
@@ -34,9 +50,12 @@ public static class RpcfxInvocationHandler implements InvocationHandler {
3450
3551 private final Class <?> serviceClass ;
3652 private final String url ;
37- public <T > RpcfxInvocationHandler (Class <T > serviceClass , String url ) {
53+ private final Filter [] filters ;
54+
55+ public <T > RpcfxInvocationHandler (Class <T > serviceClass , String url , Filter ... filters ) {
3856 this .serviceClass = serviceClass ;
3957 this .url = url ;
58+ this .filters = filters ;
4059 }
4160
4261 // 可以尝试,自己去写对象序列化,二进制还是文本的,,,rpcfx是xml自定义序列化、反序列化,json: code.google.com/p/rpcfx
@@ -45,13 +64,26 @@ public <T> RpcfxInvocationHandler(Class<T> serviceClass, String url) {
4564
4665 @ Override
4766 public Object invoke (Object proxy , Method method , Object [] params ) throws Throwable {
67+
68+ // 加filter地方之二
69+ // mock == true, new Student("hubao");
70+
4871 RpcfxRequest request = new RpcfxRequest ();
4972 request .setServiceClass (this .serviceClass .getName ());
5073 request .setMethod (method .getName ());
5174 request .setParams (params );
5275
76+ for (Filter filter : filters ) {
77+ if (!filter .filter (request )) {
78+ return null ;
79+ }
80+ }
81+
5382 RpcfxResponse response = post (request , url );
5483
84+ // 加filter地方之三
85+ // Student.setTeacher("cuijing");
86+
5587 // 这里判断response.status,处理异常
5688 // 考虑封装一个全局的RpcfxException
5789
0 commit comments