RPC process details
Implementation content
- json serialization
- zookeeper implements service registration on the server side and service discovery and load balancing on the client side
- Automatically scan the interface provided by the server and register it in zookeeper
- Automatically generate client dynamic proxy objects
- socket communication
Module description
- Native core: public package: annotation, exception definition, communication protocol, serialization, zookeeper client encapsulation, package scanning, configuration loading and other tool classes
- Native customer: the module to be introduced by the caller to automatically generate the client dynamic proxy object, service discovery and load balancing of zk, and communication implementation
- Native provider: the module that the service provider needs to introduce, which implements the interface client request and processing, zk service registration
- Native interface: the definition of the interface to provide external services
- Shawn test provider: provider demo
- Shawn test customer: caller demo
To configure
provider configuration
Configure the naive-rpc.properties file
scanPackage=com.shawntime.rpc.api servicePort=11001
- scanPackage: package scanning path, automatically creating interface dynamic agent class under package path
- servicePort: monitoring port number of the server
Configure spring
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="com.shawntime"/> <context:annotation-config/> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- Configure message formatting --> <bean id="jsonFormatter" class="com.shawntime.rpc.core.serialize.json.JsonFormatter" /> <bean id="jsonParse" class="com.shawntime.rpc.core.serialize.json.JsonParse" /> <!-- Configure service class, use socket Processing request --> <bean id="rpcProvider" class="com.shawntime.rpc.provider.service.socket.SocketRpcProvider"> <property name="formatter" ref="jsonFormatter" /> <property name="parse" ref="jsonParse" /> </bean> <!-- To configure zk Server cluster information for service registration --> <bean id="zookeeperClient" class="com.shawntime.rpc.core.zookeeper.ZookeeperClient"> <constructor-arg value="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183" /> </bean> </beans>
customer configuration
Configure the naive-rpc.properties file
scanPackage=com.shawntime.rpc.api
- scanPackage: package scanning path, automatically creating interface dynamic agent class under package path
Configure spring
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="com.shawntime"/> <context:annotation-config/> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- Configure message formatting --> <bean id="jsonFormatter" class="com.shawntime.rpc.core.serialize.json.JsonFormatter" /> <bean id="jsonParse" class="com.shawntime.rpc.core.serialize.json.JsonParse" /> <!-- Client processing configuration --> <bean id="socketInvoke" class="com.shawntime.rpc.customer.invoke.socket.SocketInvoke" /> <bean id="beanNameGenerator" class="org.springframework.context.annotation.AnnotationBeanNameGenerator" /> <!-- Client dynamic agent registration class --> <bean id="customBeanDefinitionRegistryPostProcessor" class="com.shawntime.rpc.customer.config.CustomBeanDefinitionRegistryPostProcessor"> <property name="invoke" ref="socketInvoke" /> <property name="formatter" ref="jsonFormatter" /> <property name="parse" ref="jsonParse" /> <property name="beanNameGenerator" ref="beanNameGenerator" /> <property name="serviceFindManager" ref="serviceFindManager" /> </bean> <!-- Service discovery and load balancing --> <bean id="serviceFindManager" class="com.shawntime.rpc.customer.ServiceFindManager"> <property name="zookeeperClient" ref="zookeeperClient" /> </bean> <!-- To configure zk Server cluster information for service registration --> <bean id="zookeeperClient" class="com.shawntime.rpc.core.zookeeper.ZookeeperClient"> <constructor-arg value="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183" /> </bean> </beans>
Demo
- Interface definition, annotated with RpcService
@RpcService public interface IUserService { UserOut getUserInfo(UserIn userIn, Integer level); void addUserProvince(ProvinceIn in); }
- provider
package com.shawntime.test.provider; import com.shawntime.rpc.api.IUserService; import com.shawntime.rpc.api.contract.ProvinceIn; import com.shawntime.rpc.api.contract.UserIn; import com.shawntime.rpc.api.contract.UserOut; import org.springframework.stereotype.Component; @Component public class UserService implements IUserService { public UserOut getUserInfo(UserIn userIn, Integer level) { UserOut userOut = new UserOut(); if (level > 0) { userOut.setUserId(1); userOut.setAddress("Wuhu, Anhui"); userOut.setAge(18); userOut.setUserName(userIn.getUserName()); } else { userOut.setUserId(2); userOut.setAddress("Baoding, Hebei"); userOut.setAge(19); userOut.setUserName(userIn.getUserName()); } return userOut; } public void addUserProvince(ProvinceIn provinceIn) { System.out.println(provinceIn); } }
- Caller
@Component public class LoginService implements ILoginService { @Resource private IUserService userService; public boolean login(String userName, String password, Integer level) { UserIn userIn = new UserIn(); userIn.setUserName(userName); userIn.setPassword(password); UserOut userInfo = userService.getUserInfo(userIn, level); System.out.println("userId:" + userInfo.getUserId() + ", age:" + userInfo.getAge() + ", address:" + userInfo.getAddress()); return userInfo != null; } public int addUserProvince(ProvinceIn in) { userService.addUserProvince(in); return 1; } }