Spring Cloud Finchley.M6 issue

spring framework 2018.02.21 21:04 posted by dev.bistro


현재 request/reply EDA 를 구축하기 위한 보일플레이트 프로젝트 작성중이다. 와꾸는 Spring Boot 2.0 / Spring 5.0 / Spring Cloud Finchley.M6 를 셋팅하고 있다.


역시나 불안전한 모습을 많이 보여주고 있다. 우선 오늘 발생한 이슈 2가지,

compile('org.springframework.cloud:spring-cloud-stream-binder-kafka')
compile('org.springframework.cloud:spring-cloud-stream-binder-kstream')

디펜던시에 binder-kstream와 binder-kafka를 동시에 넣으면 

Field configurationProperties in org.springframework.cloud.stream.binder.kafka.config.KafkaBinderConfiguration required a single bean, but 2 were found:

오류가 발생한다. 어느 개발자의 PR로 다음에는 해결 되는 이슈이다. 

PR : https://github.com/spring-cloud/spring-cloud-stream-binder-kafka/pull/315/files


다음 이슈로 binding channel 마다.. 각각의 consumer와, producer 설정을 해야 한다는 점. 설정을 안하면 NPE 를 볼 수 있다.

bindings:
output:
destination: "logging.notification.shipping.result"
producer:
headerMode: raw
input:
destination: "data.order.sheet"
group: "in-grp"
consumer:
headerMode: raw

처럼 각각의 채널마다 producer consumer를 설정해야한다....  

springboot 문서를 참고 하면 /metrics 에 cache hit ratio 가 노출된다고 나온다 ( https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-metrics.html#production-ready-datasource-cache ) 하지만 그 리스트에 Caffeine 을 지원한 다는 얘기는 없다.  기본적으로 chche size는 metrics 에 노출이 되지만, hit/miss ratio는 노출이 되지 않으므로 구현이 필요하다.

현재 상황 : 

지원 목록 : EhCache, Hazelcast, Infinispan, JCache and Guava


확인 : 문서에 나온대로 CacheStatisticsAutoConfiguration, CacheStatisticsProvider 를 사용하면 가능 할 것 같다.

그래서 아래와 같은 Spring Bean을 등록

@Bean
public CacheStatisticsProvider<CaffeineCache> getCaffeineCacheStatisticsProvider() {
return (cacheManager, cache) -> {
DefaultCacheStatistics statistics = new DefaultCacheStatistics();
CacheStats status = cache.getNativeCache().stats();
long result = status.requestCount();
if (result > 0) {
statistics.setSize(cache.getNativeCache().estimatedSize());
statistics.setHitRatio(status.hitRate());
statistics.setMissRatio(status.missRate());
}
return statistics;
};
}

 

이후 실행을 해보았지만, 원하는 대로 노출이 안되었다. Caffeine 쪽에서 해답을 얻을 수 있었다. 아래 내용을 참고 하여 기존 Cache를 만드는 부분에  아래 부분을 추가하였다.

.recordStats()

참고 링크 : https://github.com/ben-manes/caffeine/wiki/Statistics


결과 : http://localhost:8080/metrics

  • cache.product.miss.ratio0.42857142857142855,
  • cache.product.hit.ratio0.5714285714285714,
  • cache.product.size3,


추가 : SpringBoot 2.0 부터는 micrometer 기반으로 caffeine로 지원을 한다. 

stream kafka app 에 rabbitmq sleuth 사용하기

Cloud 2018.01.31 20:06 posted by dev.bistro

현재 팀은 SpringBoot application 을  좀 더 운영하기 쉽도록 하기 위해서 starter를 하나 생성해서 사용하고 있다.

cloud-netflix 셋팅과, 그 많고 많은 zuul, eureka 버그 픽스를 위한 몇몇 코드, 그리고 config server를 기반으로 한 다양한 설정들을 공통화 하기 위한 목적이다. 현재 진행 하는 프로젝트는 이 starter 를 쓰지 않고 순수하게 spring/kafka 만을 사용 하고 있다.

이 프로젝트를 위해 별도의 metrics 시스템을 구축하기 보다는 기존의 sleuth-zipkin 인프라를 활용하기 위해서 spring-cloud-sleuth-stream을 사용하려 한다.


1. gradle 설정 추가

['stream-kafka'].collect {
compile "org.springframework.cloud:spring-cloud-starter-$it"
}
compile 'org.springframework.cloud:spring-cloud-stream'

에서 

compile 'org.springframework.cloud:spring-cloud-sleuth-stream'
compile 'org.springframework.cloud:spring-cloud-stream-rabbit'
compile "org.springframework.cloud:spring-cloud-starter-sleuth'

를 추가하였다.


2. 설정 추가

spring:
application:
name: pacman
rabbitmq:
addresses: 172.18.176.196:5672
username: rabbitmq
password: rabbitmq
sleuth:
sampler:
percentage: 1.0
stream:
enabled: true
zipkin:
service:
name: vine-event-pacman

* zipkin.service.name 을 추가해야만 했다. application.name 을 그대로 사용 할 줄 알았는데.. 어디선가 자동으로 해주고 있는 거였나보다.

이렇게만 설정하면 아래와 같은 에러를 볼 수 있다.  

현재 우리의 zipkin은 rabbitmq 기반인데, 하필이면 이 프로젝트는 binder로 kafka를 사용하고 있었다.
당연하게 stream binder로 kafka, rabbit를 동시에 쓰고 있어서 발생한 문제였고, DefaultBinderFactory 를 확인하여 default binder 를 설정함으로서 해결 할 수 있었다.

Caused by: java.lang.IllegalStateException: A default binder has been requested, but there is more than one binder available for 'org.springframework.integration.channel.DirectChannel' : kafka,rabbit, and no default binder has been set

cloud:
stream:
default-binder: "rabbit"





티스토리 툴바