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 <>();
31+ // 1. 简单:从zk拿到服务提供的列表
32+ // 2. 挑战:监听zk的临时节点,根据事件更新这个list(注意,需要做个全局map保持每个服务的提供者List)
33+
34+ List <String > urls = router .route (invokers );
35+
36+ String url = loadBalance .select (urls ); // router, loadbalance
37+
38+ return (T ) create (serviceClass , url , filter );
39+
40+ }
41+
42+ public static <T > T create (final Class <T > serviceClass , final String url , Filter ... filters ) {
2543
2644 // 0. 替换动态代理 -> AOP
27- return (T ) Proxy .newProxyInstance (Rpcfx .class .getClassLoader (), new Class []{serviceClass }, new RpcfxInvocationHandler (serviceClass , url ));
45+ return (T ) Proxy .newProxyInstance (Rpcfx .class .getClassLoader (), new Class []{serviceClass }, new RpcfxInvocationHandler (serviceClass , url , filters ));
2846
2947 }
3048
@@ -34,9 +52,12 @@ public static class RpcfxInvocationHandler implements InvocationHandler {
3452
3553 private final Class <?> serviceClass ;
3654 private final String url ;
37- public <T > RpcfxInvocationHandler (Class <T > serviceClass , String url ) {
55+ private final Filter [] filters ;
56+
57+ public <T > RpcfxInvocationHandler (Class <T > serviceClass , String url , Filter ... filters ) {
3858 this .serviceClass = serviceClass ;
3959 this .url = url ;
60+ this .filters = filters ;
4061 }
4162
4263 // 可以尝试,自己去写对象序列化,二进制还是文本的,,,rpcfx是xml自定义序列化、反序列化,json: code.google.com/p/rpcfx
@@ -45,13 +66,28 @@ public <T> RpcfxInvocationHandler(Class<T> serviceClass, String url) {
4566
4667 @ Override
4768 public Object invoke (Object proxy , Method method , Object [] params ) throws Throwable {
69+
70+ // 加filter地方之二
71+ // mock == true, new Student("hubao");
72+
4873 RpcfxRequest request = new RpcfxRequest ();
4974 request .setServiceClass (this .serviceClass .getName ());
5075 request .setMethod (method .getName ());
5176 request .setParams (params );
5277
78+ if (null !=filters ) {
79+ for (Filter filter : filters ) {
80+ if (!filter .filter (request )) {
81+ return null ;
82+ }
83+ }
84+ }
85+
5386 RpcfxResponse response = post (request , url );
5487
88+ // 加filter地方之三
89+ // Student.setTeacher("cuijing");
90+
5591 // 这里判断response.status,处理异常
5692 // 考虑封装一个全局的RpcfxException
5793
0 commit comments