protoc-gen-go-grpc: update README.md to reflect recent changes (#3883)
diff --git a/cmd/protoc-gen-go-grpc/README.md b/cmd/protoc-gen-go-grpc/README.md
index d5b0a3b..152c68a 100644
--- a/cmd/protoc-gen-go-grpc/README.md
+++ b/cmd/protoc-gen-go-grpc/README.md
@@ -62,30 +62,34 @@
### Migration from legacy version
+Older versions of `protoc-gen-go-grpc` and `protoc-gen-go` with the grpc plugin
+used a different method to register services. With that method, it was only
+possible to register a service implementation that was a complete
+implementation of the service. It was also possible to embed an
+`Unimplemented` implementation of the service, which was also generated and
+returned an UNIMPLEMENTED status for all methods.
+
+#### Generating the legacy API
+
+To avoid the need to update existing code, an option has been added to the code
+generator to produce the legacy API alongside the new API. To use it:
+
+```sh
+# Example 1: with OPTS set to common options for protoc-gen-go and
+# protoc-gen-go-grpc
+protoc --go_out=${OPTS}:. --go-grpc_out=${OPTS},gen_unstable_server_interfaces=true:. *.proto
+
+# Example 2: if no special options are needed
+protoc --go_out=:. --go-grpc_out=gen_unstable_server_interfaces=true:. *.proto
+```
+
+**The use of this legacy API is NOT recommended.** It was discontinued as it
+results in compilation breakages when new methods are added to services, which
+is a backward-compatible change in all other languages supported by gRPC. With
+the newer API, newly-added methods will return an UNIMPLEMENTED status.
+
#### Updating existing code
-The previous version of protoc-gen-go-grpc used a different method to register
-services. In that version, it was only possible to register a service
-implementation that was a complete implementation of the service. It was also
-possible to embed an `Unimplemented` implementation of the service, which was
-also generated and returned an UNIMPLEMENTED status for all methods. To make
-it easier to migrate from the previous version, two new symbols are generated:
-`New<Service>Service` and `Unstable<Service>Service`.
-
-`New<Service>Service` allows for easy wrapping of a service implementation into
-an instance of the new generated `Service` struct type. *This has drawbacks,
-however: `New<Service>Service` accepts any parameter, and does not panic or
-error if any methods are missing, are misspelled, or have the wrong signature.*
-These methods will return an UNIMPLEMENTED status if called by a client.
-
-`Unstable<Service>Service` allows for asserting that a type properly implements
-all methods of a service. It is generated with the name `Unstable` to denote
-that it will be extended whenever new methods are added to the service
-definition. This kind of change to the service definition is considered
-backward-compatible in protobuf, but is not backward-compatible in Go, because
-adding methods to an interface invalidates any existing implementations. *Use
-of this symbol could result in future compilation errors.*
-
To convert your existing code using the previous code generator, please refer
to the following example:
@@ -96,10 +100,6 @@
// ... method handler implementation ...
-// Optional; not recommended: to guarantee myEchoService fully implements
-// EchoService:
-var _ pb.EchoServer = &myEchoService{}
-
func main() {
// ...
@@ -107,37 +107,12 @@
pb.RegisterEchoServer(grpcServer, &myEchoService{})
// NEW:
- pb.RegisterEchoService(grpcServer, pb.NewEchoService(&myEchoService{}))
-
-
- // Optional: to gracefully detect missing methods:
- if _, ok := &myEchoService{}.(pb.EchoServer); !ok {
- fmt.Println("myEchoService does not implement all methods of EchoService.")
- }
-
+ es := &myEchoService{}
+ pb.RegisterEchoService(grpcServer, pb.EchoService{
+ UnaryEcho: es.UnaryEcho,
+ // enumerate all methods in EchoService implemented by myEchoService...
+ })
// ...
}
```
-
-#### Updating generated code to support both legacy and new code
-
-`protoc-gen-go-grpc` supports a flag, `migration_mode`, which enables it to be
-run in tandem with the previous tool (`protoc-gen-go` with the grpc plugin).
-It can be used as follows:
-
-```sh
-go install github.com/golang/protobuf/protoc-gen-go
-
-# Example 1: with OPTS set to common options for protoc-gen-go and
-# protoc-gen-go-grpc
-protoc --go_out=${OPTS},plugins=grpc:. --go-grpc_out=${OPTS},migration_mode=true:. *.proto
-
-# Example 2: if no special options are needed
-protoc --go_out=plugins=grpc:. --go-grpc_out=migration_mode=true:. *.proto
-```
-
-This is recommended for temporary use only to ease migration from the legacy
-version. The `Register<Service>Server` and `<Service>Server` symbols it
-produced are not backward compatible in the presence of newly added methods to
-a service.
\ No newline at end of file