Service Discovery
PyMS support at this moment this service discovery
- Consul
- Eureka (TODO)
- Kubernetes (TODO)
Consul
This service use Consul Client Library to connect to Consul
pyms:
  services:
    service_discovery:
      service: "consul"
      host: "localhost"
      autoregister: true
  config:
    DEBUG: true
    TESTING: false
    APP_NAME: "Python Microservice"
    APPLICATION_ROOT: ""
Check your local configuration with Docker. Run:
docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true, "enable_script_checks": true}' consul
Open http://localhost:8500/ to check if Consul is up. If it's ok, when you run your microservice with
autoregister: true parameter, you will see in Consul your microservice like this image:

Consulate client
You can use all consulate options with 
ms.service_discovery.client or current_app.ms.service_discovery.client. In example:
ms.service_discovery.client.agent.checks()
See official docs for more information.
Create your own Service Discovery
Instead of define a service keyword, you can point to a class in your proyect that inherit from ServiceDiscoveryBase (see example above)
pyms:
  services:
    service_discovery:
      service: "myproject.servicesdiscovery_file.MySvcDiscovery"
      host: "localhost"
      autoregister: true
  config:
    DEBUG: true
    TESTING: false
    APP_NAME: "Python Microservice"
    APPLICATION_ROOT: ""
Under myproject/servicesdiscovery_file.py:
from pyms.flask.services.service_discovery import ServiceDiscoveryBase
class ServiceDiscoveryConsulBasic(ServiceDiscoveryBase):
    def register_service(self, id_app, host, port, healtcheck_url, app_name):
        headers = {"Content-Type": "application/json; charset=utf-8"}
        data = {
            "id": app_name + "-" + id_app,
            "name": app_name,
            "check": {"name": "ping check", "http": healtcheck_url, "interval": "30s", "status": "passing"},
        }
        response = requests.put(
            "http://{host}:{port}/v1/agent/service/register".format(host=host, port=port),
            data=json.dumps(data),
            headers=headers,
        )
        if response.status_code != 200:
            raise Exception(response.content)