JAVA项目概念

JAVA项目概念

JAVAlijiangchao2022-05-16 21:28:5990A+A-

项目中开发文档都有哪些?

1、需求文档(产品经理--项目经理)

2、功能文档(项目中包含哪些功能、功能模块流程文档、功能模块描述文档)

3、 接口文档 (高级后端工程师或者架构师来写 编写模块前可以写、编写模块后可 以写)swagger

4、部署文档(环境部署文档 mysql docker 微服务的部署)

5、业务文档(介绍业务关键字等等 spu sku)


目前比较常用的跨域解决方案有3种

jsonp CORS nginx


CORS

CORS是一个W3C标准,全称(Cross-origin resource sharing)跨域资源共享

FastDFS是什么

FastDFS 是一个由 C 语言实现的开源轻量级 分布式文件系统 ,作者余庆 (happyfish100),支持 Linux、FreeBSD、AID 等 Unix 系统,解决了大数据存 储和读写负载均衡(nginx)等问题,适合存储 4KB~500MB 之间的小文件,如图片网 站、短视频网站、文档、app 下载站等,UC、京东、支付宝、迅雷、酷狗、国美在 线、苏宁易购等都有使用。

FastDFS架构图

cluster集群 Tracker Cluster集群 调度的作用,并不存储文件

Storage cluster 存储集群

第一个部分:调度服务器Tracker Server 第二个部分:存储服务器Storage Server

fastDFS开发流程

1、部署fastDFS-----部署docker容器 至少2个小时 2、编写上传的代码

商品详情页页面优化问题

完成了商品详情页的页面实现。假如10w人去同时访问咱们这个商品详情页。这样就 造成了访问数据库压力非常大。IO读写压力比较大。 如何去减轻数据库IO读写压力? 可以使用非关系数据库redis、ElasticSearch(索引库)

ip pv

一般可以从2个层面来解决数据库IO读写压力。 1. 提供数据库sql本身的性能(多线程) 2. 尽量避免直接查询数据库( 从缓存(Redis)中去查 )

Redis常用数据类型有哪些?

String(字符串) Hash(哈希表) list(列表) set(集合)  Zset(有序集合) 位图,hyperloglogs

Redis应用场景

  1. 非关系型数据库 2. 高速缓存 String hash 3. 消息队列 list 4. 适合手机短信验证业务 Zset

RDB和AOF 区别

RDB**持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF持久化以日志的形式记录服务器所处理的每一个写操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

Redis是单线程还是多线程 单线程 Redis哨兵机制有没有自己搭建过?

集群有没有搭建过 3主3从? Redis集群哈希槽有多少个?0~16383个槽 ping-pong协议 redis默认有0-15个库 默认使用0号库 集群也是默认都是0号库

Redisson实现分布式锁

Redssion是实现Redis分布式锁的解决方案 Redisson底层采用的是 Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。

问题:常见的分布式锁解决方案

1、基于数据库实现分布式锁 2、基于缓存(redis)使用Redssion 3、基于zookeeper

redis 性能最高 Redssion zookeeper 可靠性最高 数据库实现分布式锁 性能最低

创建线程的方式有几种

1、继承Thread类

2、实现Runnable接口 无返回值

3、实现Callablle接口 有返回值

市面上流行的全文检索技术

Lucene、Solr、ElasticSearch

Lucene的介绍--站内检索

Lucene是apache软件基金会 jakarta项目组的一个子项目, 是一个开放源代码的全文检索引擎工具包 ,但它不是一个完整的全文检索引擎,而 是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引 擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易 用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起 完整的全文检索引擎。 Lucene 是一套用于全文检索和搜寻的开源程式库 舆情监控--通过某些关键字抓取网页的内容---python爬虫 java的Nutch-爬虫 站外搜索 百度蜘蛛系统

Solr的介绍

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API 接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索 引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行 了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查 询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文 搜索引擎。 Solr全文检索引擎 可以存储xml和json的数据结构的数据

ElasticSearch

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力 的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的, 并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。 Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用 方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和 许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受 欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

面试题 Solr和ElasticSearch的区别

Solr可以存储多种数据类型例如XML、JSON。而ElasticSearch只能存储json类型 的数据,ElasticSearch默认是支持分布式多用户的全文检索引擎,近实时搜索。

什么是ElasticSearch

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力 的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的, 并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。 Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用 方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和 许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受 欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

什么是Kibana

kibana是ElasticSearch的数据可视化和实时分析的工具,利用ElasticSearch的 聚合功能,生成各种图表,如柱形图,现状图,饼图等。

ES的基本操作

实际开发中,有2种方式来操作ElasticSearch服务方式 索引库(indexs)-------------------------->数据库(databases) 类型(type)(es6版本还有)------------------>数据表(table) 文档(Document)-------------------------->行(ROW) 字段(Field)----------------------------->列(Columns) 映射(mappings)-------------------------->DDL创建数据库表的语句 第一类:发送http请求(Restful风格)操作:9200 1. 使用postman发送请求操作 2. 使用ElasticSearch中的kibana图形化才操作 第二类:使用java来操作 ElasticSearchTemplate

什么是单点登录

单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决 方案之一。SSO的定义是在多个应用系统中,

用户只需要登录一次就可以访问所有相互信任的应用系统。

用户身份信息独立管理,更好的分布式管理。 可以自己扩展安全策略 跨域不是问题 缺点: 认证服务器访问压力较大。

session共享的解决方案

1、tomcat集群广播机制--节点越多、效率越多 2、SSO单点登录---redis+Cookie+token 认证中心:生成token、返回给用户

搭建认证中心

\1. 通过用户名和密码去数据库查询进行审核 2. 审核通过,生成一个token令牌。 3. 生成token存储到cookie里面 4. 利用redis技术 从cookie取出token,用户携带token访问资源 5. 接下来跳转到其它功能页面

为什么使用MQ

小菜鸟是一家巧克力作坊的老板,生产出美味的巧克力需要三道工序: 1、可可豆磨成可可粉 2、将可可粉加热并加入糖变成巧克力浆 3、将巧克力浆灌入模具,撒上坚果碎,冷却后就是成品巧克力; 最开始的时候,每次研磨出一桶可可粉后,工人就会把这桶可可粉送到加工巧克力浆 的工人手上,然后再回来加工下一桶可可粉

作用:在消息传输过程中缓存消息,用于分布式系统之间进行通信!

开发中消息队列通常有如下优点:

(1) 异步提速: 异步处理任务,将不需要同步处理且耗时长的操作交由消息队列进 行异步处理,大大提高了应用程序的处理时间。

(2) 应用解耦: 应用程序解耦合,MQ充当中介,生产方通过MQ与消费方交互,它 将应用程序解耦合了

(3) 削峰填谷: 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的 突发流量并不常见;如果为以能处理这类峰值访问为标准,来投入资源随时待命无疑 是巨大的浪费。使用MQ能够使关键组件顶住突发的访问压力,而不会因为突发的超 负荷请求而完全崩溃。

(4) 可恢复性: 系统的一部分组件失效时,不会影响到整个系统。MQ降低了程序间 的耦合度,所以即使一个处理消息的挂掉,加入队列中的消息仍然可以在系统恢复后 被再次被改程序处理。 (5) 排序保证: 消息队列可以控制数据处理的顺序,因为消息队列本身使用的是 队列这个数据结构,FIFO(先进先出),在一些场景中,数据处理的顺序很重要,比 如商品下单、抢票、秒杀..等。

总结: MQ特点:异步提速、应用解耦、削峰填谷、可恢复性、排序保证

消息队列产品

ActiveMQ:基于JMS(java Message Server)协议实现, 比较均衡, 不是最 快的, 也不是最稳定的. ZeroMQ:基于C语言开发, 目前最好的队列系统. RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好, 数据基本上不会丢失 RocketMQ:基于JMS,阿里巴巴产品, 目前已经捐献给apahce, 还在孵化器中 孵化. Kafka:类似MQ的产品;分布式消息系统,高吞吐量, 目前最快的消息服务器, 不保证数据完整性.

MQ是消息通信的模型;实现MQ的大致有两种主流方式:AMQP、JMS。

AMQP

AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一 个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议 的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语 言等条件的限制。2006年,AMQP 规范发布。类比HTTP。

JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台 中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消 息,进行异步通信。

AMQP 与 JMS 区别

JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据 交互的格式JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是 跨语言的。JMS规定了两种消息模式;而AMQP的消息模式更加丰富.

RabbitMQ

1、消息基本不会丢 2、时效性比较高,微秒级的 3、并发能力较强

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queuing Protocol 高级消息队列协议)协议实现的消息队列产品,它是一种应用程序之间的 通信方法, 消息队列在分布式系统开发中应用非常广泛。

五种:Hello Word简单模式,work工作模式,Publish/Subscribe发布与订阅模 式,Routing路由模式,Topics主题模式(通配符模式)

应用场景: 1、双十一商品秒杀/抢票功能实现 我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候,就会 发现,界面会提醒我们,让我们稍等,以及一些友好的图片文字提醒。而不是像前几 年的时代,动不动就页面卡死,报错等来呈现给用户。 2、积分兑换(积分可用于多平台) 积分兑换模块,有一个公司多个部门都要用到这个模块,这时候就可以通过消息队列 解耦这个特性来实现。 各部门系统做各部门的事,但是他们都可以用这个积分系统 进行商品的兑换等。其他模块与积分模块完全解耦。 3、大平台用户注册 发送邮件、用户大数据分析操作等 基于同步变异步功能实现 用户注册真实操作步骤: 1. 用户注册选择的兴趣标签,根据用户的属性,行为进行用户分析,计算出推荐内 容 2. 注册后可能需要发送邮件给用户 3. 发送短信给用户 4. 发送给用户指南的系统通知 5. ...等等 正常情况注册,不出现高并发,假如有大量的用户注册,发生了高并发,就会出现 如下情况 : 邮件接口承受不住,或是分析信息时的大量计算使 cpu 满载。这将会出现,虽然用 户数据记录很快的添加到数据库中了,但是执行流程却卡在发邮件或分析用户信息的 情况。导致请求的响应时间大幅增长,甚至出现超时,这就有点不划算了。面对这种 情况一般也是将这些操作放入消息队列(生产者消费者模型),消息队列慢慢的进行 处理,同时可以很快的完成注册请求,不会影响用户使用其他功能。

Spring Boot整合RabbitMQ

在spring boot项目中,只需要引入start-amqp起步依赖,即可整合RabbitMQ成 功;我们基于SpringBoot封装的RabbitTemplate模板对象,可以非常方便的发送 消息,接收消息(使用注解)。

RabbitMQ五种工作模式

Hello World简单模式

P:生产者: 也就是要发送消息的程序 C:消费者: 消息的接受者,会一直等待消息到来。 queue: 消息队列,图中红色部分。可以缓存消息;生产者向其中投递消息,消费 者从其中取出消息。 【最简单消息队列模式】

Work queues工作队列模式

Work Queues与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共 同消费同一个队列中的消息。 应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。 在一个队列中如果有多个消费者,那么消费者之间对于同一个消息的关系是竞争的 关系。 主要作用:多个节点分片任务处理,提升任务处理的效率

Publish/Subscribe发布与订阅模式

发布订阅模式: 1、每个消费者监听自己的队列。 2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队 列,每个绑定交换机的队列都将接收到消息 【广播消息:一次性将消息发送给所有消费者,每个消费者收到消息均一致】

Routing路由模式

路由模式特点:队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key)消息的发送方在向 Exchange发送消息时,也必须指定消 息的RoutingKey。Exchange不再把消息交给每一个绑定的队列,而是根据消息的 Routing Key进行判断,只有队列的Routingkey与消息的Routing key完全一致, 才会接收到消息.

RabbitMQ管理界面操作

\1. 创建两个队列分别叫做 routing_queue1 和 routing_queue2 用户演示 2. 创建交换器 routing_exchange , 类型为 direct , 用于演示路由模式 3. 设置绑定: 将创建的交换器routing_exchange 和 routing_queue1, routing_queue2 绑定在一起, 路由键Routing Key分别为 info 和 error;

Topics通配符模式(主题模式)

Topic类型与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只 不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符! Routingkey: 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert infor.error

模式总结RabbitMQ

工作模式:

简单模式 HelloWorld :

角色:一个生产者、一个队列、一个消费者,不需要交换机(默认交换机)

工作队列模式 Work Queue:

角色:一个生产者、多个队列、多个消费者 (竞争关系) ,不需要交换机 (默认交换机)

发布订阅模式 Publish/subscribe:

角色:一个生产者、一个交换机、多个队列、多个消费者 交换机类型为 ==fanout== (广播类型),并且交换机和队列要进行绑定,不 设置路由键(routing key) 当发送消息到交换机后,交换机会将消息广播发送到绑定的队列

路由模式 Routing:

角色:一个生产者、一个交换机、多个队列、多个消费者 交换机类型为 ==direct== ,并且交换机和队列要进行绑定,并且需要设置 路由键(routing key) 当发送消息到交换机后,交换机会根据路由键(routing key)将消息发送到 队列

通配符模式 Topic:

角色:一个生产者、一个交换机、多个队列、多个消费者 交换机类型为 ==topic== ,并且交换机和队列要进行绑定,并且需要设置 路由键(routing key) 路由键字符串使用通配符,和#,好匹配一个单词,#匹配一个或多个单 词。单词用.分隔 当发送消息到交换机后,交换机会根据路由键(routing key)加通配符将消 息发送到队列

延迟消息有两种实现方案:

1.基于死信队列

(面试题:称为死信的三种情况)

2.集成延迟插件(开发推荐使用这种)

基于死信实现延迟消息

使用RabbitMQ来实现延迟消息必须先了解RabbitMQ的两个概念:

消息的TTL(存活时间) 和 死信Exchange ,通过这两者的组合来实现延迟队 列

消息的TTL(Time To Live)

消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列 设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设 置。超过了这个时间,我们认为这个消息就死了,称之为死信。 如何设置TTL: 我们创建一个队列queue.temp,在Arguments 中添加x-message-ttl 为5000 (单位是毫秒),那所在压在这个队列的消息在5秒后会消失。

可以理解为消息在队列中存活时间 。

死信交换机Dead Letter Exchanges

一个消息在满足如下条件下,会进死信路由,记住这里是路由而不是队列,一个路由 可以对应很多队列。 (1) 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。 也就是说不会被再次放在队列里,被其他消费者使用。 (2)上面的消息的TTL到了,消息过期了。 (3)队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上。 Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有 两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动 触发消息的转发,发送到Dead Letter Exchange中去。

消息成为死信的三种情况:

\1. 消息队列超过限制长度 2. 消费者拒接消息(basicNack),并且不把消息重新放回原队列, requeue=false; 3. 消息过期了

设置死信队列绑定死信交换机:

给队列设置参数: x-dead-letter-exchange 和 x-dead-letter-routing-key

我们现在可以测试一下延迟队列。

(1)创建死信队列

(2)创建交换机

(3)建立交换器与队列之间的绑定

(4)创建队列

基于延迟插件实现延迟消息

Rabbitmq实现了一个插件x-delay-message来实现延时队列

对接支付宝的准备工作

\1. 企业或个体工商户可申请; 2. 提供真实有效的营业执照,且支付宝账户名称需与营业执照主体一致; 3. 网站能正常访问且页面信息有完整商品内容; 4. 网站必须通过ICP备案,个体户备案需与账户主体一致。 (团购类网站不支持个体工商户签约)

支付宝回调异步回调

异步回调有两个重要的职责:

确认并记录用户已付款 , 通知电商模块 。新版本的支付接口已经取消了同步回调的 支付结果传递。所以用户付款成功与否全看异步回调。

接收到回调要做的事情:

1、 验证回调信息的真伪

2、 验证用户付款的成功与否

3、 把新的支付状态写入支付信息表{paymentInfo}中。

4、 通知电商

5、 给支付宝返回回执。

Git介绍

Git是一个免费的,开源的分布式版本控制系统,可以快速高效的处理从小型到大型 的各种项目。 Git易于学习,占地面积小,性能几块,它具有廉价的本科,方便的暂存区域和多个 工作流分支等特性。其性能由于subversion,cvs.persforce\clearCase等版本工 具。

Git历史

同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提 交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开 始启用分布式版本控制系统 BitKeeper 来管理和维护代码。 到 2005 年的时候,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作 关系结束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区 (特别是 Linux的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属 于自己的版本控制系统才不至于重蹈覆辙。他们对新的系统订了若干目标: • 速度 • 简单的设计 • 对非线性开发模式的强力支持(允许上千个并行开发的分支) • 完全分布式 • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

Git和SVN的对比

Svn

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的 都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完 后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工 作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的 话,就郁闷了。

集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握 每个人的开发权限。 但是相较于其优点而言,集中式版本控制工具缺点很明显: 服务器单点故障 容错性差

Git

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完 整的版本库,这样工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然 每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改 了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送 给对方,就可以互相看到对方的修改了。

Git的工作流程

一般工作流程: 1. 从远程仓库中克隆Git资源作为本地仓库 2. 从本地仓库中checkout代码(down代码)然后进行代码修改 3. 在提交代码之前,先把代码提交到暂存区。从暂存区,在提交远程仓库中。 4. 提交修改。提交到本地库。本地仓库中保存修改的各个历史版本 5. 在修改完成后,需要和团队成功共享代码时,可以将代码push到远程仓库。

Git和代码的托管中心

代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库 分为局域网和互联网

局域网  GitLab

互联网  GitHub(国外) Gitee 码云(国内)

什么是分支

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单 独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己 分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副 本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)

分支的好处

同时并行推进多个功能开发,提高开发效率。各个分支在开发过程中,如果某一个分 支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可

秒杀业务

秒杀商品通常有三种限制: 库存限制、时间限制、购买量限制 。

状态位如何同步到集群中的其他节点? (redis集群)

如何控制一个用户只下一个订单? 如何控制库存超买? 如何控制访问压力?

单台Redis,几万的并发

常用的redis数据类型 String hash list set zset redis有0-15个库 redis集群默认使用的是几号库 0号 redis集群有0~16383个槽  用户访问任何一台redis都能得到想要的值,因为里面有一个ping-pong机制

Rabbitmq执行原理

RabbitMQ执行流程 消息生产者投递消息到exchange,Exchange根据某种路由规则路由到队列,消费者只需要监听队列进行消费就行,生产者不需要关心要把消息投送到哪个队列,接收者只需要监听队列进行消费,从而做到解耦。


点击这里复制本文地址 以上内容由兔豪学习分享网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交
qrcode

兔豪学习分享网 © All Rights Reserved.  
豫ICP备18039133号 My title page contents
Powered by zblog Themes by www.tuzi0.com
| 免责声明| 留言建议| 广告合作|