Slide 1

Slide 1 text

BEYOND HTTP IN ASP.NET CORE 3.0 WITH gRPC Steve Gordon @stevejgordon | stevejgordon.co.uk http://bit.ly/dotnet-grpc

Slide 2

Slide 2 text

FULL DISCLOSURE

Slide 3

Slide 3 text

STORY TIME ARE YOU SITTING COMFORTABLY?

Slide 4

Slide 4 text

@stevejgordon www.stevejgordon.co.uk HTTP 3rd Party API

Slide 5

Slide 5 text

WHAT HAPPENED NEXT?...

Slide 6

Slide 6 text

…BUZZWORDS

Slide 7

Slide 7 text

@stevejgordon www.stevejgordon.co.uk 3rd Party API 3rd Party API 3rd Party API

Slide 8

Slide 8 text

WHAT IS WRONG WITH REST?

Slide 9

Slide 9 text

gRPC REMOTE PROCEDURE CALL

Slide 10

Slide 10 text

@stevejgordon www.stevejgordon.co.uk • Contract based • Supports code generation • Multi-platform C#, C++, Dart, Go, Java, Node, Objective-C, PHP, Python, Ruby • HTTP/2 • Uses a binary, Protobuf payload

Slide 11

Slide 11 text

@stevejgordon www.stevejgordon.co.uk 2001 Google Stubby March 2015 gRPC open sourced August 2016 gRPC v1.0.0 Sept 2019 gRPC .NET with .NET Core 3.0

Slide 12

Slide 12 text

@stevejgordon www.stevejgordon.co.uk Getting Started Create a new project Select 'gRPC Service'

Slide 13

Slide 13 text

@stevejgordon www.stevejgordon.co.uk Project Structure

Slide 14

Slide 14 text

*.PROTO

Slide 15

Slide 15 text

@stevejgordon www.stevejgordon.co.uk syntax = "proto3"; option csharp_namespace = "HelloWorld"; package Greet; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }

Slide 16

Slide 16 text

@stevejgordon www.stevejgordon.co.uk syntax = "proto3"; option csharp_namespace = "HelloWorld"; package Greet; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }

Slide 17

Slide 17 text

@stevejgordon www.stevejgordon.co.uk syntax = "proto3"; option csharp_namespace = "HelloWorld"; package Greet; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }

Slide 18

Slide 18 text

@stevejgordon www.stevejgordon.co.uk syntax = "proto3"; option csharp_namespace = "HelloWorld"; package Greet; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }

Slide 19

Slide 19 text

@stevejgordon www.stevejgordon.co.uk syntax = "proto3"; option csharp_namespace = "HelloWorld"; package Greet; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }

Slide 20

Slide 20 text

GETTING STARTED DEMO …

Slide 21

Slide 21 text

gRPC & MICROSERVICES

Slide 22

Slide 22 text

@stevejgordon www.stevejgordon.co.uk SERVICE B (NODE) SERVICE C (.NET) SERVER SERVICE A (.NET) SERVER CLIENT SERVICE D (GO) SERVER CLIENT CLIENT PROTO A PROTO A PROTO B PROTO B PROTO C PROTO C

Slide 23

Slide 23 text

@stevejgordon www.stevejgordon.co.uk • Unary Single request with a single response – A normal function call • Server Streaming Single request with a stream of responses for the client to consume • Client Streaming Client sends a stream of requests, each receiving a single response • Bidirectional Streaming Client sends a stream of requests and consumes a stream of responses

Slide 24

Slide 24 text

STREAMING DEMOS

Slide 25

Slide 25 text

PERFORMANCE

Slide 26

Slide 26 text

REST Body 10,072 Bytes GRPC Body 1,916 Bytes RESULTS 80.98% SMALLER

Slide 27

Slide 27 text

@stevejgordon www.stevejgordon.co.uk • No need for *.proto • Apply attributes to .NET interfaces and classes • Interface(s) define your services • Classes define your message models • Can also use a *.proto to generate the C# code • Share contracts as libraries between .NET servers and clients

Slide 28

Slide 28 text

CODE-FIRST gRPC DEMO

Slide 29

Slide 29 text

THE BIG FINISH DEMO!

Slide 30

Slide 30 text

@stevejgordon www.stevejgordon.co.uk ASP.NET Core Service (.NET) CLIENT weather.proto gRPC Weather Service (.NET) SERVER weather.proto HTTP SignalR HTTP gRPC …

Slide 31

Slide 31 text

@stevejgordon www.stevejgordon.co.uk • Performance • Efficient binary serialisation (low CPU overhead) using Protobuf • Smaller payloads • HTTP/2 is fundamentally quicker • Code-gen server and clients for many languages/frameworks • Contract based • Supports first class streaming

Slide 32

Slide 32 text

@stevejgordon www.stevejgordon.co.uk • Code generation in .NET is C# only • Kestrel doesn't support HTTP/2 with TLS on macOS https://docs.microsoft.com/en-us/aspnet/core/grpc/aspnetcore?view=aspnetcore-3.0&tabs=visual-studio#grpc-and-aspnet-core-on-macos • Harder to exercise without tools such as Postman

Slide 33

Slide 33 text

@stevejgordon www.stevejgordon.co.uk • A great choice for microservice communication • A good way to support server-to-server communication in polyglot environments • Easy to get started using the gRPC service template • gRPC .NET libraries make creating servers and clients very easy https://github.com/grpc/grpc-dotnet

Slide 34

Slide 34 text

THANK YOU @stevejgordon www.stevejgordon.co.uk https://app.pluralsight.com/profile/author/steve-gordon http://bit.ly/dotnet-grpc