Microservice using gRPC to provide weather and geolocation data
Find a file
2022-07-27 02:58:00 -04:00
info Added UML diagram 2022-07-26 02:24:10 -04:00
proto Update proto files 2022-07-26 15:05:21 -04:00
server Cleaned up redundant code 2022-07-27 02:58:00 -04:00
test-client Added location endpoint 2022-07-26 17:28:33 -04:00
.gitignore Update .gitignore 2022-07-26 01:04:53 -04:00
go.mod Corrected module path 2022-07-26 01:05:52 -04:00
go.sum Added go.sum 2022-07-26 01:05:35 -04:00
LICENSE Create LICENSE 2022-07-25 19:53:56 +02:00
README.md Update 'README.md' 2022-07-26 10:05:48 +02:00

OpenWeatherMap-gRPC-API

A microservice that accepts remote procedure calls to fetch weather data.

The service uses protocol buffers to define a gRPC API that fetches current and extended weather data.

Weather data is obtained from OpenWeather's high-end servers.

Sending Requests

Basic Workflow

  1. Generate the necessary code for your preferred language from the files in the proto directory with the protoc compiler
  2. Import the code into your project
  3. Use the imported code to allow your client to connect with the server
  4. Use the imported code within your own functions to make requests

Generating code from the .proto files

Run protoc from the root of the project. The below example shows how one might generate Go code.

protoc -Iproto --go_opt=module=codeberg.org/andcscott/OpenWeatherMap-gRPC-API \
--go_out=. --go-grpc_opt=module=codeberg.org/andcscott/OpenWeatherMap-gRPC-API \
--go-grpc_out=. proto/*.proto

Importing the code

Import the code into your project. Example in Go:

import pb "codeberg.org/andcscott/OpenWeatherMap-gRPC-API/proto"

Using the imported code to connect to the server

First, enable your client to connect to the server. Example in Go:

conn, err := grpc.Dial("localhost:5000", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
	log.Fatalln(err)
}
defer conn.Close()

c := pb.NewWeatherServiceClient(conn)

See the test-client for more details.

Using the imported code to make requests

In this case, we're requesting the current weather for Corvallis, OR.

func doCurrent(c pb.WeatherServiceClient) {
	res, err := c.Current(context.Background(), &pb.RequestCurrent{
		City: "Corvallis",
	})
	if err != nil {
		log.Fatalln(err)
	}
	log.Println(res.Payload)
}

See the test-client for more details.

Receiving the response

Data will be sent to your client as JSON. Example from the above call:

{"coord":{"lon":-123.262,"lat":44.5646},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"base":"stations","main":{"temp":296.87,"feels_like":297.13,"temp_min":294.98,"temp_max":298.62,"pressure":1007,"humidity":70},"visibility":10000,"wind":{"speed":2.14,"deg":284,"gust":1.94},"clouds":{"all":0},"dt":1658811503,"sys":{"type":2,"id":2005452,"country":"US","sunrise":1658753522,"sunset":1658807208},"timezone":-25200,"id":5720727,"name":"Corvallis","cod":200}

UML Diagram

UML diagram