JVM概述
JVM概述简介介绍
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。
Java技术的核心就是Java虚拟机(JVM,Java virtual Machine) ,因为所有的Java程序都运行在Java虚拟机内部。
作用Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点
一次编译,到处运行
自动内存管理
自动垃圾回收功能
JVM所处位置
JVM的整体结构
执行流程:
java程序编写
通过jiava编译器编译成class字节码文件
在JVM上进行解释执行
类的加载
字节码校验
执行引擎对字节码进行解析编译执行
在具体操作系统上执行
JVM生命周期虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class load ...
分布式系统认证
分布式系统认证方案什么是分布式系统随着软件环境和需求的变化 ,软件的架构由单体结构演变为分布式架构,具有分布式架构的系统叫分布式系统,分布式系统的运行通常依赖网络,它将单体结构的系统分为若干服务,服务之间通过网络交互来完成用户的业务处理,当前流行的微服务架构就是分布式系统架构,如下图:
分布式认证需求分布式系统的每个服务都会有认证、授权的需求,如果每个服务都实现一套认证授权逻辑会非常冗余,考虑分布式系统共享性的特点,需要由独立的认证服务处理系统认证授权的请求;考虑分布式系统开放性的特点,不仅对系统内部服务提供认证,对第三方系统也要提供认证。分布式认证的需求总结如下:统一认证授权
统一认证授权:提供独立的认证服务,统一处理认证授权。
应用接入认证:应提供扩展和开放能力,提供安全的系统对接机制,并可开放部分API给接入第三方使用,一方应用(内部 系统服务)和三方应用(第三方应用)均采用统一机制接入。
技术方案根据 选型的分析,决定采用基于token的认证方式,它的优点是:
适合统一认证的机制,客户端、一方应用、三方应用都遵循一致的认证机制。
token认证方式对第三方应用接入更适 ...
SpringCloud
SpringCloud相关概念架构的变化:
微服务:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。
Spring Cloud全家桶是Pivotal团队提供的一整套微服务开源解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等组件。
基本架构:
技术落地(目前很多已经停更,后面会有替代技术):
注册中心Eureka、服务配置Config、服务总线Bus被Nacos替代
Ribbon、Feign被OpenFeign替代
Hystrix被Alibaba的Sentinel替代
Zuul被gateway替代
服务治理在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
注册中心需要对各个服务进行 ...
Netty
Netty概述现在的互联网环境下,分布式系统大行其道,而分布式系统的根基在于网络编程,而Netty恰恰是Java领域网络编程的王者。如果要致力于开发高性能的服务器程序、高性能的客户端程序,必须掌握Netty。
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。
地位Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位
以下的框架都使用了 Netty,因为它们有网络通信需求!
Cassandra - nosql 数据库
Spark - 大数据分布式计算框架
Hadoop - 大数据分布式存储框架
RocketMQ - ali 开源的消息队列
ElasticSearch - 搜索引擎
gRPC - rpc 框架
Dubbo - rpc 框架
Spring 5.x - flux api 完全抛弃了 tomcat ,使用 netty 作为服务器端
Zookeeper - 分布式协调框架
优势
Netty vs NIO:
NIO工作量大,bug 多
不需要自己构建协议
解决 TCP 传输问题 ...
NIO
NIOnon-blocking io 非阻塞 IO
三大组件Channel & Bufferchannel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层。
常用的 Channel 类有:FileChannel、DatagramChannel、ServerSocketChannel 和 SocketChannel
FileChannel :用于文件的数据读写
DatagramChannel :用于 UDP 的数据读写
ServerSocketChannel 和 SocketChannel: 用于 TCP 的数据读写
常用的Buffer类有:
ByteBuffer:存储字节数据到缓冲区
ShortBuffer:存储字符串数据到缓冲区
CharBuffer:存储字符数据到缓冲区
IntBuffer:存储整数数据到缓冲区
LongBuffer:存储长整型数据到缓冲区 ...
ELK日志平台搭建
ELK日志平台搭建概述ELK即Elasticsearch、Logstash、Kibana,组合起来可以搭建线上日志系统
Elasticsearch:用于存储收集到的日志信息。
Logstash:用于收集日志,SpringBoot应用整合了Logstash以后会把日志发送给Logstash,Logstash再把日志转发给Elasticsearch。
Kibana:通过Web端的可视化界面来查看日志。
搭建基本镜像环境
首先拉取ELK的镜像:
123docker pull elasticsearch:7.14.0docker pull logstash:7.14.0docker pull kibana:7.14.0
处理elasticsearch启动问题的配置:
需要设置系统内核参数,否则会因为内存不足无法启动
12sysctl -w vm.max_map_count=262144sysctl -p
给data文件权限:chmod 777 /opt/docker_app/elasticsearch/data
编写docker-compose.yml脚本:
123456789 ...
ElasticSearch
ElasticSearch简介Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎,建立在一个全文搜索引擎库 Apache Lucene™基础之上,是整个 ElasticStack 技术栈的核心。ES是采用java语言编写,提供了简单易用的RestFul API,开发者可以使用其简单的RestFul API,开发相关的搜索功能,从而避免lucene的复杂性。
优点:
一个分布式的实时文档存储,每个字段可以被索引与搜索
一个分布式实时分析搜索引擎
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
ElasticStack :包括 Elasticsearch、 Kibana、 Beats 和 Logstash(也称为 ELK Stack)
安装Docker方式安装
获取镜像:docker pull elasticsearch:7.14.0
创建数据目录:
1234mkdir -p /opt/docker_app/elasticsearch/configmkdir -p /opt/docker_app/elasticsearch/logs ...
CICD
CI/CD相关概念什么是CICI:Continuous integration持续集成
开发人员通常使用称为CI Server的工具来进行构建和集成。CI要求自检代码。这是用于自我测试以确保其按预期工作的代码,这些测试通常称为单元测试。集成代码后,当所有单元测试通过时,将得一个最新的的代码版本。这表明他们已经验证了自己的更改已成功集成到一起,并且代码按测试期望的那样工作。
什么是CDCD:Continuous deployment持续部署
在这种实践中,团队负责人所做的每一项更改都通过了所有测试阶段,并自动投入生产。要实现连续部署,团队负责人首先需要进行连续交付,因此在开始练习连续部署之前,先决定哪个对您更合适,持续交付都是为了增强整个业务的能力,因此至少您应该参与确定是否应该使用持续部署。
CD还有个小号,叫持续交付,英文全称是Continuous delivery,缩写也是CD
为什么需要CI/CD持续集成(CI)是一种开发实践,其中开发人员经常(最好每天几次)将代码集成到共享存储库中。然后可以通过自动构建和自动测试来验证每个集成。尽管自动化测试不是严格意义上的CI的一部分,但 ...
RabbitMQ集群
RabbitMQ集群前言一般一台RabbitMQ 服务器,无法满足目前真实应用的要求;特别是在RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,如果不使用集群消息队列功能就会完全失效,并且不能支持很高的吞吐量,所以搭建集群是很有必要的。
集群搭建大致结构:
步骤
准备三台服务器(可以克隆,可以利用docker创建三个容器)
配置各个服务器的host文件:vim /etc/hosts
要确保各个节点的 cookie 文件使用的是同一个值,在node1上进行远程复制:
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie
重新启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务(在三台节点上分别执行以下命令):rabbitmq-server -detached
...
消息队列
消息队列MQMQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。
功能
流量消峰:当系统到达请求极限时,为了让用户还能继续请求突破这个极限,就可以使用消息队列做缓冲,把一秒内请求分散成一段时间来处理。
应用解耦:可以使用消息队列将系统的某个模块从整个系统中解耦出来,这样就算该模块出现故障不会影响到整个系统。
异步处理:有些服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完,使用消息总线,可以很方便解决这个问题, A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务。
具体实现RabbitMQ2007 年发布,是一个在**AMQP(高级消息队列协议)**基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
优点:Rabbit ...