-
Notifications
You must be signed in to change notification settings - Fork 69
commonrpc 解决行业痛点问题
当一个电商系统包括以下三个功能:存库,购物车,结算页三个功能,当购其中一个功能扛不住每分钟千万级或者亿级流量,这样问题就来了,一个功能不使用,所有功能不能使用,系统挂了。
解决办法: 把电商系统按照功能服务化,存储,购物车,结算页三个功能作为三个系统,每个系统独立提供服务,但是有依赖关系。这样一个功能挂了,其它系统可以降级保证大体上可以使用。其中依赖关系:结算页依赖购物车,购物车依赖库存。这样库 存系统是服务端提供服务,购物车是客户端,调用存储的服务,又是服务端为结算页提供服务,结算页就是客户端,调用购物车的服务。
commonrpc 编程思路
开发人员在开发项目,都会有接口和实现类,commonrpc 需要大家把这两个按照两个模块,实现类模块需要接口模块jar包,实现对应的方法。接口模块jar 包可以提供给其它系统,调用服务端的客户端系统。这样服务端系统和客户端系统共有同样接口模块jar 文件。
-------------------------------------tcp 用例代码------------------------------------------------------------------
1:服务端spring 配置文件
<commonrpc:registry id="rpcRegistry" port="10009" timeout="500" token="1122" procotolType="1" codecType="4" />
<!--filterRef 可以不配置 -->
<commonrpc:service id="IDemoService" interfacename="test.cross.plateform.rocketrpc.demo.service.IDemoService" ref="demoService" filterRef="demoRpcFilter" ></commonrpc:service>
<bean id="demoService" class="test.cross.plateform.rocketrpc.demo.service.impl.DemoServiceImpl"></bean>
<!--可以不配置,看业务情况 -->
<bean id="demoRpcFilter" class="test.cross.plateform.rocketrpc.demo.service.impl.DemoRpcFilter"></bean>
2:服务端业务接口代码(接口单独是一个工程,服务化最重要的一个步骤,接口单独一个工程,提供给服务端实现接口,又给客户端调用)
public interface IDemoService {
public String sayDemo(String params);
public String getParam(String params);
}
3:服务端业务实现类代码
public class DemoServiceImpl implements IDemoService {
private static final Log LOGGER = LogFactory
.getLog(DemoServiceImpl.class);
@Override
public String sayDemo(String params) {
// TODO Auto-generated method stub
//LOGGER.info("sayDemo params:"+params);
return "from server:"+params;
}
@Override
public String getParam(String params) {
// TODO Auto-generated method stub
//LOGGER.info("getParam params:"+params);
return "from server:"+params;
}
}
4:服务端业务测试代码
public class DeomoServiceTest {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("commonRpcServer.xml");
}
}
5:客户端 spring配置文件
<!--address 可以多个,这样服务端可以水平扩展 -->
<commonrpc:reference id="demoServiceClient" interfacename="test.cross.plateform.rocketrpc.demo.service.IDemoService" procotolType="1" codecType="4"timeout="500" address="127.0.0.1:10009,127.0.0.1:10008" token="1122" ></commonrpc:reference>
6:客户端测试实现代码(客户端引用服务端提供接口jar包)
public class DeomoClientTest { public static void main(String[] args) {
ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("CommonRpcClient.xml");
IDemoService demoService=(IDemoService) context.getBean("demoServiceClient");
long time1=System.currentTimeMillis();
for(int i=0;i<1;i++){
String result=demoService.sayDemo("okok");
System.out.println(result);
}
long end1=System.currentTimeMillis();
System.out.println("完成时间1:"+(end1-time1));
}
}
7: 开源中国 maven 库,需要引入jar ,maven 形式
<groupId>com.rpc</groupId>
<artifactId>commonrpc-tcp</artifactId>
<version>1.0</version>
----------------------------------http 代码-----------------------------------------------------------------------
1:服务端spring 配置文件
<commonrpc:registry id="rpcRegistry" port="10009" timeout="500"/>
<!-- httpType 为:POST,GET,PUT,HEAD,DELETE 大写--->
<!-- returnType 为:json,xml,html 小写--->
<!-- filterRef 使用方法同上--->
<commonrpc:service id="IDemoService" projectname="Demo" ref="demoService" httpType="POST" returnType="html"/>
<bean id="demoService" class="test.cross.plateform.service.impl.DemoServiceImpl"/>
2: 服务端业务代码:
public class DemoServiceImpl implements IDemoService {
/* (non-Javadoc)
* @see test.cross.plateform.service.IDemoService#sayDemo(java.lang.String, java.lang.String)
*/
@Override
public void sayDemo(String name, String age) {
// TODO Auto-generated method stub
System.out.println(name+"--------"+age);
}
/* (non-Javadoc)
* @see test.cross.plateform.service.IDemoService#sayDemoByParamsMap(java.util.Map)
*/
@Override
public void sayDemoByParamsMap(Map<String, Object> params) {
// TODO Auto-generated method stub
System.out.println(params);
}
@Override
public void sayDemoByParamsCollections(List<Object> params) {
// TODO Auto-generated method stub
System.out.println(params);
}
@Override
public void sayDemoByParamsArray(Object[] params) {
// TODO Auto-generated method stub
System.out.println(params);
}
@Override
public void sayDemoByParamsCollections(List<Object> params) {
// TODO Auto-generated method stub
System.out.println(params);
}
}
3:开源中国 maven 库,需要引入jar ,maven 形式
<groupId>com.rpc</groupId>
<artifactId>commonrpc-http</artifactId>
<version>1.0</version>
4: URL 访问以及参数
-
http://127.0.0.1:10009/Demo/demoServiceImpl/sayDemo 参数:{name:"11",age:"223"}
-
http://127.0.0.1:10009/Demo/demoServiceImpl/sayDemoByParamsMap 参数:{name:"11",age:"223"}
-
http://127.0.0.1:10009/Demo/demoServiceImpl/sayDemoByParamsCollections 参数:{name:"11",age:"223"}
-
http://127.0.0.1:10009/Demo/demoServiceImpl/sayDemoByParamsArray 参数:{name:"11",age:"223"}
-
http://127.0.0.1:10009/Demo/demoServiceImpl/sayDemoBean 参数:{name:"11",age:"223"}