精华内容
下载资源
问答
  • Java后端技术栈笔记

    2020-04-20 23:07:31
    java后端技术栈笔记包括一些常用技术 欢迎一起学习
  • java后端技术栈

    千次阅读 2019-03-11 13:28:59
    文章目录Java基础数据结构算法设计模式单例模式工厂模式数据库框架...java后端技术栈 Java基础 数据结构 算法 设计模式 单例模式 工厂模式 数据库 框架 Spring IOC AOP Spring MVC Mybatis 分布式系统 大数据...

    一直想做一个java后端比较全面的技术栈博客系列,最近终于开始着手做了。

    Java基础


    集合类


    List

    Map

    Set

    多线程并发

    todo

    多线程并发

    IO

    todo

    缓存

    todo

    JDK中的设计模式

    细数JDK中的设计模式

    JVM

    JVM调优工具
    JVM性能调优

    Java8

    Stream

    Java8 Stream

    Lambda

    todo

    数据结构


    数组

    todo

    链表

    todo

    队列

    todo

    todo

    hash表

    todo

    todo

    todo

    todo

    算法


    查找算法

    二分查找
    todo

    排序算法

    todo

    KMP算法

    树常用算法

    深度优先 todo
    广度优先 todo

    分治

    todo

    回溯

    todo

    贪心算法

    todo

    动态规划

    todo

    海量数据处理常用算法

    BitMap todo
    Bloom Filter todo

    设计模式


    设计模式

    创建型


    todo

    单例模式

    工厂模式

    结构型


    todo

    行为型


    模板方法

    todo

    数据库


    Mysql

    Mysql学习

    常用框架


    Mybatis

    todo

    Spring

    todo
    Spring学习

    IOC

    AOP

    Spring MVC

    todo

    Spring boot

    todo
    Spring bootx学习

    工具框架

    Apache Commons todo
    Guava todo

    日志框架

    log4j todo
    logback todo

    定时任务框架

    Quartz

    todo

    分布式定时调度

    Elastic-Job todo

    分布式系统


    一致性

    一致性协议

    2pc todo
    3pc todo
    TCC todo

    一致性算法

    Raft todo
    Paxos todo

    分布式事务

    CAP todo
    BASE todo
    分布式事务学习

    分布式锁

    redis实现
    zookeeper实现
    todo

    幂等

    乐观锁MVCC
    利用表的唯一索引
    一次性token
    todo

    RPC远程调用框架

    todo
    Dubbo实现原理 todo

    分布式id生成

    分布式id生成

    负载均衡

    软负载常用算法 todo

    通信框架

    netty todo

    中间件

    分布式缓存

    Redis学习
    todo

    消息队列

    todo

    数据库中间件

    todo
    Sharding-JDBC
    Mycat todo

    zookeeper

    todo

    服务治理

    服务注册与发现 todo
    服务治理框架 todo

    微服务

    微服务学习

    配置中心

    Apollo配置中心
    todo

    限流降级

    todo

    高并发系统限流

    高并发系统限流

    运维

    Docker

    Docker学习

    k8s

    大数据


    大数据学习之路
    别人的大数据学习之路

    Hadoop

    Hadoop学习

    HDFS

    HDFS学习

    MapReduce

    HBase

    HBase

    Hive

    Hive学习

    流失计算

    Spark

    Spark学习

    Storm

    搜索引擎

    OLAP

    todo

    Linux


    linux常用命令

    测试

    单元测试

    todo

    TDD

    TDD测试驱动开发

    A/B Test

    《技术干货 | AB 测试和灰度发布探索及实践》

    设计思想

    DDD

    todo

    代码规范

    阿里巴巴Java开发手册
    todo
    RESTful api接口规范

    代码重构

    todo

    大型网站架构设计及优化

    大型网站架构设计及优化

    架构师

    架构师成长之路

    书籍推荐


    后端开发书籍推荐
    大数据书籍推荐

    参考文献

    《后端架构师技术图谱》

    展开全文
  • 后端技术栈方向指引

    2021-08-18 14:13:34
    后端技术栈方向指引 后端基础框架: Springboot Springcloud Nacos 数据持久层: Mybatis MybatisPlus 后端构建: gradle 接口文档: Swagger2 数据库: Mysql Redis MongDB Elasticsearch 发布部署: ...

    后端技术栈方向指引

    后端基础框架:

    • Springboot
    • Springcloud
    • Nacos

    数据持久层:

    • Mybatis
    • MybatisPlus

    后端构建:

    • gradle

    接口文档:

    • Swagger2

    数据库:

    • Mysql
    • Redis
    • MongDB
    • Elasticsearch

    发布部署:

    • Docker
    • Portainer

    前端技术栈配合性补充:

    • 前端基础框架
      • Vue.js
      • ElementUI
    • 前端可视化库
      • ECharts
      • OpenLayers
      • D3.js
      • Cesium.js
    展开全文
  • 后端技术栈科普 前言 由于我毕业设计做基于Java的在线小说发布系统,所以前后端都涉及。虽然以前端为主,但是后端的科普还是需要的。好久没碰后端了,对后端有些生疏了。 参考文章:Java开源项目之「自学编程之路...

    后端技术栈科普

    前言

    由于我毕业设计做基于Java的在线小说发布系统,所以前后端都有涉及。虽然以前端为主,但是后端的科普还是需要的。好久没碰后端了,对后端有些生疏了。

    参考文章:Java开源项目之「自学编程之路」:学习指南+面试指南+资源分享+技术文章

    参考书籍江南一点雨大佬写的《springboot+vue全栈开发实战》

    参考Java团长的博客。

    我打算分三个部分讲后端技术栈:历史、学习框架、学习路线。

    后端技术发展

    Java后端程序员都做些什么?

    后端技术发展

    原始阶段

    一开始每个程序员都是全栈,前后端一起搞定。后端用jsp,前端用HTML、css、JavaScript

    前后端分离阶段

    但是随着大家对浏览器页面的视觉和交互的要求越来越高,开始出现reactjs框架进行前后端分离。后端的工程师只负责提供接口和数据,专注于业务逻辑的实现,前端取到数据后在浏览器中展示。前端用reactjs,后端用SSM 。

    分布式阶段

    但是虽然用户越来越多,单机部署的小小war包撑不住,于是分布式应运而生。原来的单个Tomcat得变成Tomcat的集群,前边弄个Web服务器做请求的负载均衡,不仅如此,还得考虑状态问题,session的一致性。

    业务越来越复杂,我们不得不把某些业务放到一个机器(或集群)上,把另外一部分业务放到另外一个机器(或集群)上,虽然系统的计算能力,处理能力大大增强,但是这些系统之间的通信就变成了头疼的问题,消息队列(MQ),RPC框架(如Dubbo)应运而生,为了提高通信效率,各种序列化的工具(如Protobuf)也争先空后地问世。

    单个数据库也撑不住了,那就做数据库的读写分离,如果还不行,就做分库和分表,把原有的数据库垂直地切一切,或者水平地切一切, 但不管怎么切,都会让应用程序的访问非常麻烦,因为数据要跨库做Join/排序,还需要事务,为了解决这个问题,又有各种各样“数据访问中间件”的工具和产品诞生。

    为了最大程度地提高性能,缓存肯定少不了,可以在本机做缓存(如Ehcache),也可以做分布式缓存(如Redis),如何搞数据分片,数据迁移,失效转移,这又是一个超级大的主题了。

    互联网用户喜欢上传图片和文件,还得搞一个分布式的文件系统(如FastDFS),要求高可用,高可靠。

    数据量大了,搜索的需求就自然而然地浮出水面,你得弄一个支持全文索引的搜索引擎(如Elasticsearch ,Solr)出来。

    林子大了,什么鸟都有,必须得考虑安全,数据的加密/解密,签名、证书,防止SQL注入,XSS/CSRF等各种攻击。

    自动部署阶段

    由于系统越来越多,还都是分布式的,每次上线,运维十分难以把这么多系统协调好。于是出现了docker,可以持续集成、自动化部署、自动化测试。开发、测试、生成环境都保持一致。系统原来只是在环境(如Ngnix, JVM,Tomcat,MySQL等)上部署代码,现在把代码和环境一并打包,运维效率大大提升。

    公司自己购买服务器比较贵,维护也麻烦,又难以弹性增长,于是虚拟服务器出来了,硬盘和内存都动态扩展,云计算出现。

    随着时间发展,各个公司和系统手机的数据越来越多。于是大数据出来了,通过数据分析,把用户的购买、阅读、浏览习惯推荐给他东西。不过由于这些数据实在太多了,用传统方法需要计算好几天甚至好几个月,于是用分布式的技术,讲计算分到各个计算机去,最后再把计算结果返回,Hadoop应运而生。

    互联网系统架构演进

    参考博客:互联网系统架构演进之路

    原始阶段

    一台服务器既处理文件又处理数据库。技术栈Linux+Apache+mysql+PHP

    应用服务与数据服务分离

    随着数据越来越多,应用服务器、数据库服务器、文件服务器开始各司其职。

    分布式服务器与数据库

    但是数据还是越来越多,于是分布式缓存服务器应运而生。

    继续随着时代发展,网站访问经常出现高峰期,应用服务器成了整个网站的瓶颈。于是应用服务器集群出现。负载均衡调度服务器控制应用服务器集群。

    还是随着时代发展,数据库成了瓶颈。于是数据库读写分离。出现数据访问模块mybatis。

    随着用户规模越来越大,发布范围越来越广,地域网络环境差别很大,为保证用户访问体验,反向代理和CDN加深出现。

    单文件服务器、单数据库服务器存不下日益增多的数据。于是分布式文件系统和分布式数据库系统出现。

    image-20201003101747782

    随着数据库的存储需求和检索需求越来越复杂,nosql和搜索引擎出现

    随着业务越来越复杂,迭代周期越来越快,业务拆借出现。

    大数据技术、监控、日志分析系统

    • 大数据:Hadoop、Spark
    • 系统监控:Zabbix、ElasticSearch+beats+Kibana
    • 集中式日志分析系统:ELK

    image-20201003102822153

    后端技术的演变和服务器架构的演变息息相关,两者互相印证。

    学习框架

    JavaGuideJavaCollection

    主要介绍springboot一家。介绍的同时也给自己扫盲。

    起因是看到mall项目的后端的技术栈,有些自己没接触过。所以扫一下盲。

    按相关性分三部分

    业务功能:容器(springboot)、系统间通信(rabbitMQ)、安全(SpringSecurity)、jwt(json web token)、接口文档(swaggerUI)、搜索(elasticsearch);

    数据库:mybatis(对象关系映射)、Redis(分布式缓存)、MongoDB(NOSQL);

    部署:容器(docker)、logStash(日志收集工具)、自动部署工具(Jenkins);

    技术说明官网
    SpringBoot容器+MVC框架https://spring.io/projects/spring-boot
    SpringSecurity认证和授权框架https://spring.io/projects/spring-security
    MyBatisORM框架http://www.mybatis.org/mybatis-3/zh/index.html
    MyBatisGenerator数据层代码生成http://www.mybatis.org/generator/index.html
    PageHelperMyBatis物理分页插件http://git.oschina.net/free/Mybatis_PageHelper
    Swagger-UI文档生产工具https://github.com/swagger-api/swagger-ui
    Hibernator-Validator验证框架http://hibernate.org/validator
    Elasticsearch搜索引擎https://github.com/elastic/elasticsearch
    RabbitMQ消息队列https://www.rabbitmq.com/
    Redis分布式缓存https://redis.io/
    MongoDBNoSql数据库https://www.mongodb.com
    Docker应用容器引擎https://www.docker.com
    Druid数据库连接池https://github.com/alibaba/druid
    OSS对象存储https://github.com/aliyun/aliyun-oss-java-sdk
    MinIO对象存储https://github.com/minio/minio
    JWTJWT登录支持https://github.com/jwtk/jjwt
    LogStash日志收集工具https://github.com/logstash/logstash-logback-encoder
    Lombok简化对象封装工具https://github.com/rzwitserloot/lombok
    Jenkins自动化部署工具https://github.com/jenkinsci/jenkins

    技术:SpringBoot

    说明:容器+MVC框架

    官网:https://spring.io/projects/spring-boot

    官网介绍:通过Spring Boot,可以轻松地创建独立的,基于生产级别的基于Spring的应用程序,并且可以“运行”它们。我们对Spring平台和第三方库持固执己见的观点,因此您可以以最小的麻烦开始使用。大多数Spring Boot应用程序需要最少的Spring配置。

    image-20201003112122944

    技术:RabbitMQ

    说明:消息队列(处理各个系统之间的通信)

    官网:https://www.rabbitmq.com/

    官网介绍:RabbitMQ轻巧,易于在内部和云中部署。它支持多种消息传递协议。RabbitMQ可以部署在分布式和联合配置中,以满足大规模,高可用性的要求。

    补充:还有RocketMQQ、Kafka也做消息队列

    image-20201003140133446

    技术:JWT

    说明:JWT登录支持

    官网:https://github.com/jwtk/jjwt

    官网介绍:适用于Java和Android的JSON Web令牌

    image-20201003140251013

    技术:SpringSecurity

    说明:认证和授权框架

    官网:https://spring.io/projects/spring-security

    官网介绍:Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。致力于为Java应用程序提供身份验证和授权。

    补充:除了springsecurity,还有Oauth2、shiro也可以提高安全框架。

    image-20201003140315402

    技术:Swagger-UI

    说明:文档生产工具

    官网:https://github.com/swagger-api/swagger-ui

    官网介绍:Swagger UI是HTML,JavaScript和CSS的集合,这些文件在Swagger兼容的API动态生成漂亮的文档。

    补充说明:前后端分离已经逐渐成为互联网项目一种标准的开发方式。但是项目开发中的沟通成本也随之升高,这部分沟通成本主要在于前端开发人员与后端开发人员对WebAPI接口的沟通,Swagger2 就可以很好地解决,它可以动态生成Api接口文档,降低沟通成本,促进项目高效开发。

    image-20201003140554593

    补充说明:

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

    作用:

    • 接口的文档在线自动生成。
    • 功能测试。

    Swagger是一组开源项目,其中主要要项目如下:

    1. Swagger-tools:提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger 2.0文档等功能。
    2. Swagger-core: 用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF…)、Servlets和Play框架进行集成。
    3. Swagger-js: 用于JavaScript的Swagger实现。
    4. Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
    5. Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
    6. Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。

    技术:Elasticsearch

    说明:搜索引擎

    官网:https://github.com/elastic/elasticsearch

    官网介绍:Elasticsearch是为云构建的分布式RESTful搜索引擎。开源,分布式,RESTful搜索引擎

    image-20201003141530580

    技术:MyBatis

    说明:ORM框架

    官网:http://www.mybatis.org/mybatis-3/zh/index.html

    官网介绍:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

    image-20201003141636868

    技术:Redis

    说明:分布式缓存

    官网:https://redis.io/

    官网介绍:Redis是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。

    补充:Redis是key-values数据库。比SQL数据库在某些方面十分有优势。

    image-20201003141726016

    技术:MongoDB

    说明:NoSql数据库

    官网:https://www.mongodb.com

    官网介绍:MongoDB是为现代应用程序开发人员和云时代构建的基于文档的通用分布式数据库。

    image-20201003141834183

    技术:LogStash

    说明:日志收集工具

    官网:https://github.com/logstash/logstash-logback-encoder

    官网介绍:针对JSON和其他Jackson数据格式的高度可配置的通用结构化日志记录机制。输出的结构及其包含的数据是完全可配置的。

    image-20201003142158694

    技术:Jenkins

    说明:自动化部署工具

    官网:https://github.com/jenkinsci/jenkins

    官网介绍:Jenkins是领先的开源自动化服务器。它使用Java构建,提供了1700多个插件来支持几乎任何东西的自动化,从而使人类实际上可以将时间花在做机器无法做到的事情上。

    image-20201003141930932

    技术:Docker

    说明:应用容器引擎

    官网:https://www.docker.com

    官网介绍:

    image-20201003142044610

    学习之路

    java学习路线图

    学习Java后端。说白了就两条线,一条线是学Java,一条线是学数据库和HTTP协议;Java+HTTP=servlet=》spring=》springboot;java+mysql=JDBC=》mybatis;

    第一阶段。了解Java的基础语法、面对对象思想、集合反射、泛型等概念和数据库基础。以及使用对应开发工具。

    面向对象(Java)的学习笔记汇总

    这段时间使用eclipse的心得

    数据库的摘要学习

    MySQL数据库和Navicat的简单使用

    第二阶段。理解servlet,JDBC;有了这些基础就了解spring、mybatis、springmvc。并且用SSM框架开发一个网站。

    对SSM的理解

    第三阶段,学习springboot技术栈。(这一部分我没深入过)

    一位资深程序员大牛给予Java初学者的学习路线建议

    学习Java在各个阶段做的重点也是各不相同的。

    第一阶段(未做过Java):多学多练;

    第二阶段(工作一年内):深入Java

    第三阶段(工作两年):多考虑设计模式

    第四阶段(工作三年):深入理解虚拟机,看源码;

    第五阶段(工作四年):选择一个定位深入,如大数据、分布式等;

    最后多交流,多发表,多学习。

    总结

    暂时写到这。

    更新地址:GitHub

    更多内容请关注:CSDNGitHub掘金

    展开全文
  • 后端技术栈

    千次阅读 2020-09-14 15:09:27
    说到后端开发,难免会遇到各种所谓高大上的「关键词」,对于我们应届生小白,难免会觉得比较陌生,因为在学校确实比较少遇见这些所谓高大上的东西,那么今天就带着学习的态度和大家分享这些看似可以装逼可以飞的带...

    说到后端开发,难免会遇到各种所谓高大上的「关键词 」,对于我们应届生小白,难免会觉得比较陌生,因为在学校确实比较少遇见这些所谓高大上的东西,那么今天就带着学习的态度和大家分享这些看似可以装逼可以飞的带逼格的关键词吧。

    大纲


    1 分布式

    在学校里的项目中,一个 Web 系统可能咋们一个人就搞定,因为几乎不考虑并发量,性能咋样,所谓「过得去 」足矣,但是为了面试考虑,我们又不得不找点类似秒杀系统作为我们简历的支撑项目(即使已经烂大街)。那么先问你第一个问题,为什么就采用了分布式的方案落地这个项目?

    当一个人或者几十个使用你的系统,哎呀我去,请求秒回,效果倍棒,于是乎简历砰砰写上却多么牛X,当面试官就会问你你这项目做了啥,测试过没,并发量如何,性能如何?你就…..

    不懂就蹭

    当访问系统的用户越来越多,可是我们的系统资源有限,所以需要更多的 CPU 和内存去处理用户的计算请求,当然也就要求更大的网络带宽去处理数据的传输,也需要更多的磁盘空间存储数据。资源不够,消耗过度,服务器崩溃,系统也就不干活了,那么在这样的情况怎么处理?

    • 垂直伸缩

    纵向生长。通过提升单台服务器的计算处理能力来抵抗更大的请求访问量。比如使用更快频率的CPU,更快的网卡,塞更多的磁盘等。其实这样的处理方式在电信,银行等企业比较常见,让摩托车变为小汽车,更强大的计算机,处理能力也就越强,但是对于运维而言也就越来越复杂。那真的就这样花钱买设备就完事了?

    当然不,单台服务器的计算处理能力是有限的,而且也会严重受到计算机硬件水平的制约。

    • 水平伸缩

    一台机器处理不过来,我就用多台廉价的机器合并同时处理,人多力量大嘛,通过多台服务器构成分布式集群从而提升系统的整体处理能力。这里说到了分布式,那我们看看分布式的成长过程

    记住一句话:系统的技术架构是需求所驱动

    • 最初的单体系统,只需要部分用户访问,

      单体结构

    做系统的原因当然是有需求,有价值,可赚钱。随着使用系统的用户越来越多,这时候关注的人越来越多,单台服务器扛不住了,关注的人觉得响应真慢,没啥意思,就开始吐槽,但是这一吐槽,导致用户更多,毕竟大家都爱吃瓜。

    来自网络吃瓜

    这样下去不得不进行系统的升级,将数据库和应用分离。

    数据库应用分离

    这样子,咋们将数据库和应用程序分离后,部署在不同的服务器中,从1台服务器变为多台服务器,处理响应更快,内容也够干,访问的用户呈指数增长,这多台服务器都有点扛不住了,怎么办?

    加一个缓存吧,我们不每次从数据库中读取数据,而将应用程序需要的数据暂存在缓冲中。缓存呢,又分为本地缓存分布式的缓存。分布式缓存,顾名思义,使用多台服务器构成集群,存储更多的数据并提供缓存服务,从而提升缓存的能力。

    加了缓存哪些好处?

    • 应用程序不再直接访问数据库,提升访问效率。因为缓存内容在内存中,不用每次连接存放磁盘中的数据库,

    系统越来越火,于是考虑将应用服务器也作为集群

    集群

    2 缓存架构

    干啥啥不行,缓存第一名。不吹牛,缓存应用在计算机的各个角落。缓存可说是软件技术中的的杀手锏,无论是程序代码使用buffer,还是网络架构中使用缓存,虚拟机也会使用大量的缓存。其实最初在CPU中也就开始使用缓存。缓存分为两种,一种是通读缓存,一种是旁路缓存

    • 通读缓存

    假设当前应用程序获取数据,如果数据存在于通读缓存中就直接返回。如果不存在于通读缓存,那么就访问数据源,同时将数据存放于缓存中。下次访问就直接从缓存直接获取。比较常见的为CDN反向代理

    通读缓存

    CDN

    CDN称为内容分发网络。想象我们京东购物的时候,假设我们在成都,如果买的东西在成都仓库有就直接给我们寄送过来,可能半天就到了,用户体验也非常好,就不用从北京再寄过来。同样的道理,用户就可以近距离获得自己需要的数据,既提高了响应速度,又节约了网络带宽和服务器资源。

    • 旁路缓存

    应用程序需要自己从数据源读取数据,然后将这个数据写入到旁路缓存中。这样,下次应用程序需要数据的
    时候,就可以通过旁路缓存直接获得数据了

    旁路缓存

    缓存的好处

    • 因为大部分缓存的数据存储在内存中,相比于硬盘或者从网络中获取效率更高,响应时间更快,性能更好

    • 通过 CDN 等通读缓存可以降低服务器的负载能力。

    • 因为缓存通常会记录计算结果。如果缓存命中直接返回,否则需要进行大量的运算。所以使用缓存也减少了CPU 的计算小号,加快处理速度

    缓存缺点

    我们缓存的数据来自源数据,如果源数据被修改了,俺么缓存数据很肯能也是被修改过的,成为脏数据,所以怎么办?

    • 过期失效

    在每次写入缓存数据的时候标记失效时间,读取数据的时候检查数据是否失效,如果失效了就重新从数据源获取数据。、

    • 失效通知

    应用程序在更新数据源的时候,通知清除缓存中的数据。

    是不是数据使用缓存都有意义呢?

    非也,通常放入缓存中的数据都是带有热点的数据,比如当日热卖商品,或者热门吃瓜新闻,这样将数据存放在缓存中,会被多次读取,从而缓存的命中率也会比较高

    3 异步架构

    在前面中,通过缓存实际上很多时候是解决了读的问题,加快了读取数据的能力。因为缓存通常很难保证数据的持久性和一致性,所以我们通常不会将数据直接写入缓存中,而是写入 RDBMAS 等数据中,那如何提升系统的写操作性能呢?

    此时假设两个系统分别为A,B,其中A系统依赖B系统,两者通信采用远程调用的方式,此时如果B系统出故障,很可能引起A系统出故障。

    从而不得不单独进行升级,怎么办?

    使用消息队列的异步架构,也成为事件驱动模型。

    异步相对于同步而言,同步通常是当应用程序调用服务的时候,不得不阻塞等待服务期完成,此时CPU空闲比较浪费,直到返回服务结果后才会继续执行。

    同步

    举个例子,小蓝今天想在系统中加一个发邮件的功能,通过SMTP和远程服务器通信,但是远程服务器有很多邮件需要等待发送呢,当前邮件就可能等待比较长时间才能发送成功,发送成功后反馈与应用程序。这个过程中,远程服务器发送邮件的时候,应用程序就阻塞,准确的说是执行应用程序的线程阻塞。

    这样阻塞带来什么问题“?

    • 不能释放占用的系统资源,导致系统资源不足,影响系统性能

    • 无法快速给用户响应结果

    但是在实际情况中,我们发送邮件,并不需要得到发送结果。比如用户注册,发送账号激活邮件,无论邮件是否发送成功都会收到"返回邮件已经发送,请查收邮件确认激活",怎样才能让应用程序不阻塞?

    消息队列的异步模型

    此时就比较清晰了,调用者将消息发送给消息队列直接返回,应用程序收到返回以后继续执行,快读响应用户释放资源。有专门的消费队列程序从中消息队列取出数据并进行消费。如果远程服务出现故障,只会传递给消费者程序而不会影响到应用程序。

    消息队列

    消息队列模型中通常有三个角色,分别为生产者消息队列消费者。生产者产生数据封装为消息发送给消息队列,专门的消费程序从消息队列中取出数据,消费数据。在我看来,消息队列主要是缓冲消息,等待消费者消费。其中消费的方式分为两种

    • 点对点

    对生产者多消费者的情况。一个消息被一个消费者消费

    多生产消费

    上述的发邮件例子就是典型的点对点模式。互不干扰,其中某个服务出现问题不会印象到全局

    • 订阅模式

    开发人员在消息队列中设置主题,生产者往相应的主题发送数据,消费者从对应的主题中消费数据,每个消费者按照自己业务逻辑分别进行计算

    订阅模式

    这个比较好理解,比如在用户注册的时候,我们将注册信息放入主题用户中,消费者订阅了这个主题,可能有构造短信消息的消费者,也有推广产品的消费者,都可以根据自己业务逻辑进行数据处理。

    用户注册案例

    使用异步模型的优点

    • 快速响应

    不在需要等待。生产者将数据发送消息队列后,可继续往下执行,不虚等待耗时的消费处理

    • 削峰填谷(需要修改)

    互联网产品会在不同的场景其并发请求量不同。互联网应用的访问压力随时都在变化,系统的访问高峰和低谷的并发压力可能也有非常大的差距。如果按照压力最大的情况部署服务器集群,那么服务器在绝大部分时间内都处于闲置状态。但利用消息队列,我们可以将需要处理的消息放入消息队列,而消费者可以控制消费
    速度,因此能够降低系统访问高峰时压力,而在访问低谷的时候还可以继续消费消息队列中
    未处理的消息,保持系统的资源利用率

    • 降低耦合

    如果调用是同步,如果调用是同步的,那么意味着调用者和被调用者必然存在依赖,一方面是代码上的依赖,应用程序需要依赖发送邮件相关的代码,如果需要修改发送邮件的代码,就必须修改应用程序,而且如果要增加新的功能

    那么目前主要的消息队列有哪些,其有缺点是什么?(好好记下这个高频题目啦)

    4 负载均衡

    一台机器扛不住了,需要多台机器帮忙,既然使用多台机器,就希望不要把压力都给一台机器,所以需要一种或者多种策略分散高并发的计算压力,从而引入负载均衡,那么到底是如何分发到不同的服务器的呢?

    砸钱

    最初实现负载均衡采取的方案很直接,直接上硬件,当然也就比较贵,互联网的普及,和各位科学家的无私奉献,各个企业开始部署自己的方案,从而出现负载均衡服务器

    HTTP重定向负载均衡

    也属于比较直接,当HTTP请求叨叨负载均衡服务器后,使用一套负载均衡算法计算到后端服务器的地址,然后将新的地址给用户浏览器,浏览器收到重定向响应后发送请求到新的应用服务器从而实现负载均衡,如下图所示

    HTTP重定向负载均衡

    优点:

    • 简单,如果是java开发工程师,只需要servlet中几句代码即可

    缺点:

    • 加大请求的工作量。第一次请求给负载均衡服务器,第二次请求给应用服务器

    • 因为要先计算到应用服务器的 IP 地址,所以 IP 地址可能暴露在公网,既然暴露在了公网还有什么安全可言

    DNS负载均衡

    了解计算机网络的你应该很清楚如何获取 IP 地址,其中比较常见的就是 DNS 解析获取 IP 地址。用户通过浏览器发起HTTP请求的时候,DNS 通过对域名进行即系得到 IP 地址,用户委托协议栈的 IP 地址简历 HTTP 连接访问真正的服务器。这样不同的用户进行域名解析将会获取不同的IP地址从而实现负载均衡

    DNS负载均衡

    乍一看,和HTTP重定向的方案不是很相似吗而且还有 DNS 解析这一步骤,也会解析出 IP 地址,不一样的暴露?每次都需要解析吗,当然不,通常本机就会有缓存,在实际的工程项目中通常是怎么样的呢

    • 通过 DNS 解析获取负载均衡集群某台服务器的地址

    • 负载均衡服务器再一次获取某台应用服务器,这样子就不会将应用服务器的 IP 地址暴露在官网了

    反向代理负载均衡

    这里典型的就是Nginx提供的反向代理和负载均衡功能。用户的请求直接叨叨反向代理服务器,服务器先看本地是缓存过,有直接返回,没有则发送给后台的应用服务器处理。

    反向代理负载均衡

    IP负载均衡

    上面一种方案是基于应用层的,IP很明显是从网络层进行负载均衡。TCP./IP协议栈是需要上下层结合的方式达到目标,当请求到达网络层的黑猴。负载均衡服务器对数据包中的IP地址进行转换,从而发送给应用服务器

    IP负载均衡

    注意,这种方案通常属于内核级别,如果数据比较小还好,但是大部分情况是图片等资源文件,这样负载均衡服务器会出现响应或者请求过大所带来的瓶颈

    数据链路负载均衡

    它可以解决因为数据量他打而导致负载均衡服务器带宽不足这个问题。怎么实现的呢。它不修改数据包的IP地址,而是更改mac地址。应用服务器和负载均衡服务器使用相同的虚拟IP

    数据链路负载均衡

    以上介绍了几种负载均衡的方式,但是很重要的负载均衡算法却没有设计,其中包含了轮询,随机,最少连接,下面分别对此进行介绍

    5 数据存储

    公司存在的价值在于流量,流量需要数据,可想而知数据的存储,数据的高可用可说是公司的灵魂。那么改善数据的存储都有哪些手段或方法呢

    • 数据主从复制

    主从复制比较好理解,需要使用两个数据库存储一样的数据。其原理为当应用程序A发送更新命令到主服务器的时候,数据库会将这条命令同步记录到Binlog中,然后其他线程会从Binlog中读取并通过远程通讯的方式复制到另外服务器。服务器收到这更新日志后加入到自己Relay Log中,然后SQL执行线程从Relay Log中读取次日志并在本地数据库执行一遍,从而实现主从数据库同样的数据。

    主从复制

    主从复制可以方便进行读写分离,可以使用一主多从的方式保证高可用,如果从数据库A挂了,可以将读操作迁移到从数据库完成高可用。但是如果主数据库挂了咋搞,那就Mysql的主主复制。可是不管上面说的那种方式都不是提升它的存储能力,这就需要进行数据库的分片

    • 数据库分片

    将一张表分成若干片,其中每一片都包含一部分行记录,然后将每一片存储在不同的服务器中,这样就实现一张表存放在多台服务器中,哪都有哪些分片存储的方案?

    最开始使用"硬编码"的方式,此方式从字面上可以理解为直接在代码中指定。假定表为用户表,通过ID的奇偶存放在不同的服务器上,如下图

    在这里插入图片描述

    这种方式的缺点很明显,当需要增加服务器的时候,就需要改动代码,这就不友好了。比较常见的数据库分片算法是通过余数Hash算法,根据主键ID和服务器的数量取模,根据余数确定服务器。

    6 搜索引擎

    我们使用谷歌浏览器的时候,输入搜索关键字,就会出现搜索到多少条结果,用时多少,它是如何做到在如此短的时间完成这么大数据量的搜索。

    先来想第一个问题,全世界这么多网页在哪里?

    互联网的存在让你和我隔着屏幕都知道你多帅。当然,每个网页中都会存在很多其他网页的超链接,这样构成了庞大的网络。对于搜索引擎而言,目标为解析这些网页获取超链接,下载链接内容(过滤),具体一些说。

    将URL存放于池子中,从池子中取出URL模拟请求,下载对应的HTML,并存放于服务器上,解析HTML内容时如果有超链接URL,检测是否已经爬取过,如果没有暂存队列,后面再依次爬取。架构图如下

    爬虫常规方法

    将获取的所有网页进行编号并得到网页集合。然后通过分词技术获得每一个单词,组成矩阵如下所示

    分词

    就这样按照单词-文档的方式组织起来就叫做倒排索引了。

    倒排索引

    Google通过建立<单词,地址>这样的文档,主要搜索到单词就能定位到文档的地址列表,然后根据列表中文档的编号就展现文档信息从而实现快速的检索。

    如果搜索出来结果很多,Google是如何能更精准的将我们需要的信息呈现给我们呢。它很明显有个排序功能,那是如何排序的

    Google使用了一种叫做"PageRank"的算法,通过计算每个网页的权重,并按照权重排序,权重高的自然就在显示在前面,那问题来了,为啥权重高的,排在前面的通常就是用户所需要的呢?这就得了解下pagerank算法了

    在pagerank中,如果网页A包含网页B说明A认可B,即投一票。如下图ABCD四个网页所示,箭头代表超链接的方向,比如A->B代表A网页包含B的超链接

    pagerank

    怎么计算的?

    ABCD 初始值都为1,然后根据关系计算权重。比如此时B包含了AD两个网页,那么权重1被分为两个1/2分别给A和D,此时A包含BCD,那么此时A页面新的权重为1/2 + 1/3 + 1 = 11/6

    pagerank 值越受推荐,代表用户越想看到。基于每个网页的 pagerank 值对倒排索引中的文档列表排序,靠前者则是用户想看到的文档。

    这种是因为超链接,引入权值的方式排序。还有其他诸如对于商品售卖次数排序或者电影点赞或评价分数排序。还有通过关键字查找,希望找到和搜索词相关,这个时候可能就会采用词频TF进行排序,词频代表所查词和文档的相关程度

    词频TF

    比如我们搜索"Java后端"出现的结果以"后端"的相关技术。

    在大部分的应用中都会涉及到搜索引擎技术,技术庞大且复杂,希望各位老铁根据自身情况搜索相关所需学习,校招面试中不出现盲点即可。

    7 微服务

    技术的引进一定是想解决某个痛点。我不希望在一个系统中,一小点改动就影响到全局,希望各个功能模块拆分清晰,不管是测试还是运维都能节省更多的时间。

    那么单体的架构出现了哪些问题?

    • 代码分支管理困难

    各个部门分别完成各自的任务,但是最后需要 merge 在一起成为整个系统,merge过程经历的人都知道,问题是真XX多。所以不再是996

    • 新增功能麻烦

    随着项目的效益越来越好,用户的需求也更多,招聘的人可能更多,对于新手来说上来是一脸懵逼的,老员工忙的要死,新员工成为了摸鱼专家

    • 耗尽连接

    用户的增多,每个应用都得和数据库连接,给数据库的连接造成太大的压力甚至耗尽连接

    微服务

    “微"-------微微一笑很倾城,微笑,微小。顾名思义,讲一个大的系统,拆分为一个个小的服务,分别对各个小服务进行管理。这样说感觉太不专业了,专业点

    • 大应用拆分为小模块

    • 小模块不属于集群中

    • 通过远程调用的方式依赖各个独立的模块完成业务的处理

    这些小的模块就叫做------微服务,整体也就是所谓的微服务架构。

    既然拆分成了小服务,这么多小服务怎么协调成为一个问题,甚至都不知道怎么掉这个服务,所以在微服务的整体架构中出现了注册中心,谁需要调用使用提供的接口即可。如下图所示

    注册中心

    从上图我们能知道主要是三个概念

    • 服务提供者

    微服务的具体提供者,其他微服务通过接口调用即可

    • 服务消费者

    对应于服务提供者,按照提供者接口编程即可。这么轻松的嘛,当然很多细节。举个例子,注明的dubbo服务框架,服务接口通过Dubbo框架代理机制访问Dubbo客户端,客户端通过服务接口声明去注册中心查看有哪些服务器,并将这服务器列表给客户端。客户端然后根据负载均衡策略选择其中一个服务器,通过远程调用的方式发送服务调用。那么使用微服务需要注重哪几点

    选择中的注意事项

    不要拿工具硬上需求,结合业务也许会更佳

    8 高可用

    高可用,意味着一台机器挂了没事,其他机器可以照常工作,用户体验一样倍棒,用户压根就不知道,卧槽,你居然升级了系统,我居然一点感受都没有。那么高可用总有个标准吧,是百分之80就行还是90?

    一个系统突然不能访问的原因很多,

    • 硬件故障

    • 数据库宕机

    • 磁盘孙欢

    • bug

    • 光缆断了

    可用性指标

    通过多少个9来衡量,比如大宝系统可用性为4个9,意味着是99.99%,说明它的服务保证运行时间只有0.01不可用。

    高可用涉及到技术成本和设备成本,不是说高可用值越高越好,而是根据具体工具具体场景而定,这里分享一些高可用策略

    冗余备份

    任何一个服务都有备份,就反复我们都会对我们笔记本电脑相关文件进行备份一样,以防万一。即使一台服务器挂了,可以很快的切换以致于让用户不会觉得"这系统怎么这么渣"。

    负载均衡

    使用多台服务器分担一台服务器的压力,满足高并发的请求。怎么实现的呢,应用程序会有一个心跳检测/健康检查机制,如果发现不妥切换即可。上面提到的数据库主主复制也是高可用的方案之一,技术思想果然是相通的

    负载均衡

    限流降级

    我们的目标不是没有蛀牙,而是希望整个系统不要挂掉。限流是对部分请求进行丢弃处理,保证大部分的用户可以正常的请求完成任务。

    降级:

    可以屏蔽部分当前看来不是很有用的任务。比如电商系统做秒杀活动的过程中,确认收货功能给予的压力挺大,暂时看来并不是核心任务,而且系统到期也会自动确认收货,所以暂时关闭,将系统的资源留给准备下单,放购物车的太太们

    异地多活

    有时候我在想要是地震,火灾等自然灾害发生的时候,很多系统的数据怎么办啊。想多了撒,大些的系统多会在各个地方部署数据中心,采用异地多活的多机房策略。用户可以访问任何数据中心,那问题来了,用户的请求是如何到达不同的机房去的?

    • 域名解析

    9 安全性

    公司中的数据财产,其重要程度不言而喻。系统的健壮性和安全性是保证系统持久运行的基础。不要因为数据泄露才去关注安全问题。

    也许说到安全问题,首先想到的是“用户名密码”泄漏,数据库被脱裤导致数据泄露,hack直接拿到用户的敏感信息,所以我们通常有哪些手段或方法来尽全力的抵抗hack嘞,办法总比问题多嘛

    • 数据加解密

    通过对用户密码,身份证等敏感数据加密是常用方法。加密方法通常分为:单向散列加密,对称加密和非对称加密。

    所谓单向散列加密,主要体现在单向二字,意味着对明文加密后是不可以解密,你即使是给明文加密的加密者,也无法通过密文知道其明文是什么,即加密单向,不支持解密。说的这么绝对?这么无敌?那只是理论上而已,常用的MD5算法就是大象散列加密,我们完全可以通过彩虹表等方式进行破解。怎么破解?说个简单的道理,我们设置密码的时候,通常会使用生日?手机号?什么love?什么520?,这些组合是有限的,我们就可以建立一个比如生日和密文的映射表,然后通过XX彩虹表就可得到密码明文

    单向散列加密

    所以,通常的情况,使用单向散列加密的时候需要加一点,这样一来,hack拿到密文,不知道盐,无法建立彩虹表,就更难还原明文。

    应用场景:通常应用在用户密码加密。其加密和校验过程如下

    应用场景

    我们通过上图来回顾一下一个网站的注册登录模块中的用户部分,用户注册需要输入用户名和密码,我们一般不会将裸露的将密码直接存放在数据库,不然被脱裤直接算裸奔。所以,用户输入密码,应用服务器获得密码后,调用单向散列加密算法,将加密的密文存放于数据库,用户下一次登录的时候,用户依然会输入密码,只是到了Web服务器后,Web服务器会对输入的密码再进行一次单向散列加密,然后和数据库中取出来的密文进行对比,如果相同,则用户的验证成功,通常这样的方式可以保证用户密码的安全性,当然如果加一点盐,会增加破解的难度。

    对称加密

    对称加密是通过一个加密算法和密钥,对一段明文进行加密后得到密文,然后使用相同的密钥和对应的解密算法进行解密得到明文。

    对称加密

    举个例子,我们不会将银行卡卡号,有效期等直接存储在数据库,而是会通过先加密,然后存储于数据库。使用的时候必须对密文进行解密还原出明文。这个时候使用对称加密算法,存储的时候加密算法进行加密,使用的时候解密算法解密

    非对称加密

    非对称加密是说使用一个加密算法和一个加密秘钥进行加密得到密文,但是在解密出明文的时候,其加解密密钥和加密密钥不同,通常加密密钥叫做公钥,解密密钥叫做私钥。

    非对称加密

    其实我们常用的 HTTPS 即是非对称加密的应用场景。用户在客户端进行通讯的时候,对数据使用的加密密钥和加密算法进行加密得到密文,到了服务端以后,使用解密密钥和算法进行解密得到明文。但是非对称消耗的资源比较多,所以HTTPS不是每次请求响应都采用非对称加密,而是先利用非对称加密,在客户单和服务器之间交换一个对称加密的密钥,然后每次的请求响应再使用对称加密。综上,使用费对称加密保证对称加密迷药的安全,使用对称加密密钥保证请求响应数据的安全。

    HTTP攻击与防护

    HTTP明文协议,咋们通过嗅探工具就可以清晰查看会话内容,这也是hack攻击门槛最低的方式。很常见的也就是SQL注入XSS攻击

    SQL注入是攻击者在提交请求参数的时候,包含了恶意的SQL脚本

    SQL注入

    server处理计算后向数据库提交的SQL如下

    Select id from users where username='Mike';

    如果是恶意攻击,提交的HTTP请求如下

    http://www.a.com?username=Mike';drop table users;--

    此时最终生成的SQL是

    Select id from users where username='Mike';drop table users;--';

    查询完就直接给删除表了。怎么防护?比较常用的解决方案是使用PrepareStaement预编译,先将SQL交给数据库生成执行计划,后面hack不管提交什么字符串也只能交给这个执行计划执行,不会生成新的SQL,也就不会被攻击啦。

    XSS攻击

    跨站点脚本攻击,攻击者通过构造恶意的浏览器脚本文件,使其在其他用户的浏览器运行进而进行攻击。假设小A将含有恶意脚本的请求给360服务器,服务器将恶意的脚本存储在本地的数据库,当其他正常用户通过这个服务器浏览信息的时候,服务器就会读取数据库中含有恶意脚本的数据并呈现给用户,在用户正常使用浏览器的时候达到攻击的目的。

    防御:

    比较常见的是在入口处对危险的请求比如drop table等进行拦截,设置一个Web应用防火墙将危险隔离。

    安全防御

    10 大数据

    其实在上面提到的分布式中就有涉及大数据相关知识。无外乎是数据量越来越大,我们如何尽可能使用较低的成本存储更多的数据,更公司企业带来更好的利润。上面说过分布式缓存,负载均衡等技术,其共同特点是如何抵抗高并发的压力,而这里的大数据技术主要谈论的是如何满足大规模的计算。

    通过对数据的分析,进而发掘海量数据中的价值,这里的数据包含数据库数据,日志信息,用户行为数据等等。那么这么多不同类型的数据,怎么去存储呢

    分布式文件存储 HDFS 架构

    如何将数以万计的服务器组成统一的文件存储系统?其中使用Namenode服务器作为控制块,负责元数据的管理(记录文件名,访问权限,数据存储地址等),而真正的文件存储在DataNode中。

    Mapreduce

    大量的数据存储下来的目的是通过相应的算法进行数据分析,获得通过深度学习/机器学习进行预测,从而获取有效的价值,这么大的文件,我们不可能将HDFS当做普通的文件,从文件中读取数据然后计算,这样子不知道算到何时何地。

    大数据处理经典的处理框架即MapReduce,分为Map和Reduce两个阶段,其中一个Map过程是将每个服务器上启动Map进程,计算后输出一个集合。reduce过程,MapReduce在每个服务器上启动多个reduce进程,然后将所有的map输出的集合进行shuffle操作,什么是shuffle操作呢,即是将相同的ekey发送到同一个reduce进程,在reduce中完成数据关联的操作。

    下面以WordCount统计所有数据中相同的词频数据为例,详细看看Map和Reduce的过程。

    wordcoun计算过程

    在这个例子中,通过对value中的1组成的列表,reduce对这些1进行求和操作从而得到每个单词的词频。代码实现如下

    public class WordCount {
            // Mapper四个参数:第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型。map这里的输出是指输出到reduce
        public static class doMapper extends Mapper<Object, Text, Text, IntWritable> {
            public static final IntWritable one = new IntWritable(1);//这里的IntWritable相当于Int类型
            public static Text word = new Text();//Text相当于String类型
    
            // map参数<keyIn key,valueIn value,Context context>,将处理后的数据写入context并传给reduce
            protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
    
                //StringTokenizer是Java工具包中的一个类,用于将字符串进行拆分  
                StringTokenizer tokenizer = new StringTokenizer(value.toString(), "   ");
    
                //返回当前位置到下一个分隔符之间的字符串  
                word.set(tokenizer.nextToken());
    
                //将word存到容器中,记一个数
                context.write(word, one);
            }
        }
    
        //参数同Map一样,依次表示是输入键类型,输入值类型,输出键类型,输出值类型。这里的输入是来源于map,所以类型要与map的输出类型对应 。
        public static class doReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
            private IntWritable result = new IntWritable();
    
            @Override
            protected void reduce(Text key, Iterable<IntWritable> values, Context context)
                    throws IOException, InterruptedException {
                int sum = 0;
    
                //for循环遍历,将得到的values值累加
                for (IntWritable value : values) {
                    sum += value.get();
                }
                result.set(sum);
                context.write(key, result);//将结果保存到context中,最终输出形式为"key" + "result"
            }
        }
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            System.out.println("start");
            Job job = Job.getInstance();
            job.setJobName("wordCount");
    
            Path in = new Path("hdfs://***:9000/user/hadoop/input/buyer_favorite1.txt");//设置这个作业输入数据的路径(***部分为自己liunx系统的localhost或者ip地址)
            Path out = new Path("hdfs://***:9000/user/hadoop/output/wordCount");        //设置这个作业输出结果的路径
    
            FileInputFormat.addInputPath(job, in);
            FileOutputFormat.setOutputPath(job, out);
    
            job.setJarByClass(WordCount.class);// 设置运行/处理该作业的类
    
            job.setMapperClass(doMapper.class);//设置实现了Map步的类
            job.setReducerClass(doReducer.class);//设置实现了Reduce步的类
    
            job.setOutputKeyClass(Text.class);//设置输出结果key的类型
            job.setOutputValueClass(IntWritable.class);//设置输出结果value的类型
    
            执行作业
            System.exit(job.waitForCompletion(true) ? 0 : 1);
            System.out.println("end");
        }
    }
    

    那么这个map和reduce进程是怎么在分布式的集群中启动的呢?

    map/reduce启动过程

    上图比较清晰地阐述的整个过程,再描述一波。MR中主要是两种进程角色,分别为 JobTracke r和 TaskTracker 两种,JobTracker在集群中只有一个,而 TaskTracker 存在多个,当  JobClient 启动后,往 JobTracker 提交作业,JobTracker查看文件路径决定在哪些服务器启动 Map 进程,然后发送命令给 TaskTracker,告诉它要准备执行任务了,TaskTracker收到任务后就会启动 TaskRunner 下载任务对应的程序。map计算完成,TaskTracker对map输出结果 shuffer 操作然后加载 reduce 函数进行后续计算,这就是各个模块协同工作的简单过程。

    Hive

    上述过程还是比较麻烦,我们能不能直接写SQL,然后引擎帮助我们生成mapreduce代码,就反复我们在web开发的时候,不直接写SQL语句,直接交给引擎那么方便,有的,它就是HIVE

    举个例子

    SQL

    拆分

    那么使用MR的计算过程完成这条SQL的处理

    展开全文
  • Python后端技术栈

    千次阅读 2019-10-22 19:53:26
    Python后端技术栈(一) Happiness is a way of travel. Not a destination. 幸福是一种旅行方式。 不是目的地。 1.导航 1.1Python 语言基础 1.语言特点 2.语法基础 3.高级特性 1.2算法与数据结构 1.常用算法和数据...
  • 后端技术栈规划

    2019-10-16 17:23:51
    不论做什么都需要好的规划后端技术图谱(后期更新不断补上链接) 后端技术图谱(后期更新不断补上链接) 数据结构 队列 集合 链表、数组 字典、关联数组 树 二叉树 完全二叉树 平衡二叉树 二叉查找树(BST) ...
  • 后端技术栈学习路线与面试技巧指北.pdf
  • Java后端技术栈梳理

    千次阅读 2019-10-18 10:38:05
    Java后端技术栈梳理(阅读量1.8k,讲的过去宏观) Java 后端自学之路(阅读量3.1w,71赞) 自学java心路历程(学了半年)(阅读量6.3k,47赞) 我的 Java 自学之路(阅读量5k) Java后端学习路线图,你真的只...
  • 互联网大厂的后端技术栈

    千次阅读 2020-02-22 10:28:04
    最近公司招聘海外后端研发,所以整理一份技术栈的资料给他们,但是想来这份整理也适用于所有后端研发,所以去掉了敏感内容,把它呈现于此,本文重在概述,毕竟篇幅有限,欢迎【关注】...后续可能把单点拓展成文,详细地...
  • java后端技术栈路线图

    2020-09-29 17:09:28
    java后端技术栈路线图 很多人做Java开发2,3年后,都会感觉自己遇到瓶颈。什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年还是一个码农,工作中太多被动是因为不懂底层原理。公司的工作节奏又比较快,难...
  • 我的毕业设计后端技术栈

    千次阅读 2019-05-04 14:39:41
    对于后端技术栈我是由以下技术完成的。对于毕设内容不作介绍了。说一说遇到的一些问题和如何解决的。 java1.8 springboot2.1.3 maven mysql 5.7 redis 2.18 mybatis tk-mapper jetcache freemaker webSocket g...
  • 2-3 Python后端技术栈

    2021-05-30 21:34:55
    二、后端技术栈 python语言基础 1.语言特点 2.语法基础 3.高级特性 算法与数据结构 1.常用算法和数据结构 2.分析时间/空间复杂度 3.实现常见数据结构和算法 编程范式 1.面向对象编程 2.常用设计模式 3.函数式编程 ...
  • 最全Java后端技术栈

    2021-05-24 12:17:14
    为此,我特地总结了一份Java后端开发需要的技术栈 技术 构建工具 Maven:http://maven.apache.org/ Gradle:https://gradle.org/ Spring Boot Initializr:https://start.spring.io/ 单元测试 Junit:...
  • 随着用户的增长、平台架构的升级,分布式、高性能、高并发、缓存、海量数据、算法、各种框架都源源不断涌现在各位程序员面前,后端技术栈变化可谓相当大。刚刚准备从事技术领域的同学很容易找不到自己的方向,从而...
  • Java后端技术栈整理 Spring MVC:Model:封装了应用程序的数据和一般他们会组成的POJO。View:负责呈现模型数据和一般它生成的HTML的输出,客户端的浏览器能够解释。Cotroller:负责处理用户的请求,并建立适当的模型...
  • 后端技术栈 主流的后端技术 Java Python Php C# C++ C Javascript Golang Perl Visual Basic Object Pascal TIOBE 8月编程语言排行1-20 PHP概念 PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext...
  • Java后端技术栈整理

    万次阅读 2018-04-28 18:37:17
    Spring MVC:Model:封装了应用程序的数据和一般他们会组成的POJO。...Cotroller:负责处理用户的请求,并建立适当的模型,并把它传递给视图渲染。Spring MVC处理请求的流程:IOC容器就是具有依赖注入功能的容器,IOC容器...
  • Java,是现阶段中国互联网公司中,覆盖度最广的研发语言。不少朋友问,如何深入学习Java后端技术栈,今天分享一个,互联网牛人整理出来的Java深入学习路线图,以及免费...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,314
精华内容 19,725
关键字:

后端技术栈有什么