CommonRpc 框架

  •   CommonRpc 总体介绍

            还在羡慕BAT等公司的大流量的架构吗?让你的java系统引用解耦,互相独立,commonrpc 就可以办到。commonrpc 是一个以netty 传输协议框架为基础, 自定义 spring shcema标签的rpc框架,不侵入任何业务代码,插件模式,即插即用;一个高性能分布式rpc框架,支持tcp,http协议,扩展性强。

  •  CommonRpc 功能
    1. 支持Tcp 协议,应用协议接口API化,扩展性强,开发人员可以根据项目业务需求自定义开发应用协议。
    2. 支持 restful 模式的 http 协议,通过配置文件模式,就可以提供HTTP请求,在高并发的系统,不受tomcat 等 http 服务器的性能影响,提供高性能的http 服务。
    3. 提供注册中心以及服务治理功能,通过注册中心,可以自动发现服务,以及应用服务端宕掉后,注册中心自动摘掉这个服务端,客户端不影响使用。
    4. 提供服务端拦截器功能
    5. 支持负载均衡,分布式集群功能

    6. 支持流量漂移,降级,限流 可扩展功能

  • CommonRpc 工作原理图  

image

  • CommonRpc 解决问题场景
    1. 当一个电商系统包括以下三个功能:存库,购物车,结算页三个功能,当其中一个功能扛不住每分钟千万级或者亿级流量,这样问题就来了,一个功能不使用,所有功能不能使用,系统挂了。

      解决办法: 把电商系统按照功能服务化,存储,购物车,结算页三个功能作为三个系统,每个系统独立提供服务,但是有依赖关系。这样一个功能挂了,其它系统可以降级保证大体上可以使用。其中依赖关系:结算页依赖购物车,购物车依赖库存。这样库 存系统是服务端提供服务,购物车是客户端,调用存储的服务,又是服务端为结算页提供服务,结算页就是客户端,调用购物车的服务。

    2. 当一个电商系统,多多种客户端,比如PC端,手机端,微信端等?怎么样做到统一架构呢?CommonRpc 可以让你的java 应用作为服务端提供服务,PC端,手机端,微信端只是作为客户端,提供页面功能,数据统一从java 服务端调用。

  • CommonRpc 压测数据

单台机器 配置 8G内存 ,I5 CPU  500G 硬盘,压测数据没有达到最大值,机器不住  压力测试工具 Loadrunner

方法名称:IDemoService.sayDemo

压测数据如下:

    系统最大处理能力(笔/秒)  60,325

    并发用户数(个)  1000 个

    平均响应时间(ms) 33ms

  • CommonRpc 代码实例学习
    •   开发IDE 以及打包工具

      开发工具IDE:eclise

      打包工具:maven

      eclise 与maven 集成方法:http://www.iteye.com/topic/1123225

  • Tcp 版本开发

              服务端 spring 配置文件

                <!--redis 注册中心地址 -->

                <commonrpc:application id="rpcRegistryApplication" address="127.0.0.1:6379"></commonrpc:application>

                <commonrpc:registry id="rpcRegistry" port="10009" timeout="500" token="1122" procotolType="1" codecType="4"         group="demo"></commonrpc:registry>  
                <commonrpc:service id="IDemoService"  interfacename="test.cross.plateform.rocketrpc.demo.service.IDemoService" ref="demoService" ></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>


                注意事项

             <!--filterRef 可以不配置  -->  
               <!—group  根据项目环境不同或者项目不同,名字不一样,不能相同,否则后台系统报错  -->
               <!—codecType  对应值请查找 CommonRpcCodecs类  -->
              

          服务端业务接口类

                     public interface IDemoService {
   
                              public String sayDemo(String params);
     
                             public String getParam(String params);
                    }

             注意事项

               服务端业务接口是单独一个功能,只要其它系统调用这个服务端 业务接口的实现类,比如引入业务接口工程

        服务端实现类

                 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;
                            }

                     }

                服务端业务测试代码

                          public class DeomoServiceTest {
   
                                     public static void main(String[] args) {
                                                 new ClassPathXmlApplicationContext("commonRpcServer.xml");
                                               }
                                 }

              客户端 spring配置文件

                     <!--redis 注册中心地址 跟服务端一直 -->
                    <commonrpc:application id="rpcRegistryApplicationClient" address="127.0.0.1:6379"></commonrpc:application>
   
                    <commonrpc:reference id="demoServiceClient"  interfacename="test.cross.plateform.rocketrpc.demo.service.IDemoService"  procotolType="1" codecType="4" timeout="500" token="1122" group="demo"/>

                  注意事项

                  <!—group  跟服务端一直 –>
                     <!—codecType 对应值请查找 CommonRpcCodecs类 –>

               客户端测试类

                   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));
                    } 

               }

             注意事项

             客户端引入服务端提供的jar 工程

  • Http 版本

             服务端spring 配置文件

                   <commonrpc:registry id="rpcRegistry" port="10009" timeout="500"></commonrpc:registry>
   
                   <commonrpc:service id="IDemoService"  projectname="Demo" ref="demoService" httpType="POST" returnType="html"/>
   
                   <bean id="demoService" class="test.cross.plateform.service.impl.DemoServiceImpl"></bean>

             服务端业务代码

              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);
                  }

                        }

                  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"}

 

 

你可能感兴趣的:(CommonRpc 框架)