Skip to content

steakliu/Lp-Rpc

Repository files navigation

Lp-Rpc

版本 :1.0.0

技术栈 :Netty Zookeeper Kryo Spring

实现思想 :本rpc在服务端启动时候,获取标注有@LpService的类,表示此类是一个服务,需要注册到zk注册中心,此注解有group和version两个属性,group表示组,为了区分存在同名服务,version表示接口的版本,在zk注册中心根节点名称为lpRpc,是一个持久化节点,而子节点则是服务,是临时节点,当服务端关闭以后,相应的服务则会自动删除,服务名格式为,服service:group:version,如: UserService:business:1.0.0 ,服务节点存储类路径,远程服务地址,格式为:host:port:className,如 192.168.0.1:8080:com.lp.rpc.service.impl.UserServiceImpl ,服务端进行服务注册以后,客户端启动去zk注册中心拿到所有服务,然后存在本地缓存中,然后监听服务端服务的变化,实时更新本地缓存,调用服务时首先在本地缓存中查找是否存在服务,存在的话直接发起远程调用,不存在则去注册中心查找服务,客户端通过反射获取到类信息以后发起远程调用,然后经过序列化等一系列操作,最终返回调用结果。

说明 :此版本是第一个版本,比较简陋,后续会陆续进行更新 😘

调用示例: server

        <dependency>
            <groupId>com.lp</groupId>
            <artifactId>Lp-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lp</groupId>
            <artifactId>Lp-registry</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        version和business不是必选,如果指定了,name客户端在发起请求的时候也需要指定,不然找不到服务

        @LpService(version = "1.0.0" , group = "business")
        public class HelloServiceImpl implements HelloService {
            @Override
            public String sayHello() {
                return "business group";
            }
        }
        public class LpServerBootstrap {
        public static void main(String[] args) {
              new ClassPathXmlApplicationContext("spring.xml");
            }
        }

client client端必须引入以下几个包,Lp-client客户端代理,Lp-registry服务发现,Lp-common一些依赖。

        <dependency>
            <groupId>com.lp</groupId>
            <artifactId>Lp-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lp</groupId>
            <artifactId>Lp-registry</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lp</groupId>
            <artifactId>Lp-client</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        public class LpClientBootstrap {
            public static void main(String[] args) throws NoSuchFieldException {
                ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
                HelloService helloService = LpClientProxy.createProxy(HelloService.class, "basic", "1.0.0");
                System.out.println(helloService.sayHello());
            }
        }

版本更新日志: