java多线程
java多线程多线程基础在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。
某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。
一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程。此外,JVM还有负责垃圾回收的其他工作线程
Java多线程编程的特点又在于:
多线程模型是Java程序最基本的并发模型;
后续读写网络、数据库、Web开发等都依赖Java多线程模型。
创建新进程创建一个新线程非常容易,我们需要实例化一个Thread实例,然后调用它的start()方法:
12Thread t = new Thread();t.start(); // 启动新线程
Thread内部有一个run()方法,start()方法会在内部自动调用实例的run()方法
1Thread t = new Thread(new MyRunnable( ...
Elasticsearch
Elasticsearchelasticsearch是一款非常强大的开源搜索引擎,支持的功能非常多,例如:
代码搜索
商品搜索
解决方案搜索
地图搜索
初识Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括:
Elasticsearch:用于数据存储、计算和搜索
Logstash/Beats:用于数据收集
Kibana:用于数据可视化
整套技术栈被称为ELK,经常用来做日志收集、系统监控和状态分析等等:
整套技术栈的核心就是用来存储、搜索、计算的Elasticsearch,因此我们接下来学习的核心也是Elasticsearch。
我们要安装的内容包含2部分:
elasticsearch:存储、搜索和运算
kibana:图形化展示
首先Elasticsearch不用多说,是提供核心的数据存储、搜索、分析功能的。
然后是Kibana,Elasticsearch对外提供的是Restful风格的API,任何操作都可以通过发送http请求来完成。不过http请求的方式、路径、还有请求参数的格式都有严格 ...
微服务总结
微服务总结知识体系总图:
注册中心微服务本质是多实例部署,服务间的调用需要一个统一的管理
1. 部署Nacos的注册中心首先我们要准备MySQL数据库表,用来存储Nacos的数据(需要去资料里找nacos.sql文件)
表的结构如下:
其次需要更改下载下来的nacos文件夹中的custom.env文件,配置mysql地址
后启动nacos,日访:8848/nacos进入到nacos的控制台,账号密码都是nacos
2.服务注册和发现添加依赖
12345<!--nacos 服务注册发现--><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
配置
123456spring: application: name: item-service # 服务名称 clo ...
MQ消息队列
MQ消息队列消息Broker,目前常见的实现方案就是消息队列(MessageQueue),简称为MQ.
目比较常见的MQ实现:
ActiveMQ
RabbitMQ
RocketMQ
Kafka
几种常见MQ的对比:
RabbitMQ
ActiveMQ
RocketMQ
Kafka
公司/社区
Rabbit
Apache
阿里
Apache
开发语言
Erlang
Java
Java
Scala&Java
协议支持
AMQP,XMPP,SMTP,STOMP
OpenWire,STOMP,REST,XMPP,AMQP
自定义协议
自定义协议
可用性
高
一般
高
高
单机吞吐量
一般
差
高
非常高
消息延迟
微秒级
毫秒级
毫秒级
毫秒以内
消息可靠性
高
一般
高
一般
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
RabbitMQ安装我们同样基于Docker来安装Ra ...
JavaSTL
JavaSTLString定义:
1String s1="HelloWorld"
判断字符是否为空:
1System.out.println(s1.isEmpty());// False
获取字符串长度:
1System.out.println(s1.length()); 10
获取字符串中的某个字符:
1System.out.println(s1.charAT(0)); //H
将字符串转化为全大写或全小写:
12System.out.println(s1.toLowerCase()); //helloworldSystem.out.println(s1.toUpperCase()); //HELLOWORLD
去除字符串前后的空格:
1System.out.println(" hell o world ".trim()); //hell o world
比较字符串:
1s2 ="helloWorld";
1System.out.pringln(s1.equals(s2)); ...
微服务保护
微服务保护和分布式事务微服务保护的方案有很多,比如:
请求限流
线程隔离
服务熔断
这些方案或多或少都会导致服务的体验上略有下降,比如请求限流,降低了并发上限;线程隔离,降低了可用资源数量;服务熔断,降低了服务的完整度,部分服务变的不可用或弱可用。因此这些方案都属于服务降级的方案。但通过这些方案,服务的健壮性得到了提升,
SentinelSentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站:
https://sentinelguard.io/zh-cn/
Sentinel 的使用可以分为两个部分:
核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。
控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
控制台搭建为了方便监控微服务,我们先把Sentinel的控制台搭建出来。
1)下载jar包
2) ...
微服务网关及配置管理
微服务网关及配置管理现在我已经将黑马商城拆分为5个微服务:
用户服务
商品服务
购物车服务
交易服务
支付服务
由于每个微服务都有不同的地址或端口,入口不同,相信大家在与前端联调的时候发现了一些问题:
请求不同数据时要访问不同的入口,需要维护多个入口地址,麻烦
前端无法调用nacos,无法实时更新服务列表
单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:
每个微服务都需要编写登录校验、用户信息获取的功能吗?
当微服务之间调用时,该如何传递用户信息?
网关网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由****和转发以及数据安全的校验。
前端请求不能直接访问微服务,而是要请求网关:
网关可以做安全控制,也就是登录身份校验,校验通过才放行
通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去
在SpringCloud当中,提供了两种网关实现方案:
Netflix Zuul:早期实现,目前已经淘汰
SpringCloudGate ...
微服务服务调用
微服务服务调用把原本本地方法调用,改造成跨微服务的远程调用(RPC,即Remote Produce Call)。
因此,现在查询购物车列表的流程变成了这样:
RestTemplateSpring给我们提供了一个RestTemplate的API,可以方便的实现Http请求的发送。
org.springframework.web.client public class RestTemplate
extends InterceptingHttpAccessor
implements RestOperations
-—————————————————————————————————————
同步客户端执行HTTP请求,在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模板,此外还提供了支持不太常见情况的通用交换和执行方法。 RestTemplate通常用作共享组件。然而,它的配置不支持并发修改,因此它的配置通常是在启动时准备的。如果需要, ...
MybatisPlus
MybatisPlus基本用法1.引入依赖
12345<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version></dependency>
2.定义Mapper
自定义的mapper需要继承MybatisPlus提供的BaseMapper接口
123public interface UserMapper extends BaseMapper<User>{ }
常见注解MyBatisPlus通过扫描实体类。并基于反射获取实体类信息作为数据库表信息
这个过程遵循一些约定俗成:
驼峰转下划线
名为id发字段作为主键
若不符合约定,则通过注解来得到数据库表信息
@TableName:用来指定表名
@TableId:用来指定表中的主键字段信息
@TableField ...
Spring微信支付实现
Spring微信支付实现时序图: