1.第一次克隆git仓库的时候报错:
git clone git@39.108.186.22:/opt/git/Thirddevops.git
Cloning into 'Thirddevops'...
sh: git-upload-pack: command not found
fatal: Could not read from remote repository.
解决方案:
原来代码服务器【39.108.186.22】上的git安装路径是/usr/local/git,不是默认路径,根据提示,
在git服务器39.108.186.22上, 建立链接文件:
[root@localhost code]# ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack
当然,也许你会遇到git-receive-pack 之类的错误,很有可能和这个原理是一样的,请采用类似的操作即可!
2.eureka的红色报警:
之前了解过这个问题,当时记得不是什么大问题,今天又查了一下,是这样的:
自我保护机制。Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告,告诉你这个服务可能不稳定。
解决方案:
服务器端配置:
eureka:
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 4000 # 清理间隔(单位毫秒,默认是60*1000)
客户端配置:
eureka:
client:
healthcheck:
enabled: true
instance:
lease-expiration-duration-in-seconds: 30
lease-renewal-interval-in-seconds: 10
3.有时候服务手动关掉了,但是eureka界面上竟然还有这个服务实例,就是上面那个问题,一旦进入保护模式,
Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)
4.如何用@value去注解静态变量
spring不允许@value去注解静态变量
举例:
@Value("${test.value}")
private static String testValue;
public static void test() {
System.out.println(testValue);
}
尽管配置文件中配置了test.value的值,但是使用类名.test()时,打印的值为null
解决方案:
将注解放在set方法上面即可
@Value("${test.value}")
public void setTestValue(String testValue) {
MyUtil.testValue = testValue;
}
5.zuul过滤器的生命周期,zuulServlet的部分源码是这样的:
try {
preRouting();
} catch (ZuulException e) {
error(e);
postRouting();
return;
}
// Only forward onto to the chain if a zuul response is not being sent
if (!RequestContext.getCurrentContext().sendZuulResponse()) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
try {
routing();
} catch (ZuulException e) {
error(e);
postRouting();
return;
}
try {
postRouting();
} catch (ZuulException e) {
error(e);
return;
}
preRouting()代表的是运行前置过滤器....
6.zuul网关的异常处理的两种方式:
第一种:
RequestContext.getCurrentContext().setResponseBody("{\r\n" +
" \"errCode\": \"100\",\r\n" +
" \"errMsg\": \"error...\",\r\n" +
" \"respTime\": 1514960494791,\r\n" +
" \"success\": false\r\n" +
"}");
RequestContext.getCurrentContext().setSendZuulResponse(false);
这种方式有个坏处,无法在全局捕获做处理。
第二种:
借助/error端点,在里面把异常捕获,然后再抛,或者在里面处理也行,具体参考ms-gateway;
7.zuul网关如何对单个指定的api进行限流
zuul没有提供指定api限流的配置,那是不是就没办法了,经过阅读部分源码,我是这么做的
@Autowired
RateLimitProperties rateLimitProperties;//这个是zuul创建的单例
然后在过滤器中:
if(!gatewayHelper.isLimit(request)) {//如果不限流
rateLimitProperties.setEnabled(false);
}
filterChain.doFilter(request, response);
rateLimitProperties.setEnabled(true);
8.zuul网关如何做到动态路由
由于zuul是依赖eureka的,假如要将非eureka服务也加入网关,那就要做动态路由,思路是这样的:
首先添加一个监听器,在springboot.run()方法运行完之后,调用notify或call方法启动监听器,
然后读取数据库/或配置文件里面的路由信息,添加到路由列表中,然后refresh一下路由列表就ok了(正在实现中)。
9.第一次访问超时的配置:
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 6000000
10.springcloud的重试:
配置:
spring:
cloud:
loadbalancer:
retry:
enabled: true
ribbon:
# 同一实例最大重试次数,不包括首次调用
MaxAutoRetries: 1
# 重试其他实例的最大重试次数,不包括首次所选的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都进行重试
OkToRetryOnAllOperations: false
Zuul的重试:
zuul:
# 开启Zuul的重试
retryable: true
ribbon:
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
OkToRetryOnAllOperations: false
11. 适用于jar形式的轻便发布步骤:
(1).修改插件,瘦身,排除dependency
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>abc</groupId>
<artifactId>abc</artifactId>
</include>
</includes>
</configuration>
</plugin>
(2).编译打包:mvn clean package
(3).生成所需dependency:mvn dependency:copy-dependencies
(4).运行jar:nohup java -Dloader.path="dependency/" -jar -Dspring.config.location=file:./config/ -Dspring.profiles.active=test ms-commune-1.0.1.jar &
12. 有时候明明jar存在,且不报任何错误,但是一运行就报class找不到,就算删除仓库的依赖重新下载也是没用的。
这个时候要考虑换版本,不是换springcloud的版本,就算要换所依赖jar的版本;
13. springcloud的spring session经过zuul网关时被屏蔽
在开发的过程中出现一件很奇怪的事情,明明给前端返回了JSESSIONID,但是从前端将JSESSIONID提交的时候,zuul将其屏蔽了,这样就导致用户会话频频失效,后经查阅zuul文档,发现为了安全性考虑,zuul不会将任何会话信息转发到下游服务,解决方案有两个:
(1) 农社1.0版采用的是这种方案。
修改配置:sensitiveHeaders不设置值
zuul:
routes:
ms-commune:
path: /ms-commune/**
sensitiveHeaders:
修改Feign的配置:
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return requestTemplate -> {
String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
if (!Strings.isNullOrEmpty(sessionId)) {
requestTemplate.header("Cookie", "SESSION=" + sessionId);
}
};
}
}
修改hystrix线程隔离策略:
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
//
(2) 弃用Spring Session,使用token解析userId,将userId route给下游服务,农社1.1版采用的是这种方案。
15.上传文件时找不到临时目录的错误:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1667947326360042103.8089/work/Tomcat/localhost/ms-commune] is not valid
解决方案:
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("102400KB");
factory.setLocation("/tmp");
return factory.createMultipartConfig();
}
16.磁盘报警或文件上传时报错:
发现是磁盘空间满了,使用如下指令排查:
du -sh 命令查看ftp文件夹使用的容量:
[root@pre-lb01 /]# du -sh /data/yhqz-resource
12G /data/yhqz-resource
df命令查看文件夹所在的文件系统磁盘情况:
[root@pre-lb01 /]# df /data/yhqz-resource
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root 18102140 17762960 0 100% /
发现磁盘使用了100%
du -h --max-depth=1:列出当前文件下的所有文件及文件夹的大小
ls -lht:列出当前文件夹下所有文件的大小
17.centos上添加的新用户竟然不能ssh远程登录
[root@ch-nginx ~] useradd -d "/home/lzj" -m -s "/bin/bash" lzj
[root@ch-nginx ~] passwd lzj
解决方案:在/etc/ssh/sshd_config文件中将要远程登录的用户添加进去
[root@ch-nginx ~] vim /etc/ssh/sshd_config
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
AllowUsers root lzj
#ListenAddress 0.0.0.0
#ListenAddress ::
18.阿里云ECS搭建的vsftp不能登录
报错信息:服务器发回了不可路由的地址,使用服务器地址代替
编辑vsftpd的配置文件,vim /etc/vsftpd/vsftpd.conf
修改
connect_from_port_20=NO #关闭掉vsftpd的主动模式
添加
pasv_enable=YES #使vsftpd运行在被动模式
pasv_min_port=30000 #被动模式最小端口号30000
pasv_max_port=31000 #被动模式最大端口号31000
我这里选择的是30000-31000端口,可自行选择。保存配置文件并退出。重启vsftpd服务,systemctl restart vsftpd.service
如果使用的是iptables防火墙,编辑iptables配置文件,vim /etc/sysconfig/iptables
,添加
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT #开放ftp协议21端口
-A INPUT -p tcp --dport 30000:31000 -j ACCEPT #开放30000-31000号端口
保存配置文件并退出。重启iptables服务,systemctl restart iptables.service
如果使用VPS或ECS,在安全组规则配置允许21和30000-31000端口访问。以阿里云为例,进入实例-管理-安全组-配置规则
,在入方向添加21/21
和30000/31000
。
19. 断点消失的问题
异常状况:在IDEA中调试,忽然断点就消失了,然后整个应用开始阻塞,点击任何按钮都无反应。
分析:是一个跑批任务,不断的产生新的线程,使用了线程池进行管理,都是在下面这个方法执行完之后就开始阻塞:
public static boolean checkday(Date date){
return true;
}
解决:开启JConsole对整个线程监控,发现起完第8个线程后,就不会继续开启新线程了,并且第8个线程的堆栈信息显示如下:
20. 表 SFT.AC_LN_REPAY_PLN_HST 无法通过 128 (在表空间 ONEPAYPASS 中) 扩展
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC;
网友评论