BigDecimal类-解决浮点数计算精度问题
BigDecimal在开发过程中,我们会遇到一些需要严格要求浮点数计算精度的场景。此时,使用float,double等类型是满足不了需求的。案例如下:
1234567public static void main(String[] args) { double a = 0.1; double b = 0.2; double c = a + b; System.out.println(c);}
这段代码会返回0.3吗?
我们可以看到运算的结果并不精确。
此时我们就需要使用BigDecimal来解决这种问题。
构造器
我们可以看到有些构造器,接收的是一个double类型的参数。这个地方需要特别注意,我们不应该使用这些构造器。使用这些构造器仍然会有可能造成精度问题。
JDK的描述:参数类型为double的构造方法的结果具有一定的不可预知性。有人可能会认为在Java中写入new BigDecimal(0.1),所创建的BigDecimal正好等于0.1,但是它实际上等于0.10000000000000000555111512312578270 ...
Java Runtime类
Runtime类
代表程序运行环境
Runtime是一个单例类
查看源码可以看到,Runtime的构造器是私有的。并且有一个Runtime类型的静态成员变量currentRuntime,提供了一个getRuntime的静态函数返回了这个对象。
Runtime的常用方法12345678910111213141516171819202122232425public static void main(String[] args) throws IOException, InterruptedException { // 获取Runtime对象 Runtime rt = Runtime.getRuntime(); // 终止当前的虚拟机 // rt.exit(0); // 获取虚拟机能够使用的CPU数 int count = rt.availableProcessors(); System.out.println(count); // 获取java虚拟机中的总内存数量 long total = rt.totalMemory( ...
合并pdf生成书签
合并多个pdf为一个总的pdf,并生成书签最近做了一个需求,需要将用户上传的多个pdf文件,合并成成一个pdf文件,生成书签。
采用了开源的pdfbox库,写了一个demo如下
1.引入pom依赖12345678910111213<!-- pdf box --><dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.27</version></dependency><!-- 使用该依赖处理json --><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version></ ...
mybatis-plus
大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。
因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是MybatisPlus.
官方网站如下:
当然,MybatisPlus不仅仅可以简化单表操作,而且还对Mybatis的功能有很多的增强。可以让我们的开发更加的简单,高效。
通过今天的学习,我们要达成下面的目标:
能利用MybatisPlus实现基本的CRUD
会使用条件构建造器构建查询和更新语句
会使用MybatisPlus中的常用注解
会使用MybatisPlus处理枚举、JSON类型字段
会使用MybatisPlus实现分页
1.快速入门为了方便测试,我们先创建一个新的项目,并准备一些基础数据。
1.1.环境准备复制课前资料提供好的一个项目到你的工作空间(不要包含空格和特殊字符):
然后用你的IDEA工具打开,项目结构如下:
注意配置一下项目的JDK版本为JDK11。首先点击项目结构设置:
在弹窗中配置JDK:
接下来,要导入两张表,在课 ...
微服务保护与分布式事务
在微服务远程调用的过程中,还存在几个问题需要解决。
首先是业务健壮性问题:
例如在之前的查询购物车列表业务中,购物车服务需要查询最新的商品信息,与购物车数据做对比,提醒用户。大家设想一下,如果商品服务查询时发生故障,查询购物车列表在调用商品服 务时,是不是也会异常?从而导致购物车查询失败。但从业务角度来说,为了提升用户体验,即便是商品查询失败,购物车列表也应该正确展示出来,哪怕是不包含最新的商品信息。
还有级联失败问题:
还是查询购物车的业务,假如商品服务业务并发较高,占用过多Tomcat连接。可能会导致商品服务的所有接口响应时间增加,延迟变高,甚至是长时间阻塞直至查询失败。
此时查询购物车业务需要查询并等待商品查询结果,从而导致查询购物车列表业务的响应时间也变长,甚至也阻塞直至无法访问。而此时如果查询购物车的请求较多,可能导致购物车服务的Tomcat连接占用较多,所有接口的响应时间都会增加,整个服务性能很差, 甚至不可用。
依次类推,整个微服务群中与购物车服务、商品服务等有调用关系的服务可能都会出现问题,最终导致整个集群不可用。
这就是级联失败问题,或者叫雪崩问题。
1.微服务保 ...
Java实现文件下载限速
问题描述在某些场景下,我们可能需要对 Java 程序中的下载操作进行限速,以控制下载的速度,避免对网络带宽造成过大的压力或者滥用网络资源。
代码实现思路就是控制某个时间片之内读取文件数据的大小,读取数据写入输出流之后,通过Thread.sleep方法休眠一定时间,达到限速的效果。
1234567891011121314151617181920212223242526272829303132@GetMapping("/download")public AjaxResult download(@RequestParam String filePath, HttpServletResponse response) throws IOException { try { // 获取文件对象 File file = fileService.show(filePath, fileConfig); if (file == null || !file.exists()) { retu ...
微服务保护
微服务保护
1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。
如图,如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业务似乎不受影响。
但是,依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞:
服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。
那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了:
雪崩问题产生的原因是什么?
微服务相互调用,服务提供者出现异常或阻塞
服务调用者没有做好异常处理,导致自身故障
调用链中的所有服务级联失败,导致整个集群故障
解决问题的思路有哪些尽量避免服务出现故障或阻塞
保证代码的健壮性
保证网络畅通
能应对较高并发的请求
服务调用者需要做好调用异常后的备用方案,避免故障扩散。
1.1.2.超时 ...
linux安装jdk
linux安装jdk
下载jdk tar包本次选用华为镜像下载
Index of java-local/jdk/8u151-b12
解压tar包1tar -zxvf jdk-8u151-linux-x64.tar.gz
配置环境变量备份/etc/profile文件,编辑该文件,最下面加入如下代码。
1234export JAVA_HOME=/xiaoyun/jdk1.8.0_151export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
重新加载配置文件1source /etc/profile
执行java -version
安装成功
linux安装nacos
linux安装nacos(单机版)
需要提前装好jdk,配置好环境变量
下载安装包
下载地址[.tar.gz] https://github.com/alibaba/nacos/releases
解压文件1tar -zxvf nacos-server-2.2.3.tar.gz
单机模式启动12cd /xiaoyun/nacos/binsh startup.sh -m standalone
访问http://127.0.0.1:8848/nacos/index.html
spring cloud-gateway微服务自定义过滤器
Gateway微服务自定义过滤器网关过滤器有两种,分别是
GatewayFilter:路由过滤器,作用范围灵活,作用于任意指定的路由
GlobalFilter:全局过滤器,作用范围是所有路由。
自定义GatewayFilter自定义GatewayFilter不是直接实现GatewayFilter,而是实现AbstractGatewayFilterFactory。
编写过滤器逻辑如果过滤器的类名以GatewayFilterFactory结尾,则在配置过滤器的时候可以写前缀。
1234567891011121314151617@Componentpublic class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> { @Override public GatewayFilter apply(Object config) { return new GatewayFilter() { @Overrid ...












