Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その18 )( Docker で Redis の環境を構築する(単体サーバ構成)+Spring Actuator の Endpoint の Basic 認証ではセッション情報を生成しないようにする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
参照したサイト・書籍
redis/5.0/Dockerfile
https://github.com/docker-library/redis/blob/a5d019077b46494751482512c200c4df34463dc6/5.0/Dockerfile- Redis の Dockerfile です。
RedisをCentOS7にインストールしてみた
http://www.denet.ad.jp/technology/2017/11/redis-centos7.htmlCalling redis-cli in docker-compose setup
https://stackoverflow.com/questions/33304388/calling-redis-cli-in-docker-compose-setupRedis 5.0 Update解説
https://qiita.com/maruloop/items/207654bfd0ed2a453300Prometheus Redis
https://grafana.com/dashboards/763oliver006/redis_exporter
https://github.com/oliver006/redis_exporterprometheus_exporters
https://supermarket.chef.io/cookbooks/prometheus_exporters/versions/0.6.0
目次
- 単体の Redis サーバの環境を構築する
- ksbysample-webapp-lending から接続する + redis-cli で確認する
- Spring Actuator の Endpoint の Basic 認証ではセッション情報を生成しないようにする
- Redis のメトリックスを Prometheus + Grafana で表示してみる
手順
単体の Redis サーバの環境を構築する
docker-compose.yml に redis の設定を追加します。
redis: image: redis:5.0.1 container_name: redis ports: - "6379:6379"
docker-compose up -d
コマンドを実行して起動します。
IntelliJ IDEA の Docker Plugin からログを見てみると WARNING が2つ出力されていました。開発環境で問題になるような設定ではなさそうなので、このままにします。
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
ksbysample-webapp-lending から接続する + redis-cli で確認する
src/main/resources/application-develop.properties を以下のように変更します。
spring.redis.host=localhost spring.redis.port=6379
- 以下の設定を削除します。
- 以下の設定を追加します。
- spring.redis.host=localhost
- spring.redis.port=6379
Tomcat を起動します。Spring Actuator の health check を見ると redis が認識されています。
ブラウザから http://localhost:8080/ のログイン画面にアクセスしてログインを試みると、問題なくログインできました。
redis-cli で redis のデータを確認してみます。docker exec -it redis redis-cli
を実行すると redis-cli が起動して Docker 内の redis サーバにアクセスできるので keys *
コマンドを実行してみます。
redis 起動後にログイン画面に1回アクセスして1回ログインしただけにしてはデータが多いですね。。。 おそらく犯人は "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:actuator"
でしょう。Spring Actuator の Endpoint に設定した Basic 認証でログインした時にセッション情報が作成されていることが原因のようです。
Spring Actuator の Endpoint の Basic 認証ではセッション情報を生成しないようにする
src/main/java/ksbysample/webapp/lending/config/WebSecurityConfig.java の以下の点を変更します。
@Configuration @Order(1) public static class ActuatorWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http // Spring Actuator の Endpoint のみ Basic認証を設定する .requestMatcher(EndpointRequest.toAnyEndpoint()) .authorizeRequests() .anyRequest().hasRole("ENDPOINT_ADMIN") .and() .httpBasic() // Spring Actuator の Endpoint の Basic認証の時は認証するだけでサーバ側にセッションを作成しない // これにより Spring Session のセッション情報保存先である Redis 上にデータが作成されなくなる .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS); } }
http.requestMatcher(EndpointRequest.toAnyEndpoint()).sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
を追加します。
確認します。Tomcat を1度停止した後、redis-cli で flushdb コマンドを実行して redis のデータをクリアします。
Tomcat を起動 → http://localhost:8080/actuator/prometheus にアクセスした後、redis 上にデータが作成されていないことを確認します。
http://localhost:8080/ のログイン画面にアクセスしてログインした後、今度は redis 上にデータが作成されていることを確認します。
参考までに、今回実装した箇所をコメントアウトしてから http://localhost:8080/actuator/prometheus にアクセス → redis-cli で keys * を繰り返すと redis 上のデータが増えていくことが確認できます。
Redis のメトリックスを Prometheus + Grafana で表示してみる
Redis のメトリックスを Grafana で表示させる Dashboard があるのか調べてみたところ Prometheus Redis を見つけました。これを利用して表示させてみます。
Redis → Prometheus への exporter は oliver006/redis_exporter を Docker で起動して利用します。docker-compose.yml に redis_exporter の設定を追加します。
redis_exporter: image: oliver006/redis_exporter:latest container_name: redis_exporter ports: - "9121:9121" environment: - REDIS_ADDR=redis://172.23.136.33:6379
docker/prometheus/prometheus.yml に redis_exporter からメトリックスを収集する設定を追加します。
scrape_configs: .......... - job_name: 'redis_exporter' static_configs: - targets: ['172.23.136.33:9121']
docker-compose down
、docker-compose up -d
コマンドを実行します。
Grafana に Prometheus Redis の Dashboard を追加します。http://localhost:3000/ にアクセスした後、画面左側のメニューから「Create」-「Import」を選択します。
「Import」画面が表示されますので 763
の ID を入力します。
「prom」で「spring-actuator」を選択した後、「Import」ボタンをクリックします。
Prometheus Redis の Dashboard が表示されます(画面右上の表示間隔の設定を Last 24 hours Refresh every 30s
→ Last 30 minutes Refresh every 5s
に変更しています)。
履歴
2018/11/25
初版発行。
2018/11/26
* .httpBasic()
と .sessionManagement()
を .and()
で繋げる記述に変更しました。