{"id":18559180,"url":"https://github.com/linux-china/reactive-grpc-spring-boot-starter","last_synced_at":"2025-04-10T02:30:41.124Z","repository":{"id":136595860,"uuid":"175327450","full_name":"linux-china/reactive-grpc-spring-boot-starter","owner":"linux-china","description":"Spring Boot Starter for Reactive gRPC","archived":false,"fork":false,"pushed_at":"2019-03-13T18:22:10.000Z","size":41,"stargazers_count":6,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-02T02:51:13.197Z","etag":null,"topics":["grpc","reactive","reactor","rxjava2","spring-boot"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linux-china.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-13T01:58:05.000Z","updated_at":"2022-09-18T10:03:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"96c6691d-8ec9-451b-bc16-3fdf5eed2cfa","html_url":"https://github.com/linux-china/reactive-grpc-spring-boot-starter","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-china%2Freactive-grpc-spring-boot-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-china%2Freactive-grpc-spring-boot-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-china%2Freactive-grpc-spring-boot-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-china%2Freactive-grpc-spring-boot-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linux-china","download_url":"https://codeload.github.com/linux-china/reactive-grpc-spring-boot-starter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248144158,"owners_count":21054876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["grpc","reactive","reactor","rxjava2","spring-boot"],"created_at":"2024-11-06T21:42:14.253Z","updated_at":"2025-04-10T02:30:41.118Z","avatar_url":"https://github.com/linux-china.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"Spring Boot Starter Reactive gRPC\n=================================\nSpring Boot 2.0 starter for Reactive gRPC (https://github.com/salesforce/reactive-grpc) to bring reactive style for grpc-java.\n\n### How to use?\n\n* Please clone the repository and install reactive-grpc-spring-boot-starter artifact to your local Maven repository. \n\n```\n$ git clone git@github.com:linux-china/reactive-grpc-spring-boot-starter.git\n$ cd reactive-grpc-spring-boot-starter\n$ mvn -P release -DskipTests clean install\n```\n\n* Add dependency and repository in your pom.xml. Now reactive-grpc-spring-boot-starter hosted by jitpack\n```xml\n\u003cproject\u003e\n ...\n \u003cdependencies\u003e\n     \u003cdependency\u003e\n        \u003cgroupId\u003ecom.github.linux-china\u003c/groupId\u003e\n        \u003cartifactId\u003ereactive-grpc-spring-boot-starter\u003c/artifactId\u003e\n        \u003cversion\u003e1.0.0-SNAPSHOT\u003c/version\u003e\n     \u003c/dependency\u003e\n \u003c/dependencies\u003e\n \n\u003c/project\u003e\n```\n\n* Add protobuf-maven-plugin with Reactor-gRPC protocPlugin included. **Attention:** proto files should be in \"src/main/proto\" directory\n\n```xml\n\u003cbuild\u003e\n        \u003cextensions\u003e\n            \u003cextension\u003e\n                \u003cgroupId\u003ekr.motd.maven\u003c/groupId\u003e\n                \u003cartifactId\u003eos-maven-plugin\u003c/artifactId\u003e\n                \u003cversion\u003e1.6.1\u003c/version\u003e\n            \u003c/extension\u003e\n        \u003c/extensions\u003e\n        \u003cplugins\u003e\n            \u003cplugin\u003e\n                \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n                \u003cartifactId\u003emaven-compiler-plugin\u003c/artifactId\u003e\n                \u003cversion\u003e3.8.0\u003c/version\u003e\n                \u003cconfiguration\u003e\n                    \u003csource\u003e1.8\u003c/source\u003e\n                    \u003ctarget\u003e1.8\u003c/target\u003e\n                    \u003cparameters\u003etrue\u003c/parameters\u003e\n                \u003c/configuration\u003e\n            \u003c/plugin\u003e\n            \u003cplugin\u003e\n                \u003cgroupId\u003eorg.xolstice.maven.plugins\u003c/groupId\u003e\n                \u003cartifactId\u003eprotobuf-maven-plugin\u003c/artifactId\u003e\n                \u003cversion\u003e0.6.1\u003c/version\u003e\n                \u003cconfiguration\u003e\n                    \u003cprotocArtifact\u003ecom.google.protobuf:protoc:${protobuf-java.version}:exe:${os.detected.classifier}\n                    \u003c/protocArtifact\u003e\n                    \u003cpluginId\u003egrpc-java\u003c/pluginId\u003e\n                    \u003cpluginArtifact\u003eio.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}\n                    \u003c/pluginArtifact\u003e\n                    \u003cprotocPlugins\u003e\n                        \u003cprotocPlugin\u003e\n                            \u003cid\u003ereactor-grpc\u003c/id\u003e\n                            \u003cgroupId\u003ecom.salesforce.servicelibs\u003c/groupId\u003e\n                            \u003cartifactId\u003ereactor-grpc\u003c/artifactId\u003e\n                            \u003cversion\u003e${reactive-grpc.version}\u003c/version\u003e\n                            \u003cmainClass\u003ecom.salesforce.reactorgrpc.ReactorGrpcGenerator\u003c/mainClass\u003e\n                        \u003c/protocPlugin\u003e\n                    \u003c/protocPlugins\u003e\n                \u003c/configuration\u003e\n                \u003cexecutions\u003e\n                    \u003cexecution\u003e\n                        \u003cgoals\u003e\n                            \u003cgoal\u003ecompile\u003c/goal\u003e\n                            \u003cgoal\u003ecompile-custom\u003c/goal\u003e\n                        \u003c/goals\u003e\n                    \u003c/execution\u003e\n                \u003c/executions\u003e\n            \u003c/plugin\u003e\n        \u003c/plugins\u003e\n\u003c/build\u003e\n```\n\n* Implement Reactive Service with @ReactiveGrpcService annotation.\n\n```java\n@Service\n@ReactiveGrpcService\npublic class ReactiveGreeterImpl extends ReactorGreeterGrpc.GreeterImplBase {\n    @Override\n    public Mono\u003cHelloReply\u003e sayHello(Mono\u003cHelloRequest\u003e request) {\n        return request.map(helloRequest -\u003e HelloReply.newBuilder().setMessage(\"Hello \" + helloRequest.getName()).build());\n    }\n\n    @Override\n    public Mono\u003cHelloReply\u003e sayHelloAgain(Mono\u003cHelloRequest\u003e request) {\n        return request.map(helloRequest -\u003e HelloReply.newBuilder().setMessage(\"Hello Again \" + helloRequest.getName()).build());\n    }\n}\n```\n\n* Start you Spring application and you will get following output on your console.\n\n```\n09:40:17.366 [INFO ] o.m.s.b.r.g.ReactiveGrpcAutoConfiguration - gRPC server started on: 50051\n09:40:17.379 [INFO ] o.m.s.b.r.g.ReactiveGrpcAutoConfiguration - Reactive gRPC service exposed: org.mvnsearch.spring.boot.reactive.grpc.demo.ReactiveGreeterImpl\n\n```\n\n* Use Evans to test gRPC service\n\n```\n$ evans src/main/proto/greeter.proto\n```\n\n### Reactive gRPC configuration\nYou don't need to setup anything for Reactive gRPC service.\nIf you want to change listen port(default is 50051), please change as following in application.properties:\n\n```properties\ngrpc.reactive.port=50051\n```\n\n### FAQ\n\n#### What's difference with gRPC Spring Boot Starter\n\ngRPC has different starters to integration with Spring Boot, for example:\n\n* https://github.com/yidongnan/grpc-spring-boot-starter\n* https://github.com/LogNet/grpc-spring-boot-starter\n\nThe main difference is code style in these starters. If you like Reactive style, please choose Reactive gRPC.\nIf you think native style fine, please use starters above.\n\n* gRPC native style:\n```\n//server side\npublic void sayHello(HelloRequest req, StreamObserver\u003cHelloReply\u003e responseObserver) {\n  HelloReply reply = HelloReply.newBuilder().setMessage(\"Hello ==\u003e \" + req.getName()).build();\n  responseObserver.onNext(reply);\n  responseObserver.onCompleted();\n}\n//client side\n asyncStub.sayHello(HelloRequest.newBuilder().setName(name).build(), new StreamObserver\u003cHelloReply\u003e() {\n            @Override\n            public void onNext(HelloReply reply) {\n                \n            }\n\n            @Override\n            public void onError(Throwable throwable) {\n\n            }\n\n            @Override\n            public void onCompleted() {\n\n            }\n        });\n```\n\n* gRPC reactive style:\n```\n//server side\npublic Mono\u003cHelloReply\u003e sayHello(Mono\u003cHelloRequest\u003e request) {\n  return request.map(helloRequest -\u003e HelloReply.newBuilder().setMessage(\"Hello \" + helloRequest.getName()).build());\n}\n//client side\n Mono\u003cHelloRequest\u003e request = Mono.just(HelloRequest.newBuilder().setName(\"Jack\").build());\n request.as(greeter::sayHello)\n         .map(HelloReply::getMessage)\n         .subscribe(System.out::println);\n```\n\n#### Convert between DDD model(entity,value object) and Protobuf message\n\nPlease refer MapStruct to map DDD model and Protobuf message, and MapStruct 1.3 with Protobuf builder support.\n\n#### Quick test\n\nPlease execute \"mvn -DskipTests clean package\" and run ReactiveGrpcDemoApplication\n\n### Todo\n\n* Publish artifact to Maven repository\n* Actuator endpoint to output proto sources\n* SSL for gRPC by using certificate in Spring Boot https://github.com/grpc/grpc-java/blob/master/SECURITY.md\n\n```\nserver.ssl.enabled=true\nserver.ssl.key-store=${user.home}/domain_certs/localhost.com/localhost.com.p12\nserver.ssl.key-store-type=PKCS12\nserver.ssl.key-store-password=changeit\n```\n\n### References\n\n* Reactive gRPC: https://github.com/salesforce/reactive-grpc\n* Project Reactor: https://projectreactor.io/\n* Evans: expressive universal gRPC client https://github.com/ktr0731/evans\n* MapStruct: http://mapstruct.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinux-china%2Freactive-grpc-spring-boot-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinux-china%2Freactive-grpc-spring-boot-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinux-china%2Freactive-grpc-spring-boot-starter/lists"}