AKKA路由策略的简单实现

        AKKA路由策略的简单实现

    AKKA的路由由router和众多的routees组成,router和routees都是actor,其它的理论知识可以参考AKKA的官方文档
    https://doc.akka.io/docs/akka/2.3.6/scala/routing.html#custom-router-scala
    废话少说,上干货
    
一.AKKA本地路由
    1.定义配置文件,以下是routing相关的部分
    akka {
        actor {
             deployment {
          /router1 {
            router =  round-robin-pool //可以指定其它的路由方式如:balancing-pool,random-group等
            nr-of-instances = 10
        }
      }
    }
  }
 
  2.定义routee对应的actore类型
  case class RouteeMsg(s: Int)

class WorkerRoutee extends Actor with ActorLogging{
    override def receive = {
    case RouteeMsg(s) =>
      log.info(s"${self.path.name}' msg=$s")
      val L2 = context.actorOf(Props[Cal1])
      L2 ! RouteeMsg(s)
    case _ =>
      log.info(s"${self.path.name}' ")
  }
}

class Cal1 extends Actor with ActorLogging{
  override def receive = {
    case RouteeMsg(s) =>
      log.info(s"${self.path.name}' msg=$s")
    case _ =>
      log.info(s"${self.path.name}' ")
  }
}

RouteeMsg是传递的消息,WorkerRoutee收到消息后创建了另外的一个actor Cal1,让Cal1去处理,WorkerRoutee可以直接处理消息不转发也可以

    3.创建router
    val system = ActorSystem("testRoute")
    val router = system.actorOf(FromConfig.props(Props[WorkerRoutee]), "router1")
    
    这里是在/user路径下创建的router,所以在application.conf中配置的是/router1,如果要在其它路径下创建router,/router1换成实际路径即可
    其它路径下创建时调用context.actorOf(FromConfig.props(Props[WorkerRoutee]), "router1")
    
    第3步完成就可以向router发送消息了
    
    
二.AKKA远程
  远程路由不能使用配置文件创建,需要在代码中添加actor地址
  1.在远端机器上申明作为routee的actor,声明代码同 “一.AKKA本地路由”中的第二步
 
  2.在创建router的机器上执行如下的代码:
    val system = ActorSystem("testRoute") //创建ActorSystem
    
    import akka.routing.RoundRobinPool
    
    //填写作为routee的actor的地址
      val addresses = Seq(
    Address("akka.tcp", "testRoute", "192.168.10.135", 10019),
    Address("akka.tcp", "CalServiceSlave", "192.168.10.134", 10014),   //远端地址
    AddressFromURIString("akka.tcp://testRoute@localhost:10019"))      //本地地址
         val router = system.actorOf(
    RemoteRouterConfig(RoundRobinPool(5), addresses).props(Props[WorkerRoutee]))

      for(i<- 1 to 10) {
        router ! RouteeMsg(i)
      }
      
      
        地址可以使用Address或AddressFromURIString声明
        RemoteRouterConfig(RoundRobinPool(5), addresses).props(Props[WorkerRoutee]))
        上面这句话表示创建轮询路由,有5个WorkerRoutee, 这5个在本地和远程创建,如远程3个,本地2个
        
        当然application.conf中要添加
        
        akka {
            actor {
            provider = "akka.remote.RemoteActorRefProvider"
        }
    }
    
    其他配置没有列出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Akka 远程调用的实现基于 Akka Remoting 模块。以下是一个简单的示例: 首先,需要在项目中添加 Akka Remoting 依赖: ```xml <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-remote_2.11</artifactId> <version>2.5.9</version> </dependency> ``` 然后,定义一个远程 Actor,它可以通过网络接收和处理消息: ```java import akka.actor.AbstractActor; import akka.event.Logging; import akka.event.LoggingAdapter; public class RemoteActor extends AbstractActor { private LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); @Override public Receive createReceive() { return receiveBuilder() .match(String.class, message -> { log.info("Received message: {}", message); getSender().tell("Hello from remote actor", getSelf()); }) .build(); } } ``` 接下来,在本地 Actor 中创建一个远程 Actor 的引用,并向其发送消息: ```java import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.pattern.Patterns; import scala.concurrent.Await; import scala.concurrent.duration.Duration; import java.util.concurrent.TimeUnit; public class LocalActor { public static void main(String[] args) throws Exception { ActorSystem system = ActorSystem.create("MySystem"); // 创建远程 Actor 的引用 ActorRef remoteActor = system.actorOf(Props.create(RemoteActor.class), "remoteActor"); // 向远程 Actor 发送消息,并等待其回复 String message = "Hello from local actor"; Object response = Patterns.ask(remoteActor, message, 5000).toCompletableFuture().get(5000, TimeUnit.MILLISECONDS); System.out.println("Received response: " + response); system.terminate(); } } ``` 在上面的代码中,我们使用 `Patterns.ask` 方法向远程 Actor 发送一条消息,并等待其回复。该方法返回一个 `Future` 对象,我们可以使用 `toCompletableFuture()` 方法将其转换为 Java 8 的 `CompletableFuture` 对象,从而方便地使用 `get` 方法等待结果。 以上就是一个简单Akka 远程调用的示例。在实际应用中,还需要配置 Akka Remoting 的一些参数,例如远程 Actor 的地址、端口等。具体配置方法可以参考 Akka 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值