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 ...
SpringCloud-Gateway微服务校验登录
SpringCloud-Gateway微服务校验登录登录流程分析在原来的单体服务中,我们可以定义一个拦截器或者过滤器来拦截用户携带的认证信息,并且每个service可以很方便的获取到登录的用户信息。
但是在微服务的场景之下,需要在每一个微服务中都去配置解析token的拦截器,这并不安全且不现实。既然我们需要做登录校验,但是又不希望在每一个微服务中都重复的做登录校验,那我们就可以将这个工作交给我们的网关,GateWay。
此时我们登录校验的流程则变成了:
前端携带jwt令牌发起请求到网关
网关在请求路由之前做jwt令牌校验
后续的微服务需要使用到用户信息,则需要将用户信息传递到具体的微服务
微服务之间可能会发生调用,也需要将用户信息传递到其他微服务
代码实现网关GlobalFilter1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 ...
内网穿透工具cpolar使用步骤
内网穿透工具cpolar使用步骤进入cpolar官网cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站
点击免费试用后,注册并登录账号
完成账号注册之后下载安装cpolar
打开Cpolar Web UI
创建隧道
查看隧道
隧道启动后即可通过公网地址访问
测试我在本地起了一个8080端口的服务,编写了一个简单的接口用于测试
12345678@RestController@RequestMapping("/demo")public class DemoController { @GetMapping public String demo() { return "Hello Cpolar"; }}
通过localhost访问可以看到服务正常
再通过公网地址访问
可以看到正常返回了,内网穿透就生效了。
Java获取音视频文件的时长
Java获取上传音视频文件的时长导入依赖12345678910111213<!-- mp3文件支持(如语音时长)--><dependency> <groupId>org</groupId> <artifactId>jaudiotagger</artifactId> <version>2.0.1</version></dependency><!-- mp4文件支持(如语音时长)--><dependency> <groupId>com.googlecode.mp4parser</groupId> <artifactId>isoparser</artifactId> <version>1.1.22</version></dependency>
工具类代码12345678910111213141516171819202122232425262 ...
枚举类中获取spring容器的bean
枚举类中获取spring容器的bean我们有一个枚举,想要注入spring容器中的bean。通过直接标记这个类为Component,注入bean的方式往往是行不通的,这是因为枚举的常量在类加载时就已经初始化了。此时可以通过定义一个静态内部类来实现bean的注入。
定义一个接口及其实现类123public interface Car { void run();}
1234567@Component("toyotaCar")public class ToyotaCar implements Car { @Override public void run() { System.out.println("Toyota car is running"); }}
1234567@Component("ferrariCar")public class FerrariCar implements Car { @Overrid ...
mybatis-plus常用注解
@TableName该注解用于指定实体类对应的数据库表名。当实体类名与数据库表名不一致,或者实体类名不是数据库表名的驼峰写法时,您需要使用这个注解来明确指定表名。
12345678910111213@TableName("sys_user")public class User { private Long id; private String name; private Integer age; private String email;}
value类型: String默认值: ""
指定实体类对应的数据库表名。如果实体类名与表名不一致,使用这个属性来指定正确的表名。
schema类型: String默认值: ""
指定数据库的 Schema 名称。通常情况下,如果你的数据库没有使用 Schema 来组织表,这个属性可以不填写。
keepGlobalPrefix类型: boolean默认值: false
当全局配置了 tablePrefix 时,这个属性决定是否保持使用全局的表 ...