美文网首页
Java开发遇到的一些报错

Java开发遇到的一些报错

作者: 大厂offer | 来源:发表于2018-04-24 15:06 被阅读33次

    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;
    

    相关文章

      网友评论

          本文标题:Java开发遇到的一些报错

          本文链接:https://www.haomeiwen.com/subject/ledjlftx.html