文档章节

akka-rpc

引鸩怼孑
 引鸩怼孑
发布于 2015/09/24 23:08
字数 778
阅读 400
收藏 2

   最近一直在准备构建一个rpc服务,为避免重复造轮子,在择取的过程中发现了很多优秀的rpc架构。

1:common-rpc:http://my.oschina.net/liubingsmile/blog/387154

已经足够成熟。

2:基于akka的rpc

http://my.oschina.net/FengJ/blog/268387

现在仅仅对其初始化的时候 做小小的改动,方便使用。

原有代码对服务的注册:

// Server 加入发布的服务 
Map < Class <?>, Object > beans = new HashMap < Class <?>, Object >(); 
beans . put ( ExampleInterface . class , new ExampleInterfaceImpl ()); 
这样服务多了,很不方便。

   现在选择基于spring的其中一种方式,略微改动,主要是基于Java的@interface注解,加上spring的bean工厂。原理比较简单。

 首先创建一个spring的配置文件:

rpcServerContext.xml:

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
       <!--service-->
<context:component-scan base-package="com.topteam.example.service.impl"/>
<bean id="rpcServer" class="com.topteam.rpc.anotaion.RpcServer"></bean>
</beans>

RpcServer :扫描注解接口,进行akka-rpc服务映射的初始化

public class RpcServer implements ApplicationContextAware, InitializingBean 
{
    /**
     * 存放 服务名 与 服务对象 之间的映射关系
     */
    private Map<Class<?>, Object> handlerMap = new HashMap<Class<?>, Object>();
    
public void setApplicationContext(ApplicationContext ctx) throws BeansException
    {
        // 扫描带有 RpcService 注解的类并初始化 handlerMap 对象
        Map<String, Object> serviceBeanMap = ctx.getBeansWithAnnotation(RpcService.class);
        if (MapUtils.isNotEmpty(serviceBeanMap))
        {
            for (Object serviceBean : serviceBeanMap.values()) 
            {
                RpcService rpcService = serviceBean.getClass().getAnnotation(RpcService.class);
                handlerMap.put(rpcService.value(),serviceBean);
            }
            this.setHandlerMap(handlerMap);
        }
    }


public void afterPropertiesSet() throws Exception 
{
// TODO Auto-generated method stub
}

public Map<Class<?>, Object> getHandlerMap() 
    {
return handlerMap;
}


public void setHandlerMap(Map<Class<?>, Object> handlerMap)
{
this.handlerMap = handlerMap;
}
}

RpcBootstrap:用来扫描

public class RpcBootstrap 
{
private ClassPathXmlApplicationContext application;
public void init()
{
System.out.println("*************__init__************");
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("rpcServerContext.xml");
this.application = application;
}

public void close() 
{
System.out.println("**************__close__***********");
}


public ClassPathXmlApplicationContext getApplication() 
{
return application;
}


public void setApplication(ClassPathXmlApplicationContext application) 
{
this.application = application;
}
}


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface RpcService 
{
    /**
     * 服务接口类
     */
    Class<?> value();
}


扫描注解的接口:

public class RpcServer implements ApplicationContextAware, InitializingBean 
{
    /**
     * 存放 服务名 与 服务对象 之间的映射关系
     */
    private Map<Class<?>, Object> handlerMap = new HashMap<Class<?>, Object>();
    
public void setApplicationContext(ApplicationContext ctx) throws BeansException
    {
        // 扫描带有 RpcService 注解的类并初始化 handlerMap 对象
        Map<String, Object> serviceBeanMap = ctx.getBeansWithAnnotation(RpcService.class);
        if (MapUtils.isNotEmpty(serviceBeanMap))
        {
            for (Object serviceBean : serviceBeanMap.values()) 
            {
                RpcService rpcService = serviceBean.getClass().getAnnotation(RpcService.class);
                handlerMap.put(rpcService.value(),serviceBean);
            }
            this.setHandlerMap(handlerMap);
        }
    }


public void afterPropertiesSet() throws Exception 
{
// TODO Auto-generated method stub
}

public Map<Class<?>, Object> getHandlerMap() 
    {
return handlerMap;
}


public void setHandlerMap(Map<Class<?>, Object> handlerMap)
{
this.handlerMap = handlerMap;
}
}

接口实现:

@RpcService(ExampleInterface.class)
public class ExampleInterfaceImpl implements ExampleInterface 
{
/**

*/
private static final long serialVersionUID = 1L;


public String sayHello(String name)
{
System.out.println("Be Called !");
ExampleOtherBean bean = new ExampleOtherBean(name);
return "Hello " + bean.toString();
}
}


改造原有的spring主上下文:

spring-context.xml:

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">


    <context:component-scan base-package="com.topteam.rpc.anotaion"/>
    <bean id="bootstrap" class="com.topteam.rpc.bootstrap.RpcBootstrap" init-method="init" destroy-method="close"></bean>
    
    <bean id="akkaRpcServer" class="com.topteam.rpc.server.AkkaRpcServer" init-method="start" destroy-method="close"></bean>
<bean id="akkaRpcClient" class="com.topteam.rpc.client.AkkaRpcClientFactory" scope="singleton"></bean>
</beans>



测试:

public class StringSupportTest 
{
public static void main(String[] args)
{
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");

AkkaRpcServer akkaRpcServer = (AkkaRpcServer)applicationContext.getBean("akkaRpcServer");

final Config config = ConfigFactory
.parseString("akka.remote.netty.tcp.port=" + 2551)
.withFallback(ConfigFactory.parseString("akka.cluster.roles = [RpcServer]"))
.withFallback(ConfigFactory.load());
ActorSystem system = ActorSystem.create("EsbSystem", config);

// Server 加入发布的服务
//Map<Class<?>, Object> beans = new HashMap<Class<?>, Object>();
        //beans.put(ExampleInterface.class, new ExampleInterfaceImpl());

/**
* 服务创建actors
*/
System.out.println(akkaRpcServer.getServices());
system.actorOf(Props.create(RpcServerActor.class, akkaRpcServer.getServices()), "rpcServer");


// int count = 10000;
//
// AkkaRpcClient client = AkkaRpcClient.getInstance();
// long start = System.currentTimeMillis();
//
// ExampleInterface example = client.getBean(ExampleInterface.class);
//
// for(int i = 0; i < count; i++)
// {
// System.out.println(example.sayHello("rpc_" + i));
// }
//
// long time = System.currentTimeMillis() - start;
// System.out.println("time :" + time);


}

/*
* private ApplicationContext applicationContext =new ClassPathXmlApplicationContext("classpath:spring-context.xml");
* @Test
public void akkaRpcServerSpringInjectTest()
{
AkkaRpcServer akkaRpcServer = applicationContext.getBean(AkkaRpcServer.class);
Assert.assertNotNull(akkaRpcServer);
}


@Test
public void akkaRpcClientFactoryInjectTest()
{
AkkaRpcClientFactory akkaRpcServer = applicationContext.getBean(AkkaRpcClientFactory.class);
Assert.assertNotNull(akkaRpcServer.getClient());
}*/
}




© 著作权归作者所有

引鸩怼孑
粉丝 44
博文 207
码字总数 16947
作品 0
南京
项目经理
私信 提问
akka-rpc(基于akka的rpc实现)

akka-rpc(基于akka的rpc的实现) 代码:http://git.oschina.net/for-1988/Simples 目前的工作在基于akka(java)实现数据服务总线,Akka 2.3中提供了 Cluster Sharing(分片集群)和Persisten...

ForEleven
2014/05/23
8.7K
9
Spark2.1.0之内置RPC框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/80799622 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通、用户...

泰山不老生
2018/06/27
0
0
Zeroc ICE或者说rpc 其实说是上个时代的东西也不为过 否则dubbo actor的akka为什么会流行

Zeroc ICE或者说rpc 其实说是上个时代的东西也不为过 否则dubbo actor的akka为什么会流行 dubbo最快的模式 dubbo中心节点只是提供服务节点信息 你自己去连接那个节点 直连 有可能比rpc桥接多...

雷兽
2016/10/19
2.5K
1
Play! Akka Flume实现的完整数据收集

前言 现如今,大数据如火如荼。针对用户行为,用户喜好等后续大数据分析也是十分火热。这个小项目实现了后台数据收集的一系列完整流程。 项目总体流程以及用到的技术 Play ! 作为web服务器,...

blue1110
2015/01/27
2.3K
2
Spring与Akka的集成

概述 近年来随着Spark的火热,Spark本身使用的开发语言Scala、用到的分布式内存文件系统Tachyon(现已更名为Alluxio)以及基于Actor并发编程模型的Akka都引起了大家的注意。了解过Akka或者A...

beliefer
2017/01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
4
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
5
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部