分类
Java 笔记 编程

DataSource health check failed

在项目中集成ShardingJDBC,启动报错:ConnectionCallback; isValid; nested exception is java.sql.SQLFeatureNotSupportedException: isValid

该项目是新做的,使用较新版本的Spring Boot 2.3,数据库连接词用Hikari。

用Sharding-JDBC蛮久了,之前一直是与DBCP2或Druid,没出过什么问题。这次集成Hikari,系统虽然报错但也能正常启动,仔细看源码,问题应该出在键康检查。

分类
Nginx Web 笔记

Nginx https 反向代理 http

在Docker中运行WEB应用,由主机Nginx反向代理。由于Docker中的应用是http,而反向代理强制使用https,会遇到有些情况代理失败。

只要在配置中加上

proxy_set_header X-Forwarded-Proto https;

完整配置:

server {
    listen 80;
    listen [::]:80;
    server_name engr-z.com www.engr-z.com;
#    enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name engr-z.com www.engr-z.com;

    client_max_body_size 1G;

    ssl_certificate /data/www/cert/engr-z.com_nginx/cert.pem;
    ssl_certificate_key /data/www/cert/engr-z.com_nginx/cert.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://127.0.0.1:8001/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
#        proxy_cookie_path / /;
    }
}
分类
Java 笔记

阿里云自动动态地址解析

家里找电信开通了动态公网地址,每天IP会变一次。我的域名是在阿里云申请的,路由器只支持花生壳和公云的DDNS设置,每天手动变更一次域名指向麻烦,利用阿里云的API,写了一个动态更新的小工具。

首先在阿里云后台申请创建AccessKey:

分类
笔记 软件

IntelliJ IDEA 启动报错

打开idea报错:Address already in use: bind

昨天还用的好好的,只是后来升级Android Studio插件失败过。Android Studio是Google基于Idea开发的,所以会不会是这个影响?

打开Android Studio,发现也报错。

分类
Java 日记 笔记

Sharding JDBC Demo 2.0 (主从版)

从今年初接触Sharding JDBC 4.0到现在,近一年了,用来做日志和消息分表一直运行,没什么大的问题。前些天生产新上了一个服务,是因为Sharding JDBC把select for update语句解析为查询,在从库中执行,因为从库是只读权限所以报错。

之前没在测试环境发现这个问题,是因为测试环境数据库没有主从。想起当时刚接触Sharding JDBC写的Demo,于是整理一番,重新拉分支,并完善整个流程,模拟真实场景。

分类
Linux 容器 笔记 网络

UFW防火墙规则对Docker映射端口无效

在自己的服务器开启防火墙,使用UFW设置规则:

ufw default deny

默认禁用所有连接,测试发现,用Docker运行的APP端口能正常访问。

UFW是为了简化Iptables产生的,它在Iptables有自己的规则链。Docker在启动时在Iptables会创建自己的规则链,所以不生效。

分类
Java 大数据 笔记 编程

Spring Data Elasticsearch兼容问题

使用Spring Data Elasticsearch查询Elasticsearch数据计数

NativeSearchQueryBuilder searchQueryBuilder1 = new NativeSearchQueryBuilder()
                    .withIndices(BURY_POINT_DURATION)
                    .withQuery(boolQueryBuilder)
                    .withFields("eventId", "eventType", "eventName");
SearchQuery searchQuery1 = searchQueryBuilder1.build();
Long clickTotalCount = elasticsearchRestTemplate.count(searchQuery1);

执行错误:Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.elasticsearch.search.SearchHits.getTotalHits()J

分类
笔记 编程

缓存穿透 vs 缓存雪崩 vs 缓存失效

缓存穿透

场景描述

 一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去后端系统查找(比如 DB)。如果 key 对应的 value 是一定不存在的,并且对该 key 并发请求量很大,就会对后端系统造成很大的压力,我们称之为缓存穿透

解决方案
  • 对查询结果为空的情况也进行缓存,缓存过期时间设置短一点(避免消耗太多的缓存空间),或者该 key 对应的数据 insert 了之后清理缓存
  • 对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 Bitmap 过滤
  • 排查是否是自身程序或者数据的问题,亦或是外部恶意攻击或者爬虫,导致大量访问不存在的 key 值
分类
大数据 笔记

Elasticsearch 分页

Elasticsearch提供两种分页,一种是使用from-size分页:

GET /_search
{
  "from": 5,
  "size": 20,
  "query": {
    "match_all": {}
  }
}

from:偏移量
size:每页显示条数

ES默认情况下,使用from和size参数翻页不支持超过10000个文档,这个限制是使用索引设置的,可以设置 index.max_result_window 参数。

深度分页或一次请求许多结果可能会导致搜索缓慢。结果在返回之前先进行排序。由于搜索请求通常跨越多个分片,因此每个分片必须生成自己的排序结果。然后,必须对这些单独的结果进行合并和排序,以确保总体排序顺序正确。

作为深度分页的替代方法,官方建议使用滚动分页代替。

分类
Windows 笔记

Win10 开启 WSL2

WSL2 使用最新、最强大的虚拟化技术在轻量级实用工具虚拟机 (VM) 中运行 Linux 内核。 但是,WSL2 不是传统的 VM 体验。

Win10从2004版开始支持WSL2,开启方法:打开设置-应用

注:WSL2是基于Hyper-V虚拟机,打开后,VMware和Virtualbox需要升级到最新版才能兼容。但是安卓模拟器无法使用。