Widemesh Services
A service either serves network requests through endpoints for public access over the Internet(Web Service) or serves other services in the environment(Worker) via Middleware or direct HTTP requests.
Each Service in the Stack runs the same version of the code and launches Processes of the built source code in the stack specific command of your choosing.
Commands
Each Service can launch the source code in different ways; the following command prepares the worker
to run the app with the queue
argument:
mesh svc update worker --command "app queue"
While the web
service launches the HTTP server:
mesh svc update web --command "app server"
Note: Services may fail to launch the command specified in the Service, to debug any problem with your Service see Monitoring and Debugging.
Abilities
Here’s a list of abilities of a Service:
- Connect to the Internet
- Connect to Databases and Distributed Queues
- Make outbound requests to the Internet
- Receive inbound requests from other services in the same environment.
- Run programs on periodic schedules
There are three types of services: Workers, Web Services, and Cron Jobs.
Workers
A worker is a service that does not service Inbound traffic from the Internet; as soon it’s bound to any Endpoint, it becomes a Web Service.
Cron Jobs
A cron job is a sub-type of Worker that runs Instances of your programs on a given schedule, for example, assuming you want to run the program with arguments node send-emails.js
on an hourly basis, you can create a cron job as follows:
mesh svc create -n emailsender --schedule "@hourly" -- node send-emails.js
Cron jobs accept most of the cron job syntax; here’s a few examples:
- At 04:05 am:
5 4 * * *
- At 04:06 pm:
5 16 * * *
- On hourly basis:
@hourly
- Every two minutes:
@every 2m
Web Service
A web service is any service published through an Endpoint from the Environment, typically the Service in the Stack that contains the user-facing API or Web Application is a web service.
Example, assuming the environment platform alias is https://top.widemesh.dev
you can publish the service web
as follows:
mesh svc publish -n worker --endpoint https://top.widemesh.dev
A Web Service can be reverted to a Worker with mesh service unpublish
:
mesh svc unpublish -n worker --endpoint https://top.widemesh.dev
You can also publish your web services in a sub-path of your domain with --path
, example:
mesh service publish --stack myblog --n web --endpoint www --path /blog
Intra-DNS Resolution
Each Service in the environment contains a Hostname that load balances between the healthy Instances of the Service, which is pretty useful for network-based micro-services, the format of the hostname format is as follows:
<stack-name>-<service-name>
Example:
You have a service called web
inside the Stack app
, and it wants to make a POST /payments
request to the payments
service of the Stack finance
, it can use the following URL to perform HTTP requests:
POST http://finance-payments/payments
Widemesh directs the HTTP request to any healthy Instance of the payment service.
Scaling
Each Service in the Stack can be scaled independently to a user-defined number of Instances.
Example, the following command instructs Widemesh to launch five instances of the service web
:
mesh svc update web --instances 5
Monitoring and Debugging
Service instances may crash after they start, they may run out of memory and not even start at all because the command contains a typo.
For that you can monitor the status of each Instance, the number of restarts, message, and exit codes of the Instances with list
:
mesh service ls
Interactive Shells
You can get an interactive shell to a new instance of service with the following command:
mesh service run -n web -- /bin/bash
Note: Some docker base images such as alpine
do not feature /bin/bash
; you can use/bin/sh
instead.