大家好,感谢邀请,今天来为大家分享一下nodejs手机网站源码分享的问题,以及和用nodejs开发的大型网站的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
Dapr是一个可移植的、事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架。Dapr确保开发人员专注于编写业务逻辑,不必分神解决分布式系统难题,从而显著提高了生产力。Dapr降低了构建微服务架构类现代云原生应用的门槛。
系列
Dapr与NestJs,实战编写一个Pub&Sub装饰器NodeJS基于Dapr构建云原生微服务应用,从0到1快速上手指南本地使用DockerCompose与Nestjs快速构建基于Dapr的Redis发布/订阅分布式应用
JavaScript
用于在JavaScript和TypeScript中构建Dapr应用程序的客户端库。该客户端抽象了公共DaprAPI,例如服务到服务调用、状态管理、发布/订阅、机密等,并为构建应用程序提供了一个简单、直观的API。
安装
要开始使用JavascriptSDK,请从NPM安装DaprJavaScriptSDK包:
npminstall–save@dapr/dapr\n
??dapr-client现在已弃用。请参阅34;@dapr/dapr&34;127.0.0.1&34;3500&34;127.0.0.1&34;50051&34;@dapr/dapr&Usingdaprrun\ndaprrun–app-idexample-sdk–app-protocolhttp–npmrunstart\n\n34;@dapr/dapr&Usingdaprrun\ndaprrun–app-idexample-sdk–app-protocolgrpc–npmrunstart\n\n34;@dapr/dapr&34;127.0.0.1&34;3500&34;my-app-id&34;say-hello&34;world&34;@dapr/dapr&34;127.0.0.1&34;3500&34;my-state-store-name&34;first-key-name&34;hello&34;second-key-name&34;world&34;first-key-name&34;first-key-name&34;second-key-name&34;upsert&34;first-key-name&34;new-data&34;delete&34;second-key-name&34;first-key-name&34;@dapr/dapr&34;state-mongodb&34;person.org&34;DevOps&34;AND&34;EQ&34;person.org&34;Finance&34;IN&34;state&34;CA&34;WA&34;state&34;DESC&34;@dapr/dapr&34;127.0.0.1&34;3500&34;my-pubsub-name&34;topic-a&34;world&34;@dapr/dapr&34;127.0.0.1&34;3500&34;127.0.0.1&34;50051&34;\n\nasyncfunctionstart(){\nconstserver=newDaprServer(serverHost,serverPort,daprHost,daprPort);\n\nconstpubSubName=&34;;\nconsttopic=&34;;\n\n//ConfigureSubscriberforaTopic\nawaitserver.pubsub.subscribe(pubSubName,topic,async(data:any)=>console.log(`GotData:${JSON.stringify(data)}`));\n\nawaitserver.start();\n}\n
有关状态操作的完整列表,请访问How-To:Publishandsubscribe。
https://docs.dapr.io/developing-applications/building-blocks/pubsub/howto-publish-subscribe/
绑定API
调用输出绑定
import{DaprClient}from&34;;\n\nconstdaprHost=&34;;\nconstdaprPort=&34;;\n\nasyncfunctionstart(){\nconstclient=newDaprClient(daprHost,daprPort);\n\nconstbindingName=&34;;\nconstbindingOperation=&34;;\nconstmessage={hello:&34;};\n\nconstresponse=awaitclient.binding.send(bindingName,bindingOperation,message);\n}\n\nstart().catch((e)=>{\nconsole.error(e);\nprocess.exit(1);\n});\n
有关输出绑定的完整指南,请访问How-To:Usebindings。
https://docs.dapr.io/developing-applications/building-blocks/bindings/howto-bindings/
SecretAPI
检索secret
import{DaprClient}from&34;;\n\nconstdaprHost=&34;;\nconstdaprPort=&34;;\n\nasyncfunctionstart(){\nconstclient=newDaprClient(daprHost,daprPort);\n\nconstsecretStoreName=&34;;\nconstsecretKey=&34;;\n\n//Retrieveasinglesecretfromsecretstore\nconstresponse=awaitclient.secret.get(secretStoreName,secretKey);\n\n//Retrieveallsecretsfromsecretstore\nconstresponse=awaitclient.secret.getBulk(secretStoreName);\n}\n\nstart().catch((e)=>{\nconsole.error(e);\nprocess.exit(1);\n});\n
有关secrets的完整指南,请访问How-To:RetrieveSecrets。
https://docs.dapr.io/developing-applications/building-blocks/secrets/howto-secrets/
配置API
获取配置key
import{DaprClient}from&34;;\n\nconstdaprHost=&34;;\nconstdaprAppId=&34;;\n\nasyncfunctionstart(){\n\nconstclient=newDaprClient(daprHost,process.env.DAPR_HTTP_PORT);\n\nconstconfig=awaitclient.configuration.get(&39;,[&39;,&39;]);\nconsole.log(config);\n}\n\nstart().catch((e)=>{\nconsole.error(e);\nprocess.exit(1);\n});\n
Server
介绍
DaprServer将允许您接收来自DaprSidecar的通信并访问其面向服务器的功能,例如:订阅事件、接收输入绑定等等。
前提条件
DaprCLI已安装https://docs.dapr.io/getting-started/install-dapr-cli/初始化Dapr环境https://docs.dapr.io/getting-started/install-dapr-selfhost/最新LTS版本的Node或更高版本https://nodejs.org/en/
安装和导入Dapr的JSSDK
使用npm安装SDK:
npmi@dapr/dapr–save\n
导入库:
import{DaprClient,DaprServer,HttpMethod,CommunicationProtocolEnum}from&34;;\n\nconstdaprHost=&34;;//DaprSidecarHost\nconstdaprPort=&34;;//DaprSidecarPortofthisExampleServer\nconstserverHost=&34;;//AppHostofthisExampleServer\nconstserverPort=&34;;//AppPortofthisExampleServer\n\n//HTTPExample\nconstclient=newDaprClient(daprHost,daprPort);\n\n//GRPCExample\nconstclient=newDaprClient(daprHost,daprPort,CommunicationProtocolEnum.GRPC);\n
运行
要运行示例,您可以使用两种不同的协议与Daprsidecar交互:HTTP(默认)或gRPC。
使用HTTP(默认)
import{DaprServer}from&34;;\n\nconstserver=newDaprServer(appHost,appPort,daprHost,daprPort);\n//initializesubscribtions,…beforeserverstart\n//thedaprsidecarreliesonthese\nawaitserver.start();\n
or,usingnpmscript\nnpmrunstart:dapr-http\n
??Note:这里需要app-port,因为这是我们的服务器需要绑定的地方。Dapr将在完成启动之前检查应用程序是否绑定到此端口。
使用gRPC
由于HTTP是默认设置,因此您必须调整通信协议以使用gRPC。您可以通过向客户端或服务器构造函数传递一个额外的参数来做到这一点。
import{DaprServer,CommunicationProtocol}from&34;;\n\nconstserver=newDaprServer(appHost,appPort,daprHost,daprPort,CommunicationProtocol.GRPC);\n//initializesubscribtions,…beforeserverstart\n//thedaprsidecarreliesonthese\nawaitserver.start();\n
or,usingnpmscript\nnpmrunstart:dapr-grpc\n
??Note:这里需要app-port,因为这是我们的服务器需要绑定的地方。Dapr将在完成启动之前检查应用程序是否绑定到此端口。
构建块
JavaScriptServerSDK允许您与专注于Sidecar到App功能的所有Dapr构建块进行交互。
调用API
监听调用
import{DaprServer}from&34;;\n\nconstdaprHost=&34;;//DaprSidecarHost\nconstdaprPort=&34;;//DaprSidecarPortofthisExampleServer\nconstserverHost=&34;;//AppHostofthisExampleServer\nconstserverPort=&34;;//AppPortofthisExampleServer&39;hello-world&34;hello-world&34;@dapr/dapr&34;127.0.0.1&34;3500&34;127.0.0.1&34;50051&34;\n\nasyncfunctionstart(){\nconstserver=newDaprServer(serverHost,serverPort,daprHost,daprPort);\n\nconstpubSubName=&34;;\nconsttopic=&34;;\n\n//ConfigureSubscriberforaTopic\nawaitserver.pubsub.subscribe(pubSubName,topic,async(data:any)=>console.log(`GotData:${JSON.stringify(data)}`));\n\nawaitserver.start();\n}\n\nstart().catch((e)=>{\nconsole.error(e);\nprocess.exit(1);\n});\n
有关状态操作的完整列表,请访问How-To:Publishandsubscribe。
https://docs.dapr.io/developing-applications/building-blocks/pubsub/howto-publish-subscribe/
绑定API
接收一个输入绑定
import{DaprServer}from&34;;\n\nconstdaprHost=&34;;\nconstdaprPort=&34;;\nconstserverHost=&34;;\nconstserverPort=&34;;\n\nasyncfunctionstart(){\nconstserver=newDaprServer(serverHost,serverPort,daprHost,daprPort);\n\nconstbindingName=&34;;\n\nconstresponse=awaitserver.binding.receive(bindingName,async(data:any)=>console.log(`GotData:${JSON.stringify(data)}`));\n\nawaitserver.start();\n}\n\nstart().catch((e)=>{\nconsole.error(e);\nprocess.exit(1);\n});\n
有关输出绑定的完整指南,请访问How-To:Usebindings。
https://docs.dapr.io/developing-applications/building-blocks/bindings/howto-bindings/
配置API
配置API目前只能通过gRPC使用
获取配置值
import{DaprServer}from&34;;\n\nconstdaprHost=&34;;\nconstdaprPort=&34;;\nconstserverHost=&34;;\nconstserverPort=&34;;\n\nasyncfunctionstart(){\nconstclient=newDaprClient(daprHost,daprPort,CommunicationProtocolEnum.GRPC);\nconstconfig=awaitclient.configuration.get(&34;,[&34;,&34;]);\n}\n\nstart().catch((e)=>{\nconsole.error(e);\nprocess.exit(1);\n});\n
订阅key更改
import{DaprServer}from&34;;\n\nconstdaprHost=&34;;\nconstdaprPort=&34;;\nconstserverHost=&34;;\nconstserverPort=&34;;\n\nasyncfunctionstart(){\nconstclient=newDaprClient(daprHost,daprPort,CommunicationProtocolEnum.GRPC);\nconststream=awaitclient.configuration.subscribeWithKeys(&34;,[&34;,&34;],()=>{\n//Receivedakeyupdate\n});\n\n//Whenyouarereadytostoplistening,callthefollowing\nawaitstream.close();\n}\n\nstart().catch((e)=>{\nconsole.error(e);\nprocess.exit(1);\n});\n
Actors
Dapractors包允许您从JavaScript应用程序与Daprvirtualactors进行交互。下面的示例演示了如何使用JavaScriptSDK与virtualactors进行交互。
如需更深入地了解Dapractors,请访问actors概览页面。
前提条件
DaprCLI已安装https://docs.dapr.io/getting-started/install-dapr-cli/初始化Dapr环境https://docs.dapr.io/getting-started/install-dapr-selfhost/最新LTS版本的Node或更高版本https://nodejs.org/en/已安装JavaScriptNPM包https://www.npmjs.com/package/@dapr/dapr
场景
下面的代码示例粗略地描述了停车场现场监控系统的场景,可以在MarkRussinovich的这段视频中看到。
https://www.youtube.com/watch?v=eJCu6a-x9uo&t=3785
一个停车场由数百个停车位组成,每个停车位都包含一个传感器,可为中央监控系统提供更新。停车位传感器(我们的actors)检测停车位是否被占用或可用。
要自己跳入并运行此示例,请克隆源代码,该源代码可在JavaScriptSDK示例目录中找到。
https://github.com/dapr/js-sdk/tree/master/examples/http/actor-parking-sensor
Actor接口
Actor接口定义了在Actor实现和调用Actor的客户端之间共享的合约。在下面的示例中,我们为停车场传感器创建了一个接口。每个传感器有2个方法:carEnter和carLeave,它们定义了停车位的状态:
exportdefaultinterfaceParkingSensorInterface{\ncarEnter():Promise<void>;\ncarLeave():Promise<void>;\n}\n
Actor实现
Actor实现通过扩展基本类型AbstractActor并实现Actor接口(在本例中为ParkingSensorInterface)来定义一个类。
下面的代码描述了一个actor实现以及一些辅助方法。
import{AbstractActor}from&34;;\nimportParkingSensorInterfacefrom&34;;\n\nexportdefaultclassParkingSensorImplextendsAbstractActorimplementsParkingSensorInterface{\nasynccarEnter():Promise<void>{\n//Implementationthatupdatesstatethatthisparkingspacesisoccupied.\n}\n\nasynccarLeave():Promise<void>{\n//Implementationthatupdatesstatethatthisparkingspacesisavailable.\n}\n\nprivateasyncgetInfo():Promise<object>{\n//Implementationofrequestinganupdatefromtheparkingspacesensor.\n}\n\n/**\n*@override\n*/\nasynconActivate():Promise<void>{\n//InitializationlogiccalledbyAbstractActor.\n}\n}\n
注册Actor
使用DaprServer包初始化和注册你的actors:
import{DaprServer}from&34;;\nimportParkingSensorImplfrom&34;;\n\nconstdaprHost=&34;;\nconstdaprPort=&34;;\nconstserverHost=&34;;\nconstserverPort=&34;;\n\nconstserver=newDaprServer(serverHost,serverPort,daprHost,daprPort);\n\nawaitserver.actor.init();//Lettheserverknowweneedactors\nserver.actor.registerActor(ParkingSensorImpl);//Registertheactor\nawaitserver.start();//Starttheserver\n\n//Togettheregisteredactors,youcaninvoke`getRegisteredActors`:\nconstresRegisteredActors=awaitserver.actor.getRegisteredActors();\nconsole.log(`RegisteredActors:${JSON.stringify(resRegisteredActors)}`);\n
调用Actor方法
注册Actor后,使用ActorProxyBuilder创建一个实现ParkingSensorInterface的代理对象。您可以通过直接调用Proxy对象上的方法来调用actor方法。在内部,它转换为对ActorAPI进行网络调用并取回结果。
import{DaprClient,ActorId}from&34;;\nimportParkingSensorImplfrom&34;;\nimportParkingSensorInterfacefrom&34;;\n\nconstdaprHost=&34;;\nconstdaprPort=&34;;\n\nconstclient=newDaprClient(daprHost,daprPort);\n\n//Createanewactorbuilder.Itcanbeusedtocreatemultipleactorsofatype.\nconstbuilder=newActorProxyBuilder<ParkingSensorInterface>(ParkingSensorImpl,client);\n\n//Createanewactorinstance.\nconstactor=builder.build(newActorId(&34;));\n//Oralternatively,usearandomID\n//constactor=builder.build(ActorId.createRandomId());\n\n//Invokethemethod.\nawaitactor.carEnter();\n
将状态与Actor一起使用
//…\n\nconstPARKING_SENSOR_PARKED_STATE_NAME=&34;\n\nconstactor=builder.build(newActorId(&34;))\n\n//SETstate\nawaitactor.getStateManager().setState(PARKING_SENSOR_PARKED_STATE_NAME,true);\n\n//GETstate\nconstvalue=awaitactor.getStateManager().getState(PARKING_SENSOR_PARKED_STATE_NAME);\nif(!value){\nconsole.log(`Received:${value}!`);\n}\n\n//DELETEstate\nawaitactor.removeState(PARKING_SENSOR_PARKED_STATE_NAME);\n…\n
Actor计时器和提醒器
JSSDK支持actors可以通过注册timers或reminders来为自己安排定期工作。timers和reminders之间的主要区别在于,Dapractorruntime在停用后不保留有关timers的任何信息,而是使用Dapractorstateprovider保留reminders信息。
这种区别允许用户在轻量级但无状态的timers和更需要资源但有状态的reminders之间进行权衡。
Timers和reminders的调度界面是相同的。要更深入地了解调度配置,请参阅actorstimers和reminders文档。
https://docs.dapr.io/developing-applications/building-blocks/actors/howto-actors/34;my-actor&34;timer-id&34;cb-method&34;timer-id&34;my-actor&34;reminder-id&34;reminder-id&34;@dapr/dapr&34;@dapr/dapr&34;@dapr/dapr&39;winston&39;combined.log&34;@dapr/dapr&34;./WinstonLoggerService”;\n\nconstwinstonLoggerService=newWinstonLoggerService();\n\n//createaclientinstancewithloglevelsettoverboseandloggerserviceaswinston.\nconstclient=newDaprClient(\ndaprHost,\ndaprPort,\nCommunicationProtocolEnum.HTTP,\n{logger:{level:LogLevel.Verbose,service:winstonLoggerService}});\n
官方示例代码库
https://github.com/dapr/js-sdk/tree/main/examples
关于本次nodejs手机网站源码分享和用nodejs开发的大型网站的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
