Enable eureka.client.healthcheck - spring-boot

I'm following http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html to build distributed system with Spring Cloud.
All works as expected apart from Eureka Client Healthcheck.
I have
eureka:
client:
healthcheck:
enabled: true
And pointing my service to nonexisten config_server, this results in
http://myservice:8080/health
{
status: "DOWN"
}
But Eureka server still showing this instance as UP and keep sending traffic to it.
What am I missing?
spring-boot: 1.2.8.RELEASE
spring-cloud-netflix : 1.0.4.RELEASE

You have to explicitly set eureka.client.healthcheck.enabled=true to link the Spring Boot health indicator to the Eureka registration. Source code reference: here.

Ok, I think I found it.
According to https://jmnarloch.wordpress.com/2015/09/02/spring-cloud-fixing-eureka-application-status/ this feature will only be available on Spring Cloud 1.1.
To make it work with 1.0.4 I need to implement my own HealthCheckHandler.
Thanks #xtreme-biker for bringing up Spring Cloud version issue.

Related

how to expose prometheus metrics from spring boot apps registered with spring cloud eureka server

I am trying to implement prometheus monitoring for spring boot apps but my spring boot apps are registered with spring cloud eureka server so I don't have an option to configure static ports for the apps in prometheus config, I can only configure scraping for eureka server like below but not for the apps registered with eureka. Can anyone please suggest?
static_configs:
- targets: ["http://mycompany.eurekaserver.net:8761"]
Came here to add new answer that, Eureka SD is supported now in Prometheus from 2.21 version onwards.
Documentation available at https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config
Sample configuration is available at Sample Eureka SD config
Currently eureka server has no direct integration with prometheus, so we have to use SD adapter, I would recommend below, which is working as expected without much effort.
https://github.com/twinformatics/eureka-consul-adapter

How to register non Spring Boot MicroService in Eureka discovery server

I have recently installed a micro service infrastraucture based on Spring Boot + Spring Cloud.
My Spring Boot microservices register in my Eureka server and Zuul automaticaly redirects requests to them.
I have a Drupal content manager that exposes content through REST interface and I'd like it to take part in the discovery rave party. How can I have my drupal register it self in the Eureka server so Zuul redirects the corresponding calls to it?
As an ugly workaround I wonder if I can have automatic discovery and routing running in Zuul while manually configuring some REST paths to be redirected to the drupal server? (Using zuul.routes... property files)
I found that I can add manual zuul routes in bootstrap.yaml
I have tried adding it in the application yaml property files in configuration server but for some reason they are ignored when the Eureka discovery server is working.
Anyway, bootstrap.yaml works. Example:
zuul:
routes:
mta_api:
path: /mta_api/**
url: http://my-non-springboot-rest-service.com/
stripPrefix: false
You could add sidecar to your non-springboot application. This would allow Eureka support.
Source: Dead- http://cloud.spring.io/spring-cloud-static/Edgware.SR4/single/spring-cloud.html#_polyglot_support_with_sidecar
Current: https://cloud.spring.io/spring-cloud-static/Dalston.SR5/multi/multi__polyglot_support_with_sidecar.html

JHipster micro-services unable to register properly to Eureka on AWS

I have a Spring Cloud application working well on AWS.
I decided to add JHipster generated micro-services (the JHipster gateway and UAA).
Both of these services register to an existing Eureka Server, like all the previous ones.
Things work fine on a local machine, or running in Docker containers deployed on a EC2 instance on AWS.
However, when deploying on different EC2 instances, the JHipster generated services are not registering correctly. The Eureka UI displays :
Application AMIs Availability Zones Status
HELLO-SERVICE ami-809f84e6 (2) eu-west-1b (1), eu-west-1a (1) UP (2) - i-02eg07053a672ea37 , i-083c2f2204d01f4ba
UAA n/a (2) (2) UP (2) - 97b39345fb59:uaa:9999 , ga6831e52701:uaa:9999
"HELLO-SERVICE" is a simple spring boot app. Eureka displays AWS information, and links it to a private ip/port which is working.
"UAA" is generated by Jhipster. Eureka is missing AWS information for this service, and links it to a 172.17.x.x.x address which is not working.
What bothers me is that both services share the same eureka configuration files :
eureka:
datacenter: cloud
instance:
preferIpAddress: true
client:
healthcheck:
enabled: true
registerWithEureka: true
fetchRegistry: true
region: eu-west-1
preferedSameZone: true
availabilityZones:
eu-west-1: eu-west-1a,eu-west-1b
serviceUrl:
eu-west-1a: http://[eurekainstance]:8761/eureka/
eu-west-1b: http://[eurekainstance]:8761/eureka/
Why would a JHipster generated app and a simple Spring Boot app behave differently while sharing the same configuration ?
I have run out of ideas, any help would be much appreciated!
I'll anwser my own question in case it's useful to someone.
The issue had nothing to do with JHipster or AWS, but with Docker.
Adding an EurekaInstanceConfigBean solved it:
public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inet) {
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inet);
AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
config.setDataCenterInfo(info);
info.getMetadata().put(AmazonInfo.MetaDataKey.localHostname.getName(), info.get(AmazonInfo.MetaDataKey.localIpv4));
config.setHostname(info.get(AmazonInfo.MetaDataKey.localHostname));
config.setIpAddress(info.get(AmazonInfo.MetaDataKey.localIpv4));
config.setNonSecurePort(port);
return config;
}
See the documentation for more information.

Does Eureka and Ribbon work for non spring boot application?

I am rewriting a Spring MVC system.
The system is something like this in simple:
[Gateway<->Backend Services<->Databases], where Gateway is a controller simply for authentication and forwarding the requests to Backend services.
The Backend services will be refactored to micro-services. I will use Eureka service to do registration for each of them. So eventually the architecture will be: [Gateway <-> Eureka <-> Backend micro-services <-> Databases]. The Gateway will lookup the registries from Eureka server and call the micro services.
However, the Gateway is not a spring boot application(and will NOT be rewritten as Spring boot), thus I don't believe Spring's eureka features (#EnableEurekaClient , DiscoveryClient, ect.) can be adopted easily as the examples do. Actually I tried adding the eureka client annotation to Gateway's controller, which caused my application collapsed.
Moreover, Ribbon is needed in the Gateway for client side loading balancing. But the same concern is as above.
//Update on 1st Nov.
I have set up an Eureka server and a client, both of which are written in spring boot. I am using these two application for my Spring MVC testing. The server and client are running well.
Server's configuration application.properties is as below
server.port=8761
spring.application.name=service-itself
eureka.client.service-url.default-zone=http://localhost:8761/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=false
logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
client's is as below: application.yml
spring:
application:
name: say-hello
server:
port: 8090
eureka:
client:
service-url:
defaultZone: http://${eureka.host:localhost}:${eureka.port:8761}/eureka/
When accessing the Eureka dashboard localhost:8761, I can see that client has been registered.
For my Spring MVC gateway, as it is not a Spring boot project, so I copied the example to my project simply for testing whether it can connect to the Eureka server and retrieve the registered the instance of "say-hello" client. Unfortunately, it cannot do so with saying "Cannot get an instance of example service to talk to from eureka" which is printed at line 76 in the example class.
Here is the eureka-client.properties placed in gateway's classpath. I can confirmed that the Client class is reading the config file.
eureka.name=gatewayEurekaClient
eureka.vipAddress=say-hello
eureka.port=8761
eureka.preferSameZone=true
eureka.preferSameZone=true
eureka.shouldUseDns=false
eureka.serviceUrl.default=http://localhost:8761/eureka
eureka.serviceUrl.defaultZone=http://localhost:8761/eureka
Moreover, this is the debug information when new DiscoveryClient(applicationInfoManager, clientConfig); is being executed
instanceInfo InstanceInfo (id=234)
actionType null
appGroupName "UNKNOWN" (id=246)
appName "GATEWAYEUREKACLIENT" (id=247)
asgName null
countryId 1
dataCenterInfo PropertiesInstanceConfig$1 (id=248)
healthCheckExplicitUrl null
healthCheckRelativeUrl "/healthcheck" (id=253)
healthCheckSecureExplicitUrl null
healthCheckUrl "http://A156N7AB89AXNZQ:8761/healthcheck" (id=254)
homePageUrl "http://A156N7AB89AXNZQ:8761/" (id=255)
hostName "A156N7AB89AXNZQ" (id=256)
instanceId "A156N7AB89AXNZQ" (id=256)
ipAddr "10.209.66.64" (id=257)
isCoordinatingDiscoveryServer Boolean (id=258)
isInstanceInfoDirty false
isSecurePortEnabled false
isUnsecurePortEnabled true
lastDirtyTimestamp Long (id=260)
lastUpdatedTimestamp Long (id=263)
leaseInfo LeaseInfo (id=264)
metadata ConcurrentHashMap<K,V> (id=266)
overriddenstatus InstanceInfo$InstanceStatus (id=267)
port 8761
secureHealthCheckUrl null
securePort 443
secureVipAddress null
secureVipAddressUnresolved null
sid "na" (id=270)
status InstanceInfo$InstanceStatus (id=271)
statusPageExplicitUrl null
statusPageRelativeUrl "/Status" (id=272)
statusPageUrl "http://A156N7AB89AXNZQ:8761/Status" (id=273)
version "unknown" (id=274)
vipAddress "say-hello" (id=275)
vipAddressUnresolved "say-hello" (id=275)
I am running out of idea. Can anyone please give a hand on this problem?
Ribbon (https://github.com/Netflix/ribbon) and Eureka (https://github.com/Netflix/eureka) can work without Spring (and that is the way they were developed in the first place) but you will need to put a bit more effort into configuring everything to your needs.
Support for Ribbon and Eureka in Spring is part of the Spring Cloud project (and mvn group id), not Spring Boot. I don't think boot is mandatory. Ribbon and Eureka themselves are provided by Netflix.
For ribbon, you need to define your own #LoadBalanced RestTemplate #Bean anyway. #EnableDiscoveryClient should work as long as the dependencies have spring cloud eureka and your class is a #Configuration class.
Short answer is - why not try a quick test? :).

Disabling Eureka Client when running Zuul Server

I am trying to use Zuul as reverse proxy without discovery server. Things seem to work. One thing that bothers me is that the discovery client keeps looking for a discovery server. How do I disable this behavior?
Solution is as simple as adding this to application.yml:
eureka:
client:
enabled: false
As suggested by #spencergibb below, excluding the eureka dependencies also disables the discovery client. I ended up choosing this latter approach as it inherently simplifies my build.

Resources