Skip to content

Implementation of REST, gRPC, WebSockets and GraphQL endpoints within one container with data stored in SQLite

License

Notifications You must be signed in to change notification settings

ArturMarekNowak/gRPCGraphQLWebSockets

Repository files navigation

gRPC GraphQL WebSockets

Build Trivy and Dockle CodeFactor

The objective of this project is to make a toy example of REST API, gRPC, GraphQL and Websockets all accessing and realizing the same objective: retrieving and sending a simple message to the same database.

Table of contents

General info

Solution consists of two projects:

  1. gRPCGraphQLWebSockets.csproj - this project contains database along with REST API, gRPC, GraphQL and SignalR server
  2. Second item - this project contains SignalR client

After project is build and run the four API's can be accessed via given URL's:

For container the origin is: http://localhost:8080/

Solution structure is as following:

.
└──src
	├── GrpcGraphQlWebSockets   # Server application for REST, GraphQL, SignalR and gRPC
	│	├── Database            # Directory where database context is stored along with SQLite database itself
	│	├── google     			# This directory contains .proto files required to run gRPC, placed in here beacuse otherwise it won't work
	│	├── GraphQl   			# GraphQL mutations, queries and models are stored in here
	│	├── Grpc        		# gRPC service.cs and service.proto files are stored in here
	│	├── Rest         		# REST controller, service and model
	│	├── SignalR    			# SignalR server hub is stored in here
	│	└── SharedModel      	# Models the same throughout the whole solution
	│        
	└── SignalRClient           # Simple SignalR client console application - one file and one .csproj
		└── ...               

Screenshots

SignalR

You can see messages incoming from gRPC and REST being broadcasted to SignalR client as I wanted to be. They are with timestamp. You can also see message sent from SignalR client upon which Id was returned as indication of succesfull message sending.

SignalR

gRPC

gRPC response in swagger.

gRPC

GraphQL

GraphQL example.

GraphQL

Technologies

  • REST API
  • gRPC
  • GraphQL
  • SignalR
  • SQLite
  • Docker

Setup

If you have .NET8 and Visual Studio or JetBrains Rider just open .sln file and try to run the project.

Code

Code itself i nothing ordinary in my opinion. Just a lot of dependency injection and it works as I wanted. Few things are worth noticing:

  • GraphqlQL is so super cool, super powerful and super easy to code :D
  • However GraphQL required me to use method injection which is sad beacuse I really like constructor injection :c Reference: https://chillicream.com/docs/hotchocolate/integrations/entity-framework
  • I have used a really UGLY naming convention where classes names start with API name for example: RESTNewMessage, gRPCMessage and so on. It is ugly but I neeeded to differentiate objects in project and wanted sustain object "descriptivity".

Features

REST, SignalR, GraphQL and gRPC - all in one :D

To-do list:

All is done :D

Status

Project is: finished

thoughts I have heard a lot about how cool GraphQL and gRPC are so I have decided to make one toy example and encapsulate it in the same project with REST and SignalR in orderd to get the best possible comparison and visualization.

Since Microsoft documentation on gRPC+Swagger is realy "so so" these two guys were my inspiration in this case:

grpc/grpc-dotnet#167 (comment)

https://github.com/bernardbr/dotnetgrpcrest

https://github.com/fl0wm0ti0n/GrpcWithHttpApiSwaggerAndDocker_Test

About

Implementation of REST, gRPC, WebSockets and GraphQL endpoints within one container with data stored in SQLite

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published