eubnara / study

6 stars 2 forks source link

netflix zuul 2.0 simple app 해보기 #155

Open eubnara opened 5 years ago

eubnara commented 5 years ago

https://github.com/Netflix/zuul/wiki/Getting-Started-2.0 https://github.com/Netflix/zuul/tree/2.1/zuul-sample

eubnara commented 5 years ago

뭔가 이상할 땐, zuul-sample/src/main/resources/log4j.properties 에서 로그레벨을 조정하고 로그를 확인해 보자.

eubnara commented 5 years ago

로그에 찍히는 알 수 없는 주소들이 왜 들어간 걸까 궁금했다. application.properties 의 기본값 때문에 발생한 로그였다.

us-east-1.discoverytest.netflix.net 에 ping 테스트를 해보면 다음과 같은 주소들이 나온다. (더 있을지도 모른다.)

ec2-75-101-165-111.compute-1.amazonaws.com
ec2-204-236-228-170.compute-1.amazonaws.com
ec2-50-17-247-232.compute-1.amazonaws.com
ec2-50-19-255-91.compute-1.amazonaws.com
eubnara commented 5 years ago

로컬에 eureka 를 띄워보고 application.properties 설정값을 바꾸면 테스트가 될 것으로 보인다. 아니면, 일단 ribbon 으로 테스트를 해보아도 될 것 같고.

eubnara commented 5 years ago

eureka example trouble shooting

tomcat 을 설치하고 https://github.com/Netflix/eureka/tree/master/eureka-examples#setting-up-the-eureka-server 가이드라인에 의해 실행했지만, 알 수 없는 오류로 구동에 실패한다. 아래는 일부만 발췌한 로그

2019-09-09 08:55:58,431 ERROR com.netflix.discovery.DiscoveryClient:990 [DiscoveryClient-CacheRefreshExecutor-0] [fetchRegistry] DiscoveryClient_EUREKA/AL01205764.local - was unable to refresh its cache! status =
 org/apache/http/message/ParserCursor
java.lang.NoClassDefFoundError: org/apache/http/message/ParserCursor
        at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143)
        at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
        at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
        at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:281)
        at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:257)
        at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:230)
        at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
        at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
        at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:684)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
        at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
        at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:173)
        at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123)
        at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27)
        at com.sun.jersey.api.client.Client.handle(Client.java:652)
        at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)
        at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
        at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:509)
        at com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.getApplicationsInternal(AbstractJerseyEurekaHttpClient.java:194)
        at com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.getApplications(AbstractJerseyEurekaHttpClient.java:165)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137)
        at com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient.execute(MetricsCollectingEurekaHttpClient.java:73)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137)
        at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.executeOnNewServer(RedirectingEurekaHttpClient.java:118)
        at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.execute(RedirectingEurekaHttpClient.java:79)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137)
        at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:120)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137)
        at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
        at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1069)
        at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:983)
        at com.netflix.discovery.DiscoveryClient.refreshRegistry(DiscoveryClient.java:1497)
        at com.netflix.discovery.DiscoveryClient$CacheRefreshThread.run(DiscoveryClient.java:1464)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:835)
2019-09-09 08:56:08,239 WARN  com.netflix.discovery.InstanceInfoReplicator:125 [DiscoveryClient-InstanceInfoReplicator-0] [run] There was a problem with the instance info replicator
java.lang.NoClassDefFoundError: com/netflix/appinfo/AmazonInfo
        at com.netflix.appinfo.ApplicationInfoManager.refreshDataCenterInfoIfRequired(ApplicationInfoManager.java:204)
        at com.netflix.discovery.DiscoveryClient.refreshInstanceInfo(DiscoveryClient.java:1401)
        at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:117)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:835)
2019-09-09 08:56:28,244 ERROR com.netflix.discovery.DiscoveryClient:878 [DiscoveryClient-HeartbeatExecutor-0] [renew] DiscoveryClient_EUREKA/AL01205764.local - was unable to send heartbeat!
java.lang.NoClassDefFoundError: com/netflix/discovery/shared/transport/decorator/EurekaHttpClientDecorator$3
        at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89)
        at com.netflix.discovery.DiscoveryClient.renew(DiscoveryClient.java:864)
        at com.netflix.discovery.DiscoveryClient$HeartbeatThread.run(DiscoveryClient.java:1423)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:835)

JAVA_HOME 을 jdk 1.8 에 잘 세팅해주니 된다.

https://tomcat.apache.org/tomcat-9.0-doc/class-loader-howto.html 에서 힌트를 얻었다. 기본 JAVA_HOME 에서 무언가 잘못 얻어오는 것은 아닐까 라는 추측

java.lang.NoClassDefFoundError

라는 에러가 발생하고 있었고.

eubnara commented 4 years ago

로컬에 eureka 를 바라보도록 zuul 을 설정할 때, 다음과 같은 설정이 필요하다.

eureka.shouldUseDns=false
eureka.eurekaServer.context=eureka/v2
eureka.eurekaServer.domainName=localhost
eureka.serviceUrl.default=http://${eureka.eurekaServer.domainName}:8080/${eureka.eurekaServer.context}
eubnara commented 4 years ago

그 사이에 패치들이 있었다. https://github.com/Netflix/zuul/commit/f9a4d783d82f8770fa89189629113e0215b542a4 가 적용된 것을 사용하니 잘 된다.

eubnara commented 4 years ago

테스트 해보니, 2.0.24 버전부터 잘된다. io.netty:netty-tcnative-boringssl-static:2.0.24.Final

eubnara commented 4 years ago

로그가 안남아 디버깅이 어려운데 slf4j binding 을 하지 않아서 그런 것 같다.

참고: https://gmlwjd9405.github.io/2019/01/04/logging-with-slf4j.html

처음 시작 시, 다음과 같은 로그 발견

$ ./gradlew run

> Configure project :
Inferred project: zuul, version: 2.1.6-SNAPSHOT
Publication nebula not found in project :.

> Task :zuul-sample:run
Zuul Sample: starting up.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
eubnara commented 4 years ago

zuul-core build.gradle 에 다음 라인을 추가하니 로그가 잘 찍힌다.

dependencies {
...
    compile "org.slf4j:slf4j-log4j12:1.7.9"
...
}