mirror of https://github.com/istio/istio.io.git
132 lines
5.3 KiB
Markdown
132 lines
5.3 KiB
Markdown
---
|
|
title: Run a Microservice Locally
|
|
overview: Learn how to work on a single service on your local machine.
|
|
weight: 10
|
|
owner: istio/wg-docs-maintainers
|
|
test: no
|
|
---
|
|
|
|
{{< boilerplate work-in-progress >}}
|
|
|
|
Before the advent of microservice architecture, development teams built,
|
|
deployed and ran the whole application as one large chunk of software. To test a
|
|
small change in their module not merely by unit testing, the developers had to
|
|
build the whole application. Therefore the builds took large amount of time.
|
|
After the build, the developers deployed their version of the application into a
|
|
test server. The developers ran the server either on a remote machine, or on their
|
|
local computer. In the latter case, the developers had to install and operate a
|
|
rather complex environment on their local computer.
|
|
|
|
In the era of microservice architecture, the developers write, build, test and
|
|
run small software services. Builds are fast. With modern frameworks like
|
|
[Node.js](https://nodejs.org/en/) there is no need to install and operate
|
|
complex server environments to test a single service, since the service runs as
|
|
a regular process. You do not have to deploy your service to some environment to
|
|
merely test it, so you just build your service and run it immediately on your
|
|
local computer.
|
|
|
|
This module covers the different aspects involved in developing a single service
|
|
on a local machine. You don't need to write code though. Instead, you build,
|
|
run, and test an existing service: `ratings`.
|
|
|
|
The `ratings` service is a small web app written in
|
|
[Node.js](https://nodejs.org/en/) that can run on its own. It performs similar
|
|
actions to those of other web apps:
|
|
|
|
- Listen to the port it receives as a parameter.
|
|
- Expect `HTTP GET` requests on the `/ratings/{productID}` path and return the
|
|
ratings of the product matching the value the client specifies for `productID`.
|
|
- Expect `HTTP POST` requests on the `/ratings/{productID}` path and update the
|
|
ratings of the product matching the value you specify for `productID`.
|
|
|
|
Follow these steps to download the code of the app, install its dependencies,
|
|
and run it locally:
|
|
|
|
1. Download
|
|
[the service's code]({{< github_blob >}}/samples/bookinfo/src/ratings/ratings.js)
|
|
and
|
|
[the package file]({{< github_blob >}}/samples/bookinfo/src/ratings/package.json)
|
|
into a separate directory:
|
|
|
|
{{< text bash >}}
|
|
$ mkdir ratings
|
|
$ cd ratings
|
|
$ curl -s {{< github_file >}}/samples/bookinfo/src/ratings/ratings.js -o ratings.js
|
|
$ curl -s {{< github_file >}}/samples/bookinfo/src/ratings/package.json -o package.json
|
|
{{< /text >}}
|
|
|
|
1. Skim the service's code and note the following elements:
|
|
- The web server's features:
|
|
- listening to a port
|
|
- handling requests and responses
|
|
- The aspects related to HTTP:
|
|
- headers
|
|
- path
|
|
- status code
|
|
|
|
{{< tip >}}
|
|
In Node.js, the web server's functionality is embedded in the code of the application. A Node.js
|
|
web application runs as a standalone process.
|
|
{{< /tip >}}
|
|
|
|
1. Node.js applications are written in JavaScript, which means that there is no
|
|
explicit compilation step. Instead, they use [just-in-time compilation](https://en.wikipedia.org/wiki/Just-in-time_compilation). To build a Node.js application, then means to install its dependencies. Install
|
|
the dependencies of the `ratings` service in the same folder where you
|
|
stored the service code and the package file:
|
|
|
|
{{< text bash >}}
|
|
$ npm install
|
|
npm notice created a lockfile as package-lock.json. You should commit this file.
|
|
npm WARN ratings No description
|
|
npm WARN ratings No repository field.
|
|
npm WARN ratings No license field.
|
|
|
|
added 24 packages in 2.094s
|
|
{{< /text >}}
|
|
|
|
1. Run the service, passing `9080` as a parameter. The application then listens on port 9080.
|
|
|
|
{{< text bash >}}
|
|
$ npm start 9080
|
|
> @ start /tmp/ratings
|
|
> node ratings.js "9080"
|
|
Server listening on: http://0.0.0.0:9080
|
|
{{< /text >}}
|
|
|
|
{{< tip >}}
|
|
The `ratings` service is a web app and you can communicate with it as you would
|
|
with any other web app. You can use a browser or a command line web client like
|
|
[`curl`](https://curl.haxx.se) or [`Wget`](https://www.gnu.org/software/wget/).
|
|
Since you run the `ratings` service locally, you can also access it via the
|
|
`localhost` hostname.
|
|
{{< /tip >}}
|
|
|
|
1. Open [http://localhost:9080/ratings/7](http://localhost:9080/ratings/7) in
|
|
your browser or access `ratings` using the `curl` command from a different terminal window:
|
|
|
|
{{< text bash >}}
|
|
$ curl localhost:9080/ratings/7
|
|
{"id":7,"ratings":{"Reviewer1":5,"Reviewer2":4}}
|
|
{{< /text >}}
|
|
|
|
1. Use the `POST` method of the `curl` command to set the ratings for the
|
|
product to `1`:
|
|
|
|
{{< text bash >}}
|
|
$ curl -X POST localhost:9080/ratings/7 -d '{"Reviewer1":1,"Reviewer2":1}'
|
|
{"id":7,"ratings":{"Reviewer1":1,"Reviewer2":1}}
|
|
{{< /text >}}
|
|
|
|
1. Check the updated ratings:
|
|
|
|
{{< text bash >}}
|
|
$ curl localhost:9080/ratings/7
|
|
{"id":7,"ratings":{"Reviewer1":1,"Reviewer2":1}}
|
|
{{< /text >}}
|
|
|
|
1. Use `Ctrl-C` in the terminal running the service to stop it.
|
|
|
|
Congratulations, you can now build, test, and run a service on your local computer!
|
|
|
|
You are ready to [package the service](/docs/examples/microservices-istio/package-service) into a container.
|