小黄鸡的客户端-创建客户端的 Actor | 学习笔记

简介: 快速学习小黄鸡的客户端-创建客户端的 Actor

开发者学堂课程【Scala 核心编程 - 进阶小黄鸡的客户端-创建客户端的 Actor学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9121


小黄鸡的客户端-创建客户端的 Actor


内容介绍

一、课前指导

二、创建客户端的 Actor


一、课前指导

技术的学习没有难度,只要肯花时间去学都能学会。但学技术需要一种分析能力,才能在未来实操时找到优化点,如果不知道如何优化,可以找一下自身的问题,如果基本原理都不知道的话是无法去做到更好的优化的,例如不知如何优化时盲目地优化带宽、数据库,增加许多读写分离以及服务器等都无法实现优化,结果发现问题出现在磁盘。原因是上传头像图片时没有分目录存放,整个放在一个目录下,就会在注册或登录时去获取头像的时候卡住。好的程序员就像医生,可以精准发现问题所在,对症下药。


二、创建客户端的 Actor

1.写入代码

在 client 中建立一个 CustomerActor

package com.atguigu.akka.yellowchicken.client

import akka.actor.Actor{

override def receive:Receive={

}

//主程序-入口

object CustomerActor extends App{

//此处的 CustomerActor 和上一次出现的CustomerActor 没有

任何关系,此处的 CustomerActor 纯粹是一个主程序的入口。根

据分析,需要创建 ActorSystem 以及 创建客户 Actor 。

val host = "127.0.0.1" //服务端 IP 地址

val port = 9999

//创建 config 对象,指定协议类型,监听的 IP 和端口

val config = ConfigFac tory. parseString(

s”””

|akka.actor.provider="akka.remote . RemoteActorRefProvider"

|akka . remote . netty. tcp. hostname=$host

|akka. remote . netty . tcp. port=$port

""" .stripMargin)

//我们需要创建的代码和以上代码前面的 host 和 port 与服务器端是一样的,不一样之处在于,需要创建的代码要获取到服务器端的地址

2.引入模板

object CustomerActor extends App {

val (host, port, serverHost, serverPort) = ("127.0.0.1", 9990,

127.0.0.1", 9999)

val config = ConfigFactory.parseString(

S”””

|akka.actor.provider="akka . remote. RemoteActorRefProvider"

|akka. remote . netty. tcp. hostname=$host

|akka. remote . netty. tcp. port=$port

“”” .stripMargin)

//127.0.0.1给到 host ,9990给到 port (host 和 port 代表客户端,服务器端的则用 serverHostserverPort 来表示),为了方便观察,改成以下代码

object CustomerActor extends App {

val (clientHost, clientPort, serverHost, serverPort) = ("127.0.0.1", 9990,127.0.0.1", 9999)

val config = ConfigFactory.parseString(

S”””

|akka.actor.provider="akka . remote. RemoteActorRefProvider"

|akka. remote . netty. tcp. hostname=$clientPost

|akka. remote . netty. tcp. port=$clientPort

“”” .stripMargin)

3.striMargin

(1)含义

默认按照给定的标准进行分割

(2)测试

写一个 Test 的文件

object CustomerActor extends App {

val (clientHost, clientPort, serverHost, serverPort) = ("127.0.0.1", 9990,127.0.0.1", 9999)

val config = ConfigFactory.parseString(

S”””

|akka.actor.provider="akka . remote. RemoteActorRefProvider"

|akka. remote . netty. tcp. hostname=$clientPost

|akka. remote . netty. tcp. port=$clientPort

“”” .stripMargin)

//将 val config = ConfigFactory.parseString(直接换成 println(

因为没有用到“127.0.0.1”,9999这两个用量,所以直接拿掉,变成

object CustomerActor extends App {

val (clientHost, clientPort, serverHost, serverPort) = ("127.0.0.1", 9990)

println(

S”””

|akka.actor.provider="akka . remote. RemoteActorRefProvider"

|akka. remote . netty. tcp. hostname=$clientPost

|akka. remote . netty. tcp. port=$clientPort

“”” .stripMargin)

//将 stripMargin 去掉,直接输出发现代码出现问题

|akka.actor.provider="akka.remote.RemoteActorRefProvider"

|akka.remote.netty.tcp.hostname=127.0.0.1

|akka.remote.netty.tcp.port=9990

Process finished with exit code 0

//加上 stripMargin 再运行,变成以下代码

akka.actor.provider="akka.remote.RemoteActorRefProvider"

akka.remote.netty.tcp.hostname=127.0.0.1

akka.remote.netty.tcp.port=9990

Process finished with exit code 0

//加上 stripMargin 后多了隐式转换,边界被清掉,后面可以带一个参数进行指定分割

“””.stripMargin(#)

//这样写代表按照#进行分割,默认则是按照斜杠

4.回到 client 端

//创建 ActorSystem

val clientActorSyetem=ActorSystem(client,config)  

//创建CustomerActor的实例和引用,此时必须持有

YellowChickenActor 的引用才能将消息发出去,需要构建对象的

方式来解决问题。因为 YellowChickenActor 的引用在

CustomerActor 中才能发消息。

class CustomerActor extends Actor{

//定义一个 YellowChickenServerRef

var serverActorRef:ActorSelection=

//在 actor 中有一个叫做 PreStart 的方法,会在发第一个消息时

被触发,即 Actor 运行前执行,类似于 Java 中首先实行的构造器。

//在 akka 的开发中,通常将初始化的工作放在 preStart 方法中

override def preStart():Unit=serverActorRef=context.

//context 方法下找到

actorSelection(path:ActorPath) ActorSelection,即可以传入一个 ActorPath (例如在网站请求一个图片,图片本身有地址,图片的地址就是它的 url。复制图片地址后会发现未加过密的链接,如果只请求图片,回车就会出现图片)

就像找 Actor 时,前期是协议,后面是它的主机名,在请求 Actor 时,前面是 IP 地址,后面的端口默认是80,再后面就是在远程的 ActorSystem 里面的信息。

接下来需要找到的是 YellowChickenActor 的路径,在刚才的运行过程中,可以看到它的地址是.tcp://Server@127.0.0.1:9999,将地址粘贴到以下代码

serverActorRef=context.actorSelection(akka.tcp://Server@127.0.0.1:9999)

//server 是先前小黄鸡的位置取的名字,如果将名字换掉,则打出的地址的名字就是换掉的名字

//此时就有了指定的 IP 地址和端口,通过使用构造器上传

class CustomerActor(serverHost,String,serverPort:Int) extends Actor{

//将代码中的信息交换后得到

serverActorRef=context.actorSelection(akka.tcp://Server@${serverHost}:${serverPort})

//因为服务器是一整个的 ActorSystem,它里面可能有很多的 Actor,不仅仅有小黄鸡,这样的话,只找到服务器,没有找到小黄鸡的 server 是不行的(就像在找图片时的路径问题),此时只需要在代码中加入 user

serverActorRef=context.actorSelection(akka.tcp://Server@${serverHost}:${serverPort}/user/YellowChickenServer)

//akka 是前期的网络通讯协议,Server 是ActorSystem的名称,serverHost 是主机,user 的后面是找到的远程主机的具体 actor

override def receive:Receive={

case “start”=>println(start, 客户端运行,可以咨询问题”)

//创建 CustomerActor 的实例和引用

val

customerActorRef:ActorRef=clientActorSystem.actorOf(Props(new

CustomerActor(serverHost,serverPort)),CustomerActor)

//启动customerRef /也可以理解启动Actor

customerActorRef!“start”

//运行一下观察启动和创建是否成功。为证明是否被执行,在代码处输入以下文字

override def preStart():Unit={

println(preStart()执行)

serverActorRef=context.actorSelection(akka.tcp://Server@${serverHost}:${serverPort}/user/YellowChickenServer)

println(“serverActorRef=”+serverActorRef)

5.整体运行

下一个目标是整体运行一下,找到 close all ,梳理思维路线。第一点是找到客户端服务器端是否启动,serverActorRef 是否拿到(核心点)

(1)启动小黄鸡

最下方显示“小黄鸡客服开始工作了...”表示没有问题

(2)运行 customerActor

显示 prestart ()执行

serverActorRef=ActorSelection(Anchor(akka.tcp://Server@127.0.0.1:9999/),Path (/user/YellowChickenServer)

start 客户端运行,可以咨询问题

相关文章
|
前端开发 Java 数据库连接
JavaWeb:登录注册功能实现
JavaWeb 登录注册是一种常见的网站开发功能,使用 Java 编程语言和 Web 技术来实现用户注册和登录功能
419 3
|
人工智能 大数据 云计算
【AI系统】AI 发展驱动力
本文介绍了阿里云在2023年云栖大会上发布的多项新技术和产品,涵盖云计算、大数据、人工智能等领域,展示了阿里云最新的技术成果和行业解决方案,助力企业数字化转型。
|
机器学习/深度学习 计算机视觉 网络架构
为什么卷积现在不火了:CNN研究热度降温的深层原因分析
纵观近年的顶会论文和研究热点,我们不得不承认一个现实:CNN相关的研究论文正在减少,曾经的"主角"似乎正逐渐淡出研究者的视野。
340 11
为什么卷积现在不火了:CNN研究热度降温的深层原因分析
|
机器学习/深度学习 人工智能 算法
解决方案评测:通义万相 AI 绘画创作
通义万相 AI 绘画创作工具在功能、使用体验等方面表现出色,为用户提供了一种便捷、高效的绘画创作方式。虽然存在一些不足之处,但随着技术的不断发展和优化,相信其性能和表现会不断提升。对于艺术家、设计师、创意工作者以及普通爱好者来说,通义万相都是一款值得尝试和探索的 AI 绘画工具。
1048 4
解决方案评测:通义万相 AI 绘画创作
|
消息中间件 分布式计算 Hadoop
利用Hadoop进行实时数据分析的挑战与解决方案
【8月更文第28天】随着大数据技术的快速发展,企业和组织面临着越来越复杂的实时数据处理需求。Hadoop 作为一种分布式存储和处理大数据的框架,虽然擅长于批处理任务,但在处理实时数据流时存在一定的局限性。为了克服这些限制,Hadoop 经常与其他实时处理框架(如 Apache Kafka 和 Apache Storm)结合使用。本文将探讨如何利用 Hadoop 结合 Kafka 和 Storm 实现近实时的数据处理,并提供相关的代码示例。
974 0
|
JavaScript 测试技术 iOS开发
vue element plus Icon 图标
vue element plus Icon 图标
6804 0
|
前端开发 Java 关系型数据库
创新推出 | Serverless 调试大杀器:端云联调
端云联调功能,不仅提升了 Serverless 应用的开发者的开发效率并且带来了良好的开发体验;让本地开发环境突破网络限制,真正实现和云端环境融为一体,一文带你了解,端云联调功能是如何解决应用调试难题的。
创新推出 | Serverless 调试大杀器:端云联调
|
编译器
MSP430F5529学习笔记(3)——实现LED闪烁和呼吸灯
MSP430F5529学习笔记(3)——实现LED闪烁和呼吸灯
699 0
|
存储 Java
【内存模型】
【内存模型】
131 0
【内存模型】
|
C语言
【C语言】指针,结构体,链表
【C语言】指针,结构体,链表