Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions Dockerfile.app
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,4 @@ WORKDIR /app

COPY --from=build /app/src/bin/ /app/

RUN ls

ENTRYPOINT ["/app/server"]
22 changes: 20 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,32 @@ pb:
-Ithird_party/googleapis \
-Ithird_party/grpc-gateway \
--go_out=plugins=grpc:protos/ \
--grpc-gateway_out=logtostderr=true:protos/
--grpc-gateway_out=logtostderr=true:protos/ \
--include_imports --include_source_info \
--descriptor_set_out=protos/proto.pb

build:
- go build -o bin/grpc-service main.go
- go build -o bin/gateway gateway/main.go
- go build -o bin/client clients/main.go

client:
- ./bin/client

grpc-service:
- ./bin/grpc-service

gateway-service:
- ./bin/gateway
- ./bin/gateway

dc-gateway:
- docker-compose up grpc_gateway grpc_app mongo

dc-gateway-build:
- docker-compose --build up grpc_gateway grpc_app mongo

dc-envoy:
- docker-compose up envoy-proxy grpc_app mongo

dc-envoy-build:
- docker-compose up --build envoy-proxy grpc_app mongo
31 changes: 31 additions & 0 deletions clients/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Web site created using create-react-app" />
<title>GRPC chat</title>
</head>

<body>
<div id="root"></div>
<button>Load from server</button>
<div></div>
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$(document).on('click', 'button', function () {
$.ajax({
url: "http://localhost:8080/entities"
}).done(function () {
$('div').append("done !!! - ");
});
});
});
</script>

</body>

</html>
45 changes: 45 additions & 0 deletions clients/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package main

import (
"context"
"io"
"log"
"os"

"github.com/joho/godotenv"
pb "github.com/trinhdaiphuc/Example-CRUD-with-Mongo-use-http-transcoding-to-gRPC/protos"
"google.golang.org/grpc"
"google.golang.org/protobuf/types/known/emptypb"
)

func main() {
var conn *grpc.ClientConn

err := godotenv.Load()

conn, err = grpc.Dial(os.Getenv("SERVER_HOST"), grpc.WithInsecure())
log.Println("Host: ", os.Getenv("SERVER_HOST"))
if err != nil {
log.Fatalf("Did not connect %s ", err)
}
defer conn.Close()

client := pb.NewEntityServiceClient(conn)

response, err := client.ListEntities(context.Background(), &emptypb.Empty{})

if err != nil {
log.Fatalf("Error when calling ListEntities: %s", err)
}

for {
entities, err := response.Recv()
if err == io.EOF {
break
}
if err != nil {
log.Fatalf("%v.ListEntities(_) = _, %v", client, err)
}
log.Println(entities)
}
}
20 changes: 16 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
version: "3"

services:
envoy-proxy:
image: envoyproxy/envoy-dev
ports:
- 8080:51051
volumes:
- ./protos/proto.pb:/data/proto.pb
- ./envoy-proxy.yaml:/etc/envoy/envoy.yaml
depends_on:
- grpc_app
environment:
- GRPC_VERBOSITY=debug

grpc_app:
build:
dockerfile: Dockerfile.app
context: .
volumes:
- ./server:/app/src/server
- .:/app/src/server
depends_on:
- mongo
ports:
Expand All @@ -30,11 +42,11 @@ services:
- ENTITY_SERVER_HOST=grpc_app:50051

mongo:
image: "mongo:4.2.1"
image: mongo:latest
volumes:
- "mongo:/data/db"
- mongo:/data/db
ports:
- "27100:27017"
- 27100:27017

volumes:
mongo:
64 changes: 64 additions & 0 deletions envoy-proxy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 0.0.0.0, port_value: 9901 }

static_resources:
listeners:
- name: service-entity-http-listeners
address:
socket_address: { address: 0.0.0.0, port_value: 51051 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: grpc_json
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
cors:
allow_origin_string_match:
- safe_regex:
google_re2: {}
regex: \*
allow_methods: "GET, POST, PUT, DELETE"
filter_enabled:
default_value:
numerator: 100
denominator: HUNDRED
runtime_key: cors.www.enabled
shadow_enabled:
default_value:
numerator: 0
denominator: HUNDRED
runtime_key: cors.www.shadow_enabled
routes:
- match: { prefix: "/entity.EntityService", grpc: {} }
route: { cluster: grpc-backend-services, timeout: { seconds: 60 } }
http_filters:
- name: envoy.filters.http.grpc_json_transcoder
config:
proto_descriptor: "/data/proto.pb"
services: ["entity.EntityService"]
print_options:
add_whitespace: true
always_print_primitive_fields: true
always_print_enums_as_ints: false
preserve_proto_field_names: true
- name: envoy.filters.http.cors
- name: envoy.filters.http.router

clusters:
- name: grpc-backend-services
connect_timeout: 1.25s
type: logical_dns
lb_policy: round_robin
http2_protocol_options: {}
hosts:
- socket_address:
address: grpc_app
port_value: 50051
Loading