Skip to content

JSON RPC standard

  • it is a standard communication protocol between client and server.
  • The communication can be bidirectional, it means that both client and server can send/receive messages from the opposite part
  • the request is sent to a server that implements the protocol
  • JSON-RPC is used to implement the LSP (Language Server Protocol)
  • compilers can expose their services implementing interfaces provided by the Language Server
  • tools can consume new services by connecting to the server.
  • The communication is defined by JSON messages sharing that have a fixed structure:
{
  "jsonrpc": "2.0",
  "id":0,
  "method":"sayHelloWorld",
  "params":["UserFirstName UserLastName"]
}
  • method is the string with the name of the method to be invoked.
  • params is an Object or Array of values to be passed as parameters to the defined method.
  • id is a value of any type used to match the response with the request that it is replying to.

And this could be a typical response from the server:

content-type: application/json-rpc
content-length: 60
date: Mon, 25 Jun 2018 08:20:15 GMT

{
"jsonrpc": "2.0",
"id": 0,
"result": "Hello world, UserFirstName UserLastName"
}

Underhood implementation

RPC implementation in Java

Jsonrpc4j is the most easy/important implementation of the JSON-RPC procedures for Java language. A good tutorial on how simply turn on the lights is available here

Deploy on docker container

  1. Perform a build to create the jar file bash mvn package
  2. Create a Docker file with instruction on how spawn the image with the jar inside of it:
FROM java:8
WORKDIR /
ADD bootrpc-0.1.0.jar bootrpc-0.1.0.jar
EXPOSE 8080
CMD java -jar bootrpc-0.1.0.jar
  1. Spawn the image with the command:
docker build . -f Dockerfile -t bootrpc
  1. Run the container:
docker run bootrpc
  1. Verify that the container is up:
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9dead33f5efa        bootrpc                "/bin/sh -c 'java -j…"   2 hours ago         Up 2 hours          8080/tcp            jovial_euler
  1. Perform a Curl to verify that everything works as expected:
curl -H "Content-Type:application/json" -d '{"id":0, "method":"sayHelloWorld", "params":["Andera Doe"]}' http://172.17.0.2:8080/rpc/myservice
  1. If everything works fine we can receive a response with '200 ok' http response code with a JSON in the response body:
{"jsonrpc": "2.0", "result": "Hello visitor!", "id": 3}