微服务保护与分布式事务
在微服务远程调用的过程中,还存在几个问题需要解决。
首先是业务健壮性问题:
例如在之前的查询购物车列表业务中,购物车服务需要查询最新的商品信息,与购物车数据做对比,提醒用户。大家设想一下,如果商品服务查询时发生故障,查询购物车列表在调用商品服 务时,是不是也会异常?从而导致购物车查询失败。但从业务角度来说,为了提升用户体验,即便是商品查询失败,购物车列表也应该正确展示出来,哪怕是不包含最新的商品信息。
还有级联失败问题:
还是查询购物车的业务,假如商品服务业务并发较高,占用过多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 ...
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 ...











