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"
        }
    }
    
    其他配置没有列出

你可能感兴趣的:(akka)