Java开发遇到的一些报错

2018-04-24  本文已影响33人  大厂offer

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/2130000/31000

19. 断点消失的问题

异常状况:在IDEA中调试,忽然断点就消失了,然后整个应用开始阻塞,点击任何按钮都无反应。
分析:是一个跑批任务,不断的产生新的线程,使用了线程池进行管理,都是在下面这个方法执行完之后就开始阻塞:

        public static boolean checkday(Date date){          
            return true;
        }

解决:开启JConsole对整个线程监控,发现起完第8个线程后,就不会继续开启新线程了,并且第8个线程的堆栈信息显示如下:

JConsole监控

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;
上一篇下一篇

猜你喜欢

热点阅读