tag 标签: 13章

相关资源
  • 所需E币: 0
    时间: 2024-5-28 19:38
    大小: 2.46KB
    当下,同城代驾服务越来越受到人们的青睐。为了满足市场需求,许多企业开始开发智能调度系统,以提高服务效率和用户体验。本文将介绍如何搭建一个智能调度系统,并以同城代驾小程序的开发为例进行详细教学。一、技术要求1、平台选择当前主流的平台有iOS和Android,开发者需要根据目标用户的偏好和市场占有率做出选择。同时,还需要考虑平台的开发成本和技术难度等因素。2、功能设计代驾app软件需要具备一些基本功能,如注册登录、订单管理、定位导航等。同时还可以考虑增加一些创新的功能,如在线支付、评价系统等,以提升用户体验和竞争力。3、安全保障代驾服务涉及到用户的个人信息和支付信息,安全性至关重要。在软件开发过程中,需要加强安全保障措施,如数据加密、身份验证等,以保护用户的隐私和安全。二、用户体验1、界面设计代驾app软件的界面设计要简洁明了,符合用户的使用习惯和视觉需求。合理的布局和颜色搭配,清晰的操作流程,能够提升用户的体验和满意度。2、易用性分析代驾app软件开发过程中,应注重易用性的考虑。例如,可以采用简洁明了的图标和按钮,提供明确的操作指引,减少用户的学习成本和操作困难,从而提高用户的使用效率和满意度。3、反馈机制代驾app软件应该提供及时的反馈机制,让用户能够随时了解订单的状态和司机的位置等信息。同时,还应该给用户提供反馈渠道,以便他们及时解决问题和提出建议。三、代驾小程序开发需要多少钱?代驾小程序最终的价格还是要看功能的,越复杂的功能越贵,几千到几万都有。上面推荐给大家的使用智能小程序搭建软件的方法,像上面那个代驾小程序的案例功能这么多的小程序,也就只需要千来块,性价比还是不错的。当然,不满足上面这些功能的老板们,可以选择专业定制,价格几万块但功能会更加全面。四、代驾APP开发有哪些好处1、对于代驾人员来说:代驾APP的开发无疑是为自己增加了客户来源,通过APP代驾人员无须担心车主因为醉酒而无法结算费用的问题。这样既可以保证自己的利益,又能获得更多的客户,不是一举两得吗?2、对于车主而言:代驾APP的到来无疑是为自己的安全带来了保障。让车主可以没有后顾之忧,可以畅饮开怀享受难得的团聚时光。3、对于相关部门来说:代驾APP的到来可以有效地降低交通事故发生率,提高行车安全意识,增强对法律法规的认知,从而更好地构建一个和谐社会。五、代驾app开发,你需要知道的一些技术!一.原生开发什么是原生开发?原生开发(NativeApp开发)就像盖房子,先打地基然后浇地梁、房屋结构、一砖一瓦、钢筋水泥、电路走向等,原生APP同理:通过代码从每个页面、每个功能、每个效果、每个逻辑、每个步骤全部用代码写出来,一层层,一段段全用代码写出来。传统的app是用H5或混合开发,成本不高,但是bug很多,兼容性不好,最直接的体现就是用户进入app十分不流畅,而且有时会发生卡顿、卡页面的现象。二.服务器服务器决定了app在高峰时会不会卡顿,是否流畅,如果服务器的稳定性和承载量不够高,就会出现用户不能良好的刷新页面,无法呼叫代驾,看起来是网络不稳,其实是服务器带不起来。三.长连接即时通讯模式长连接功能指的是代驾司机开展代驾业务时,能够让自己的移动定位实时显示在app界面,用户可以随时查看司机位置,而且都不会出现迟钝、不动的现象。
  • 所需E币: 0
    时间: 2024-4-29 11:34
    大小: 2.98KB
    一、什么是微服务架构微服务架构是一种面向服务的架构风格,通过将应用程序拆分为小的、自治的服务单元,以提高系统的灵活性、可扩展性和可维护性。它是一种软件设计和开发的方法论,它将一个应用程序拆分成一组小而独立的服务单元,这些服务单元可以独立部署、扩展和管理。每个服务单元都专注于完成特定的业务功能,并通过轻量级的通信机制(通常是HTTP或消息队列)与其他服务单元协同工作。二、伴随着云计算、容器技术、大数据等新兴技术的不断涌现,微服务架构因为其高度可扩展性、灵活性等特点,越来越受到人们的青睐。在微服务架构中,每个服务都是一个独立的进程,每个进程都有自己的数据存储方式,操作系统环境等等。微服务通过通信协议(如http、grpc等)互相通信,形成为支撑大型应用系统的服务群。Go语言作为一个轻量级的,高并发的静态编译型语言,其天然的优势使其成为微服务开发的首选语言之一,内置的goroutine和channel机制保证了Go语言在高并发场景下极高的性能和稳定性。如何使用Go语言开发微服务呢?下面将从以下几个方面进行详细阐述。1、拆分微服务架构师应该首先根据业务模型,将整个应用拆分成若干个独立的服务。拆分的原则是保证每个微服务模块足够小,不要包含过多的业务逻辑,只保留服务本身的核心功能。通过手工埋点或开源工具例如Skywalking等方式,对微服务模块进行详细的跟踪和性能分析,发现程序中的瓶颈,进行优化。2、选择框架Go语言的生态系统非常完善,涵盖了很多优秀的微服务框架。开发过程中,架构师可以根据需求选择不同的框架进行集成。以下是几个常见的Go语言微服务框架:Gokit:提供了许多开箱即用的微服务类库,包括服务发现、负载均衡、日志、跟踪等等,同时提供了一个可扩展的RPC库,以供用户使用。但Gokit的组件相对独立,而且很多组件都是不可配置的,这会导致底层实现较为复杂。Micro:该框架用于处理复杂和高度可分布式的系统,具有良好的可扩展性和服务发现功能。但是,在使用micro时,需要解决API网关、负载均衡和安全问题等复杂问题。Gin:是一个轻量级且快速的HTTPWeb框架,适用于创建RESTAPIs和中较大规模的Web应用程序。通过它可以快速创建服务,但要注意的是,它仅仅是一个Web框架,所以它并不能处理微服务框架所应该处理的所有东西。三、Go语言与微服务架构与分布式系统的联系Go语言在微服务架构和分布式系统中发挥了重要作用。它的简洁的语法和强大的并发能力使得开发者可以快速编写高性能的分布式应用程序。此外,Go语言的内置支持和丰富的生态系统,使得开发者可以轻松地实现微服务之间的通信和协同工作。四、Go-Zero的核心特性简洁与高效:Go-Zero的设计理念强调简洁与高效,它提供了丰富的组件和工具,帮助开发者快速构建微服务应用。同时,Go-Zero注重性能优化,通过合理的资源分配和并发控制,确保系统在高负载下仍能保持稳定运行。自动化与智能化:Go-Zero支持自动化代码生成和配置管理,降低了开发者的手动操作成本。此外,它还具备智能负载均衡、容错处理等功能,提高了系统的可用性和可靠性。可扩展与可定制:Go-Zero具有良好的可扩展性,支持水平扩展和垂直扩展,满足不同规模的业务需求。同时,开发者可以根据项目需求,自定义组件和插件,实现高度定制化的功能。五、服务之间如何通信所有的微服务都是独立部署,运行在自己的进程容器中,所以微服务与微服务之间的通信就是IPC(InterProcessCommunication),翻译为进程间通信。进程间通信的方案已经比较成熟了,现在最常见的有两大类:同步调用、异步消息调用。同步调用同步调用比较简单,一致性强,但是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。同步调用的有两种实现方式:分别是REST和RPCREST:REST基于HTTP,实现更容易,各种语言都支持,同时能够跨客户端,对客户端没有特殊的要求,只要具备HTTP的网络请求库功能就能使用。RPC:rpc的特点是传输效率高,安全性可控,在系统内部调用实现时使用的较多。基于REST和RPC的特点,我们通常采用的原则为:向系统外部暴露采用REST,向系统内部暴露调用采用RPC方式。六、go-zero和gin区别Go-Zero和Gin都是基于Go语言的Web框架,但二者有一些区别:设计思路不同:Go-Zero的设计思路是面向SOA的微服务框架,提供了丰富的微服务组件和代码生成工具,帮助开发者快速构建微服务应用系统。而Gin则是一个轻量级的Web框架,适用于构建小型Web应用系统。组件不同:Go-Zero提供了很多微服务组件,包括RPC调用、流控、服务注册等等,适用于复杂微服务系统的开发。Gin则提供了一些Web开发需要的基本组件,比如HTTP接口、路由、中间件等,适用于小型Web系统的开发。代码生成工具:Go-Zero提供了一些代码生成
  • 所需E币: 0
    时间: 2024-3-21 13:17
    大小: 2.7KB
    上传者: 开心就很好了
    如何轻松应对复杂应用的微服务架构设计?如何实现高效的容器化组件管理,快速成为Go高薪工程师?本文将结合经典IM项目,带你深入微服务架构精髓,探究主流微服务框架Go-Zero框架底层运作机制和框架自研之道,让你从分布式系统架构设计、容器化部署管理、高并发性能提升、系统监控等,多维度掌握Go开发高薪技能,助力你快速成为行业急需人才。一、什么是Go-Zerogo-zero是一个集成了各种工程实践的web和rpc框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。go-zero包含极简的AP!定义和生成工具goct,可以根据定义的api文件一键生成Go,i0s,Android,Kotlin,Dart,TypeScript,Javascript代码,并可直接运行。使用go-zero的好处:轻松获得支撑千万日活服务的稳定性·内建级联超时控制、限流、自适应熔断、自适应降载等微服务治理能力,无需配置和额外代码微服务治理中间件可无缝集成到其它现有框架使用极简的API描述,一键生成各端代码自动校验客户端请求参数合法性大量微服务治理和并发工具包二、go-zero框架的特点高性能go-zero采用了高性能的go标准库,整个框架的性能非常高效。同时,在框架中还采用了一些其它优化技术,例如连接池复用等,使得整个框架在性能方面得到了较为优秀的表现。轻量级go-zero框架非常轻量级,它的整个代码量也非常的少。同时,go-zero还采用了很多简洁的语法,使得开发效率更高。异步IO对于一个高性能的微服务框架来说,异步IO是必不可少的。go-zero框架中的异步IO采用了协程的方式调度,使得整个框架的性能得到了大幅提升。中间件支持go-zero框架提供了丰富的中间件支持,包括日志、限流、认证、缓存等,这些中间件可以帮助开发者轻松实现更多的功能。三、go-zero框架的使用在学习任何一款框架之前,你首先需要明确所需的环境和前置条件。对于go-zero框架而言,你需要首先安装Go语言的开发环境,然后使用go命令安装go-zero框架。四、怎么安装golang1.下载Go安装文件首先,需要访问Go官方网站下载Windows版本的Go安装包,可以选择根据操作系统和处理器位数选择相应的版本。下载完成后,打开安装文件进行安装。2.安装Go在安装程序中,需要指定安装目录。建议选择默认的安装路径,以避免因路径问题导致安装失败。在安装过程中,请遵循程序的提示进行操作。安装完成后,检查是否成功安装Go,可以在命令行界面输入命令,如果安装成功,将输出Go版本信息。3.macbrew安装安装目录在/usr/local/opt/go#查看可用go版本brewsearchgo#安装gobrewinstallgobrewinstallgo@<version>#升级brewupdatebrewupgradego配置GOPATHGOPATH是Golang的工作区,它包含了你的源代码、第三方代码包、编译生成的文件等。默认情况下,GOPATH路径为“%USERPROFILE%go”(USERPROFILE为当前用户名)。你可以修改GOPATH路径,建议将GOPATH设置为一个单独的文件夹路径。打开环境变量设置,新增GOPATH变量,将其值设置为你想要的工作区路径,例如“D:gowork”。将此路径添加到环境变量Path中,这样你就可以在所有文件夹下使用go命令了。4.在Linux中安装Golang下载安装包在Linux中安装Golang有多种方式,包括使用包管理器安装、使用二进制文件安装、从源代码编译安装等。这里我们介绍使用包管理器进行安装的方法。首先,更新源列表:sudoapt-getupdate然后,使用以下命令安装Golang:sudoapt-getinstallgolang配置GOPATH同样,在Linux中也需要配置GOPATH。和在Windows中一样,将GOPATH设置为一个单独的文件夹路径。在终端中输入以下命令:echo'exportGOPATH=$HOME/go'>>~/.bashrcecho'exportPATH=$PATH:$GOPATH/bin'>>~/.bashrcsource~/.bashrc以上命令将GOPATH设置为$HOME/go,将$GOPATH/bin添加到PATH环境变量中。五、总结:只需要在生成的代码中填入自己的配置以及逻辑即可,咱们使用go-zero可以轻松做到如下效果:轻松获得支撑千万日活服务的稳定性,内建级联超时控制、限流、自适应熔断、自适应降载等微服务治理能力,无需配置和额外代码,微服务治理中间件可无缝集成到其它现有框架使用,极简的API描述,一键生成各端代码,自动校验客户端请求参数合法性,大量微服务治理和并发工具包。
  • 所需E币: 0
    时间: 2023-12-22 10:13
    大小: 3.93KB
    上传者: 开心就很好了
    Java并发编程从入门到进阶多场景实战,众所周知,并发编程是优秀工程师的标准之一,但知识庞杂,复杂性高,常常让人望而却步。但如果没有掌握背后的核心原理,你开发的代码可能会成为难以调试和优化的头疼问题。在此,我将通过上百个案例场景驱动教学+动画直观演示,帮助大家深入、直观地理解并发编程核心概念和底层原理。助力大家在实际工作和面试中都能尽早脱颖而出。首先,我们先来了解关于并发的基本概念。并发情况主要会引出三个基本概念,分别是原子性、可见性、有序性三个基本概念Java中线程的状态分为6种:1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。3.阻塞(BLOCKED):表示线程阻塞于锁。4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。6.终止(TERMINATED):表示该线程已经执行完毕。其实我们可以通过job.setPartitionerClass来设置分区类,不过目前我们是没有设置的,那框架中是不是有默认值啊,是有的,我们可以通过job.getPartitionerClass方法看到默认情况下会使用HashPartitioner这个分区类那我们来看一下HashPartitioner的实现是什么样子的/**Partitionkeysbytheir{@linkObject#hashCode()}.*/@InterfaceAudience.Public@InterfaceStability.StablepublicclassHashPartitioner<K,V>extendsPartitioner<K,V>{ /**Use{@linkObject#hashCode()}topartition.*/ publicintgetPartition(Kkey,Vvalue,             intnumReduceTasks){  return(key.hashCode()&Integer.MAX_VALUE)%numReduceTasks; }}下面我们来具体跑一个这份数据,首先复制一份WordCountJob的代码,新的类名为WordCountJobSkewpackagecom.imooc.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;/** *数据倾斜-增加Reduce任务个数 * *Createdbyxuwei */publicclassWordCountJobSkew{  /**   *Map阶段   */  publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyMapper.class);    /**     *需要实现map函数     *这个map函数就是可以接收<k1,v1>,产生<k2,v2>     *@paramk1     *@paramv1     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidmap(LongWritablek1,Textv1,Contextcontext)        throwsIOException,InterruptedException{      //输出k1,v1的值      //System.out.println("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //logger.info("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //k1代表的是每一行数据的行首偏移量,v1代表的是每一行内容      //对获取到的每一行数据进行切割,把单词切割出来      String[]words=v1.toString().split("");      //把单词封装成<k2,v2>的形式      Textk2=newText(words[0]);      LongWritablev2=newLongWritable(1L);      //把<k2,v2>写出去      context.write(k2,v2);    }  }  /**   *Reduce阶段   */  publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyReducer.class);    /**     *针对<k2,{v2...}>的数据进行累加求和,并且最终把数据转化为k3,v3写出去     *@paramk2     *@paramv2s     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidreduce(Textk2,Iterable<LongWritable>v2s,Contextcontext)        throwsIOException,InterruptedException{      //创建一个sum变量,保存v2s的和      longsum=0L;      //对v2s中的数据进行累加求和      for(LongWritablev2:v2s){        //输出k2,v2的值        //System.out.println("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        //logger.info("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        sum+=v2.get();//模拟Reduce的复杂计算消耗的时间        if(sum%200==0){          Thread.sleep(1);        }      }      //组装k3,v3      Textk3=k2;      LongWritablev3=newLongWritable(sum);      //输出k3,v3的值      //System.out.println("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //logger.info("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //把结果写出去      context.write(k3,v3);    }  }  /**   *组装Job=Map+Reduce   */  publicstaticvoidmain(String[]args){    try{      if(args.length!=3){        //如果传递的参数不够,程序直接退出        System.exit(100);      }      //指定Job需要的配置参数      Configurationconf=newConfiguration();      //创建一个Job      Jobjob=Job.getInstance(conf);      //注意了:这一行必须设置,否则在集群中执行的时候是找不到WordCountJob这个类的      job.setJarByClass(WordCountJobSkew.class);      //指定输入路径(可以是文件,也可以是目录)      FileInputFormat.setInputPaths(job,newPath(args[0]));      //指定输出路径(只能指定一个不存在的目录)      FileOutputFormat.setOutputPath(job,newPath(args[1]));      //指定map相关的代码      job.setMapperClass(MyMapper.class);      //指定k2的类型      job.setMapOutputKeyClass(Text.class);      //指定v2的类型      job.setMapOutputValueClass(LongWritable.class);      //指定reduce相关的代码      job.setReducerClass(MyReducer.class);      //指定k3的类型      job.setOutputKeyClass(Text.class);      //指定v3的类型      job.setOutputValueClass(LongWritable.class);      //设置reduce任务个数      job.setNumReduceTasks(Integer.parseInt(args[2]));      //提交job      job.waitForCompletion(true);    }catch(Exceptione){      e.printStackTrace();    }  }}针对这个操作我们需要去修改代码,在这里我们再重新复制一个类,基于WordCountJobSkew复制,新的类名是WordCountJobSkewRandKeypackagecom.imooc.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;importjava.util.Random;/** *数据倾斜-把倾斜的数据打散 * *Createdbyxuwei */publicclassWordCountJobSkewRandKey{  /**   *Map阶段   */  publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyMapper.class);    Randomrandom=newRandom();    /**     *需要实现map函数     *这个map函数就是可以接收<k1,v1>,产生<k2,v2>     *@paramk1     *@paramv1     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidmap(LongWritablek1,Textv1,Contextcontext)        throwsIOException,InterruptedException{      //输出k1,v1的值      //System.out.println("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //logger.info("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //k1代表的是每一行数据的行首偏移量,v1代表的是每一行内容      //对获取到的每一行数据进行切割,把单词切割出来      String[]words=v1.toString().split("");      //把单词封装成<k2,v2>的形式      Stringkey=words[0];      if("5".equals(key)){        //把倾斜的key打散,分成10份        key="5"+"_"+random.nextInt(10);      }      Textk2=newText(key);      LongWritablev2=newLongWritable(1L);      //把<k2,v2>写出去      context.write(k2,v2);    }  }  /**   *Reduce阶段   */  publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyReducer.class);    /**     *针对<k2,{v2...}>的数据进行累加求和,并且最终把数据转化为k3,v3写出去     *@paramk2     *@paramv2s     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidreduce(Textk2,Iterable<LongWritable>v2s,Contextcontext)        throwsIOException,InterruptedException{      //创建一个sum变量,保存v2s的和      longsum=0L;      //对v2s中的数据进行累加求和      for(LongWritablev2:v2s){        //输出k2,v2的值        //System.out.println("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        //logger.info("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        sum+=v2.get();        //模拟Reduce的复杂计算消耗的时间        if(sum%200==0){          Thread.sleep(1);        }      }      //组装k3,v3      Textk3=k2;      LongWritablev3=newLongWritable(sum);      //输出k3,v3的值      //System.out.println("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //logger.info("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //把结果写出去      context.write(k3,v3);    }  }  /**   *组装Job=Map+Reduce   */  publicstaticvoidmain(String[]args){    try{      if(args.length!=3){        //如果传递的参数不够,程序直接退出        System.exit(100);      }      //指定Job需要的配置参数      Configurationconf=newConfiguration();      //创建一个Job      Jobjob=Job.getInstance(conf);      //注意了:这一行必须设置,否则在集群中执行的时候是找不到WordCountJob这个类的      job.setJarByClass(WordCountJobSkewRandKey.class);      //指定输入路径(可以是文件,也可以是目录)      FileInputFormat.setInputPaths(job,newPath(args[0]));      //指定输出路径(只能指定一个不存在的目录)      FileOutputFormat.setOutputPath(job,newPath(args[1]));      //指定map相关的代码      job.setMapperClass(MyMapper.class);      //指定k2的类型      job.setMapOutputKeyClass(Text.class);      //指定v2的类型      job.setMapOutputValueClass(LongWritable.class);      //指定reduce相关的代码      job.setReducerClass(MyReducer.class);      //指定k3的类型      job.setOutputKeyClass(Text.class);      //指定v3的类型      job.setOutputValueClass(LongWritable.class);      //设置reduce任务个数      job.setNumReduceTasks(Integer.parseInt(args[2]));      //提交job      job.waitForCompletion(true);    }catch(Exceptione){      e.printStackTrace();    }  }}调用parallelize()时,有一个重要的参数可以指定,就是将集合切分成多少个partition。Spark会为每一个partition运行一个task来进行处理。Spark默认会根据集群的配置来设置partition的数量。我们也可以在调用parallelize()方法时,传入第二个参数,来设置RDD的partition数量,例如:parallelize(arr,5)scala代码如下:packagecom.imooc.scalaimportorg.apache.spark.{SparkConf,SparkContext}/** *需求:使用集合创建RDD *Createdbyxuwei */objectCreateRddByArrayScala{ defmain(args:Array[String]):Unit={  //创建SparkContext  valconf=newSparkConf()  conf.setAppName("CreateRddByArrayScala")//设置任务名称  .setMaster("local")//local表示在本地执行  valsc=newSparkContext(conf)  //创建集合  valarr=Array(1,2,3,4,5)  //基于集合创建RDD  valrdd=sc.parallelize(arr)  valsum=rdd.reduce(_+_)  println(sum)  //停止SparkContext  sc.stop() }}
  • 所需E币: 0
    时间: 2023-12-14 10:32
    大小: 2.41KB
    上传者: 开心就很好了
    今天给大家讲讲关于多级网关与多级缓存架构的相关知识,在文章里面,我将从0到1带着大家构建基础服务接口,通过层层递进优化服务,使得服务具备多级缓存的特性,并融合OpenResty拓展一个强大的多级网关+多级缓存的技术架构。以下就是代码实战展示:引入springboot3的maven依赖,本质上作为pom引入,直接管理他的版本号,后续用到啥组件直接拿来即用:<dependencies>  <!--引入SpringBoot依赖-->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-configuration-processor</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId>  </dependency></dependencies>dependencyManagement依赖管理全代码依赖配置如下:<!--  使用dependencyManagement的目的是为了保证当前父工程的干净,  也就是说父工程他只负责对依赖(坐标)的管理,以及依赖的版本管理,而不会去引入额外的jar依赖  如此一来,父工程的职责就相当的单一了,而且也符合面向对象的理念,是一种父子一来继承的关系  依赖的导入只有在各自的子工程中才会导入。--><dependencyManagement>  <dependencies>    <!--mysql驱动-->    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>8.0.33</version>    </dependency>    <!--持久层mybatis-->    <dependency>      <groupId>com.baomidou</groupId>      <artifactId>mybatis-plus-boot-starter</artifactId>      <version>3.5.0</version>    </dependency>    <dependency>      <groupId>com.github.pagehelper</groupId>      <artifactId>pagehelper-spring-boot-starter</artifactId>      <version>1.4.1</version>    </dependency>    <!--jackson-->    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-core</artifactId>      <version>2.14.2</version>    </dependency>    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-annotations</artifactId>      <version>2.14.2</version>    </dependency>    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-databind</artifactId>      <version>2.14.2</version>    </dependency>    <!--apache工具类-->    <dependency>      <groupId>commons-codec</groupId>      <artifactId>commons-codec</artifactId>      <version>1.15</version>    </dependency>    <dependency>      <groupId>org.apache.commons</groupId>      <artifactId>commons-lang3</artifactId>      <version>3.12.0</version>    </dependency>    <dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>1.4</version>    </dependency>    <dependency>      <groupId>commons-io</groupId>      <artifactId>commons-io</artifactId>      <version>2.11.0</version>    </dependency>    <dependency>      <groupId>org.apache.httpcomponents</groupId>      <artifactId>httpclient</artifactId>      <version>4.5.13</version>    </dependency>    <!--google工具类-->    <dependency>      <groupId>com.google.guava</groupId>      <artifactId>guava</artifactId>      <version>28.2-jre</version>    </dependency>  </dependencies></dependencyManagement>使用zaddzset10value120value230value3:设置member和对应的分数zrangezset0-1:查看所有zset中的内容zrangezset0-1withscores:带有分数zrankzsetvalue:获得对应的下标zscorezsetvalue:获得对应的分数zcardzset:统计个数zcountzset分数1分数2:统计个数zrangebyscorezset分数1分数2:查询分数之间的member(包含分数1分数2)zrangebyscorezset(分数1(分数2:查询分数之间的member(不包含分数1和分数2)zrangebyscorezset分数1分数2limitstartend:查询分数之间的member(包含分数1分数2),获得的结果集再次根据下标区间做查询zremzsetvalue:删除member在common中引入的坐标依赖<dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-lang3</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-core</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-annotations</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-databind</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.datatype</groupId>  <artifactId>jackson-datatype-jsr310</artifactId></dependency>迭代查询代码,一级缓存与二级缓存结合:@GetMapping("query")publicObjectquery(Stringid){  StringarticleKey="article:"+id;  StringarticleKeyRedis="REDIS_ARTICLE:"+id;  Articlearticle=cache.get(articleKey,s->{    System.out.println("文章id为"+id+"的没有查询到,则从Redis中查询后返回...");    ArticlearticleReal=null;    StringarticleJsonStr=redis.get(articleKeyRedis);    //判断从redis中查询到的文章数据是否为空    if(StringUtils.isBlank(articleJsonStr)){      System.out.println("Redis中不存在该文章,将从数据库中查询...");      //如果为空,则进入本条件,则从数据库中查询数据      articleReal=articleService.queryArticleDetail(id);      //手动把文章数据设置到redis中,后续再次查询则有值      StringarticleJson=JsonUtils.objectToJson(articleReal);      redis.set(articleKeyRedis,articleJson);    }else{      System.out.println("Redis中存在该文章,将直接返回...");      //如果不为空,则直接转换json类型article再返回即可      articleReal=JsonUtils.jsonToPojo(articleJsonStr,Article.class);    }    returnarticleReal;  });  returnarticle;}本文到此结束,感谢大家的阅读!
  • 所需E币: 0
    时间: 2023-9-28 14:06
    大小: 1.45KB
    Flink从0到1实战实时风控系统课程下载2023需要解决的问题哪些是风险事件,注册、登录、交易、活动等事件,需要业务埋点配合提供实时数据接入什么样的事件是有风险的,风险分析需要用到统计学,对异常用户的历史数据做统计分析,找出异于正常用户的特征实时性,风险事件的分析必须毫秒级响应,有些场景下需要尽快拦截,能够给用户止损挽回损失低误报,这需要人工风控经验,对各种场景风险阈值和评分的设置,需要长期不断的调整,所以灵活的规则引擎是很重要的支持对历史数据的回溯,能够发现以前的风险,或许能够找到一些特征供参考项目标签轻量级,可扩展,高性能的Java实时业务风控系统基于Springboot构建,配置文件能少则少使用drools规则引擎管理风控规则,原则上可以动态配置规则使用redis、mongodb做风控计算和事件储存,历史事件支持水平扩展基于Flink构建风控系统风控是一个很大的话题,涉及到规则引擎、NoSQLDB、CEP等等,本章主要讲一些风控的基本概念。在大数据侧,我们把风控划分成3×2的关系:2代表风控要么是基于规则的,要么是基于算法或模型的;3代表包括三种风控类型:事先风控、事中风控和事后风控。对于事中风控和事后风控来讲,端上的感知是异步的,对于事先风控来讲,端上的感知是同步的。对于事先风控这里稍做一些解释,事先风控是把已经训练好的模型或者把已经计算好的数据存在Redis、MongoDB等数据库中;一种方式是端上有类似Sidden、Groovy、Drools这样的规则引擎直接去Redis、MongoDB取数据来返回结果;另外一种方式是基于KubeflowKFserving,端上请求过来之后基于训练好的算法和模型返回结果。整体来讲这两种方式的时延都在200毫秒左右,可以作为一个同步的RPC或HTTP请求。对于Flink相关的大数据场景是一个异步的风控请求,它的异步时效性非常低,通常是一秒或者两秒。如果追求超低时延,则可以认为它是一种事中的风控,风控决策过程可以由机器介入处理。很常见的一种类型是用FlinkSQL做指标阈值的统计、用FlinkCEP做行为序列规则分析,还有一种是用TensorflowonFlink,在Tensorflow中进行算法描述,然后用Flink来执行Tensorflow规则的计算。
  • 所需E币: 0
    时间: 2023-8-18 11:13
    大小: 1.18KB
    SAAS代表“软件即服务”(SoftwareasaService),它是一种软件交付模型,通过互联网提供软件应用程序给用户使用。在SAAS模型中,软件应用程序由供应商托管在云端的服务器上,并通过互联网进行访问和使用。SAAS系统的优点包括:低成本:用户无需购买和维护硬件设备,也不需要进行软件的安装和升级。SAAS模型采用订阅付费方式,降低了初始投资成本和运营成本。可扩展性:SAAS系统可根据用户需求进行弹性扩展,无需用户自行扩充硬件和资源。全球访问:用户只需通过互联网连接,可以随时随地访问SAAS应用程序。自动更新:供应商负责对SAAS系统进行更新和维护,用户无需担心软件版本更新和安全补丁。SaaS软件的3种部署模式SaaS是云计算的主要服务模型之一,客户可以在以下三种不同的模式中部署SaaS:私有云:云软件构建在基础设施之上,该基础设施专供由多个用户组成的单一组织使用。基础设施可能由公司或第三方拥有、管理和操作,它可能存在于公司内部或外部。公有云:云软件构建在供公众公开使用的基础设施之上。基础设施可以由企业、学术或政府组织或一些组合拥有、管理和运营。它存在于云提供商的基础上。混合云:云软件主要构建在一种类型的基础设施上,但有能力在需求高的时候切换到另一种类型的基础设施。在标准化或专有技术的支持下,数据和应用程序具有可移植性。
  • 所需E币: 0
    时间: 2023-8-17 15:12
    大小: 1.28KB
    上传者: 蝴蝶结欧恩
    分享课程——【13章】SpringBoot+Vue3打造企业级一体化SaaS系统,附源码。SaaS是SoftwareasaService的缩写,意为软件即服务。SaaS是一种软件部署模式,第三方供应商在云基础设施上构建应用程序,并以订阅的形式,通过互联网向客户提供这些应用程序,不要求客户预先建设底层基础设施。这意味着软件可以在任何有互联网连接和网络浏览器的设备上访问,而不像传统软件那样只能在本地机器上安装。Salesforce的出现颠覆了软件的定义,成立后不仅创造了收入连续十七年同比增长的神话,市场份额遥遥领先,多年来股价也在稳步上升,甚至在2020年12月,Salesforce还以277亿美元收购了聊天软件公司Slack。
  • 所需E币: 0
    时间: 2023-2-7 10:19
    大小: 2.51KB
    上传者: 开心就很好了
    分享一套基于Dubbo3实战高并发“秒杀购物系统”的课程——《SpringCloud整合Dubbo3实战高并发微服务架构设计》,2023年2月完结新课,课程一共13章,提供课程配套的源码+笔记!
  • 所需E币: 0
    时间: 2021-3-24 21:57
    大小: 76.45KB
    上传者: stanleylo2001
    ARM9嵌入式系统设计基础教程电子课件_第13章图形用户接口
  • 所需E币: 0
    时间: 2021-3-20 17:38
    大小: 6.01MB
    上传者: Argent
    这些都是各大名校的电路分析专业课之最大法宝,把这些题目悉心研究几遍,定会考出高分。无论对于即将考研的你,还是即将走向电子工程师岗位的你,都会获益匪浅。希望大家利用好这些历年真题,对于你今后的电子电路设计有所帮助。
  • 所需E币: 0
    时间: 2021-3-20 20:27
    大小: 76.44KB
    上传者: samewell
    ARM9嵌入式系统设计基础教程电子课件第13章图形用户接口
  • 所需E币: 2
    时间: 2021-3-21 17:46
    大小: 67.08KB
    上传者: Goodluck2020
    ARM9嵌入式系统设计基础教程电子课件第13章图形用户接口
  • 所需E币: 0
    时间: 2021-3-22 17:13
    大小: 76.41KB
    上传者: Goodluck2020
    ARM9嵌入式系统设计基础教程-第13章图形用户接口
  • 所需E币: 0
    时间: 2021-3-22 17:38
    大小: 76.28KB
    上传者: Goodluck2020
    第13章图形用户接口.zip
  • 所需E币: 1
    时间: 2020-12-30 15:28
    大小: 290.96KB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电知识也是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 0
    时间: 2020-12-27 21:55
    大小: 8KB
    上传者: stanleylo2001
    MATLAB培训资料_第13章随机数生成
  • 所需E币: 0
    时间: 2020-9-7 22:36
    大小: 122.79KB
    上传者: samewell
    数据结构与算法第1-3章作业
  • 所需E币: 0
    时间: 2020-9-21 10:50
    大小: 66.98KB
    上传者: LGWU1995
    ARM9嵌入式系统设计基础教程电子课件-第13章图形用户接口
  • 所需E币: 0
    时间: 2020-9-17 22:19
    大小: 7.14MB
    上传者: kaidi2003
    第13章网络图网络矩阵与网络方程.ppt