一、解决URL存在特殊符号|{}?&、URL中包含%2F、URL中包含%5C
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Slf4j
public class RfcConfig {
@Bean
public void setRfc(){
// 指定jre系统属性,允许特殊符号, 如{} 做入参,其他符号按需添加。见 tomcat的HttpParser源码 |{}?&。
System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "|{}");
// 这个是解决URL中包含%2F的问题
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
// 这个是解决URL中包含%5C的问题
System.setProperty("org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH", "true");
}
}
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
//升级tomcat8.5.5或者更高版本get请求的特殊字符如{}[]|等就会被拦截导致前端参数无法传入到后台,提示400参数错误
tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]"));
return tomcat;
}
二、异步线程池配置
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 异步线程池配置
*/
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer{
@Override
public Executor getAsyncExecutor() {
// 线程池
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
//线程池核心线程数,控制每次开启子线程数量
taskExecutor.setCorePoolSize(5);
//线程池维护线程的最大数量
taskExecutor.setMaxPoolSize(10);
//线程池所使用的缓冲队列
taskExecutor.setQueueCapacity(25);
//线程池维护线程所允许的空闲时间
taskExecutor.setKeepAliveSeconds(30000);
// 配置线程池中的线程的名称前缀 方便排查
taskExecutor.setThreadNamePrefix("Async-Thread-");
//CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
//设置拒绝策略:当pool已经达到max size的时候,使用预定义的异常处理类
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
三、动态加载lib下所有jar包的方法
import org.springframework.util.ResourceUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
/**
* 动态加载lib下所有jar包的方法
*/
public class JarUtils {
public static String getApplicationFolder() {
String path = JarUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath();
return new File(path).getParent();
}
public static InputStream getInputStream() throws FileNotFoundException {
//读取resources下面的lib文件夹的文件
File file = ResourceUtils.getFile("classpath:lib/");
return new FileInputStream(file);
}
public static void loadJarsFromAppFolder() throws Exception {
String path = "./lib";
File file = new File(path);
if (file.isDirectory()) {
for (File subj : file.listFiles()) {
if (subj.isFile()) {
loadJarFile(subj);
}
}
} else {
loadJarFile(file);
}
}
public static void loadJarFile(File path) throws Exception {
URL url = path.toURI().toURL();
// 可以获取到AppClassLoader,可以提到前面,不用每次都获取一次
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
// 加载
Method method = URLClassLoader.class.getDeclaredMethod("URL", URL.class);
method.setAccessible(true);
method.invoke(classLoader, url);
}
}
四、Spring Cloud、Dubbo、HSF
Spring Cloud
Spring Cloud 提供了简化应用开发的一系列标准和规范。这些标准和规范包含了服务发现、负载均衡、熔断、配置管理、消息事件驱动、消息总线等,同时 Spring Cloud 还在这些规范的基础上,提供了服务网关、全链路跟踪、安全、分布式任务调度和分布式任务协调的实现。
目前业界比较流行的 Spring Cloud 具体实现有 Spring Cloud Netflix、Spring Cloud Consul、Spring Cloud Gateway、Spring Cloud Sleuth 等,最近由阿里巴巴中间件开源的 Spring Cloud Alibaba 也是业界中受关注度很高的另一种实现。
Dubbo
提供者在启动时,在注册中心注册服务。
消费者在启动时,在注册中心订阅所需的服务。
注册中心返回提供者地址列表给消费者。如果提供者发生变更,注册中心将推送变更数据给消费者。
消费者基于软负载均衡算法,从提供者地址列表中选一个提供者进行调用。
HSF
高速服务框架HSF (High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框架。
HSF作为一个纯客户端架构的RPC框架,HSF没有服务端集群,所有HSF服务调用均是通过服务消费方(Consumer)与服务提供方(Provider)点对点进行。为了实现整套分布式服务体系,HSF还需要依赖以下外部系统。
应用开发方式:
Ali-Tomcat: 依赖Ali-Tomcat和Pandora,提供了完整的HSF功能,包括服务注册与发现、隐式传参、异步调用、泛化调用和调用链路Filter扩展。应用程序须以WAR包方式部署。
Pandora Boot:依赖Pandora,提供了比较完整的HSF功能,包括服务注册与发现、异步调用。应用程序编译为可运行的JAR包并部署即可。
参考:https://www.alibabacloud.com/help/zh/doc-detail/100087.htm