{"id":23170,"date":"2024-08-02T09:40:46","date_gmt":"2024-08-02T02:40:46","guid":{"rendered":"https:\/\/huongdanjava.com\/?p=23170"},"modified":"2025-07-16T11:02:54","modified_gmt":"2025-07-16T04:02:54","slug":"gioi-thieu-ve-grpc","status":"publish","type":"post","link":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html","title":{"rendered":"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC"},"content":{"rendered":"<p>RPC vi\u1ebft t\u1eaft c\u1ee7a Remote Procedure Call, l\u00e0 m\u1ed9t c\u01a1 ch\u1ebf cho ph\u00e9p c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 call m\u1ed9t function hay m\u1ed9t method c\u1ee7a m\u1ed9t ch\u01b0\u01a1ng tr\u00ecnh tr\u00ean m\u00e1y n\u00e0y t\u1eeb m\u1ed9t m\u00e1y kh\u00e1c. N\u00f3 c\u0169ng gi\u1ed1ng nh\u01b0 RMI, Remote Method Invocation, trong Java v\u1eady \u0111\u00f3 c\u00e1c b\u1ea1n! <a href=\"https:\/\/grpc.io\/\" target=\"_blank\" rel=\"noopener\">gRPC<\/a> l\u00e0 m\u1ed9t implementation, m\u1ed9t framework open source, high performance c\u1ee7a Google d\u00e0nh cho RPC. Trong b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh s\u1ebd gi\u1edbi thi\u1ec7u v\u1edbi c\u00e1c b\u1ea1n m\u1ed9t s\u1ed1 ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u1ec1 gRPC v\u00e0 hi\u1ec7n th\u1ef1c m\u1ed9t v\u00ed d\u1ee5 \u0111\u1ec3 xem c\u00e1ch ho\u1ea1t \u0111\u1ed9ng c\u1ee7a gRPC l\u00e0 nh\u01b0 th\u1ebf n\u00e0o c\u00e1c b\u1ea1n nh\u00e9!<\/p>\n<p>\u0110i\u1ec1u \u0111\u1ea7u ti\u00ean m\u00ecnh c\u1ea7n n\u00f3i v\u1edbi c\u00e1c b\u1ea1n l\u00e0 gRPC h\u1ed7 tr\u1ee3 cho nhi\u1ec1u ng\u00f4n ng\u1eef kh\u00e1c nhau. Cho Java, ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng gRPC Java \u1edf \u0111\u00e2y <a href=\"https:\/\/grpc.io\/docs\/languages\/java\/\" target=\"_blank\" rel=\"noopener\">https:\/\/grpc.io\/docs\/languages\/java\/<\/a><\/p>\n<p>V\u1edbi gRPC, message \u0111\u01b0\u1ee3c g\u1eedi \u0111i s\u1ebd d\u01b0\u1edbi d\u1ea1ng binary s\u1eed d\u1ee5ng <a href=\"https:\/\/protobuf.dev\/\" target=\"_blank\" rel=\"noopener\">protocol buffer<\/a> (protobuf). N\u00f3i n\u00f4m na th\u00ec protocol buffer l\u00e0 m\u1ed9t protocol kh\u00f4ng ph\u1ee5 thu\u1ed9c v\u00e0o ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh hay n\u1ec1n t\u1ea3ng, \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 tu\u1ea7n t\u1ef1 ho\u00e1 c\u00e1c d\u1eef li\u1ec7u c\u00f3 c\u1ea5u tr\u00fac. Nh\u1edd \u0111\u00f3 m\u00e0 c\u00e1c ng\u00f4n ng\u1eef kh\u00e1c nhau c\u00f3 th\u1ec3 serialize ho\u1eb7c deserialize c\u00e1c message c\u1ee7a gRPC m\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng.<\/p>\n<p>V\u00e0 gRPC s\u1eed d\u1ee5ng HTTP\/2 \u0111\u1ec3 thi\u1ebft l\u1eadp communication gi\u1eefa c\u00e1c b\u00ean v\u1edbi nhau \u0111\u00f3 c\u00e1c b\u1ea1n!<\/p>\n<p>B\u00e2y gi\u1edd, m\u00ecnh s\u1ebd th\u1eed l\u00e0m m\u1ed9t v\u00ed d\u1ee5 t\u1ea1o m\u1edbi m\u1ed9t gRPC server v\u1edbi Java v\u00e0 s\u1eed d\u1ee5ng Postman \u0111\u1ec3 call m\u1ed9t method b\u00ean trong gRPC server n\u00e0y xem sao c\u00e1c b\u1ea1n nh\u00e9!<\/p>\n<p>M\u00ecnh s\u1ebd t\u1ea1o m\u1edbi m\u1ed9t Maven project \u0111\u1ec3 l\u00e0m v\u00ed d\u1ee5:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-23180 aligncenter\" src=\"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/gioi-thieu-ve-grpc-1.png\" alt=\"\" width=\"700\" height=\"712\" \/><\/p>\n<p>C\u00e1c b\u1ea1n h\u00e3y khai b\u00e1o c\u00e1c gRPC dependencies nh\u01b0 sau:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;dependencyManagement&gt;\r\n  &lt;dependencies&gt;\r\n    &lt;dependency&gt;\r\n      &lt;groupId&gt;io.grpc&lt;\/groupId&gt;\r\n      &lt;artifactId&gt;grpc-bom&lt;\/artifactId&gt;\r\n      &lt;version&gt;${grpc.version}&lt;\/version&gt;\r\n      &lt;type&gt;pom&lt;\/type&gt;\r\n      &lt;scope&gt;import&lt;\/scope&gt;\r\n    &lt;\/dependency&gt;\r\n  &lt;\/dependencies&gt;\r\n&lt;\/dependencyManagement&gt;\r\n\r\n&lt;dependencies&gt;\r\n  &lt;dependency&gt;\r\n    &lt;groupId&gt;io.grpc&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;grpc-netty&lt;\/artifactId&gt;\r\n  &lt;\/dependency&gt;\r\n  &lt;dependency&gt;\r\n    &lt;groupId&gt;io.grpc&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;grpc-stub&lt;\/artifactId&gt;\r\n  &lt;\/dependency&gt;\r\n  &lt;dependency&gt;\r\n    &lt;groupId&gt;io.grpc&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;grpc-protobuf&lt;\/artifactId&gt;\r\n  &lt;\/dependency&gt;\r\n&lt;\/dependencies&gt;<\/pre>\n<p>v\u1edbi &#8220;grpc.version&#8221; c\u00f3 gi\u00e1 tr\u1ecb nh\u01b0 sau:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;properties&gt;\r\n  ...\r\n  \r\n  &lt;grpc.version&gt;1.73.0&lt;\/grpc.version&gt;\r\n&lt;\/properties&gt;<\/pre>\n<p><strong>Ch\u00fang ta s\u1ebd b\u1eaft \u0111\u1ea7u x\u00e2y d\u1ef1ng gRPC server b\u1eb1ng c\u00e1ch \u0111\u1ecbnh ngh\u0129a c\u00e1c service m\u00e0 gRPC server cung c\u1ea5p s\u1eed d\u1ee5ng m\u1ed9t t\u1eadp tin .proto.<\/strong><\/p>\n<h3>\u0110\u1ecbnh ngh\u0129a service contract<\/h3>\n<p>N\u1ed9i dung c\u1ee7a t\u1eadp tin .proto n\u00e0y s\u1ebd \u0111\u1ecbnh ngh\u0129a protocol, service contract theo \u0111\u1ecbnh d\u1ea1ng c\u1ee7a <a href=\"https:\/\/protobuf.dev\/\" target=\"_blank\" rel=\"noopener\">Google Protocol Buffer<\/a> c\u00e1c b\u1ea1n nh\u00e9!<\/p>\n<p>M\u00ecnh s\u1ebd t\u1ea1o m\u1edbi t\u1eadp tin helloworld.proto trong th\u01b0 m\u1ee5c \/src\/main\/proto:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-23192 size-full aligncenter\" src=\"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/09\/gioi-thieu-ve-grpc-2.png\" alt=\"\" width=\"700\" height=\"774\" \/><\/p>\n<p>\u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a m\u1ed9t service \u0111\u01a1n gi\u1ea3n tr\u1ea3 v\u1ec1 d\u00f2ng ch\u1eef &#8220;Hello &lt;name&gt; from Huong Dan Java&#8221; khi \u0111\u01b0\u1ee3c g\u1ecdi t\u1edbi.<\/p>\n<p>N\u1ed9i dung c\u1ee7a t\u1eadp tin .proto n\u00e0y nh\u01b0 sau:<\/p>\n<pre class=\"lang:java decode:true\">syntax = \"proto3\";\r\n\r\noption java_multiple_files = true;\r\n\r\npackage com.huongdanjava.grpc;\r\n\r\nmessage HelloRequest {\r\n  string name = 1;\r\n}\r\n\r\nmessage HelloResponse {\r\n  string message = 1;\r\n}\r\n\r\nservice HelloService {\r\n  rpc hello(HelloRequest) returns (HelloResponse);\r\n}<\/pre>\n<p>Protocol Buffer hi\u1ec7n t\u1ea1i c\u00f3 2 version: 2 v\u00e0 3. M\u00ecnh s\u1ebd s\u1eed d\u1ee5ng version 3 nh\u01b0 c\u00e1c b\u1ea1n th\u1ea5y trong d\u00f2ng syntax = &#8220;proto3&#8221; \u1edf tr\u00ean.<\/p>\n<p>Sau khi \u0111\u1ecbnh ngh\u0129a service contract s\u1eed d\u1ee5ng t\u1eadp tin .proto, ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng c\u00f4ng c\u1ee5 <a href=\"https:\/\/grpc.io\/docs\/protoc-installation\/\" target=\"_blank\" rel=\"noopener\">Protocol Buffer Compiler<\/a> c\u1ee7a gRPC \u0111\u1ec3 generate source code. M\u1eb7c \u0111\u1ecbnh th\u00ec c\u00f4ng c\u1ee5 n\u00e0y s\u1ebd generate c\u00e1c Java code v\u00e0o trong 1 t\u1eadp tin .java. Ch\u00fang ta s\u1eed d\u1ee5ng <strong>option java_multiple_files = true<\/strong> \u0111\u1ec3 thay \u0111\u1ed5i c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh n\u00e0y. Khi \u0111\u00f3, Protocol Buffer Compiler s\u1ebd generate th\u00e0nh c\u00e1c t\u1eadp tin .java ri\u00eang bi\u1ec7t \u0111\u00f3 c\u00e1c b\u1ea1n!<\/p>\n<p>Ch\u00fang ta \u0111\u1ecbnh ngh\u0129a package s\u1eed d\u1ee5ng t\u1eeb kh\u00f3a package nh\u01b0 trong Java c\u00e1c b\u1ea1n nh\u00e9!<\/p>\n<p>\u0110\u1ec3 \u0111\u1ecbnh ngh\u0129a c\u00e1c message s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 trao \u0111\u1ed5i gi\u1eefa c\u00e1c h\u1ec7 th\u1ed1ng v\u1edbi gRPC, ch\u00fang ta s\u1eed d\u1ee5ng t\u1eeb kh\u00f3a message c\u00f9ng v\u1edbi \u0111\u1ecbnh ngh\u0129a n\u1ed9i dung c\u1ee7a message \u0111\u00f3. Nh\u01b0 v\u00ed d\u1ee5 tr\u00ean, m\u00ecnh \u0111ang \u0111\u1ecbnh ngh\u0129a 2 message kh\u00e1c nhau l\u00e0 HelloRequest v\u00e0 Hello Response. M\u1ed7i message s\u1ebd ch\u1ee9a c\u00e1c attribute c\u00f9ng v\u1edbi ki\u1ec3u d\u1eef li\u1ec7u v\u00e0 th\u1ee9 t\u1ef1 c\u1ee7a c\u00e1c attribute n\u00e0y trong message.<\/p>\n<p>T\u1eeb kh\u00f3a service \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a c\u00e1c service m\u00e0 gRPC s\u1ebd expose ra b\u00ean ngo\u00e0i. M\u1ed7i service s\u1ebd ch\u1ee9a nhi\u1ec1u operation v\u00e0 ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng t\u1eeb kh\u00f3a rpc \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a cho c\u00e1c operation n\u00e0y. Nh\u01b0 c\u00e1c b\u1ea1n th\u1ea5y, ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng c\u00e1c message \u0111\u1ec3 l\u00e0m input v\u00e0 output cho c\u00e1c operation.<\/p>\n<p>Nh\u01b0 v\u1eady l\u00e0 ch\u00fang ta \u0111\u00e3 c\u00f3 m\u1ed9t gRPC service contract \u0111\u01a1n gi\u1ea3n. <strong>Gi\u1edd l\u00e0 l\u00fac ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng Protocol Buffer Compiler \u0111\u1ec3 generate c\u00e1c Java code \u0111\u1ec3 implement service n\u00e0y.\u00a0<\/strong><\/p>\n<p>C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 tham kh\u1ea3o <a href=\"https:\/\/huongdanjava.com\/vi\/generate-java-code-cho-service-contract-trong-grpc-su-dung-protocol-buffers-maven-plugin.html\" target=\"_blank\" rel=\"noopener\">b\u00e0i vi\u1ebft n\u00e0y<\/a>\u00a0\u0111\u1ec3 generate Java code c\u00e1c b\u1ea1n nh\u00e9!<\/p>\n<p>Sau khi \u0111\u00e3 generate Java code, ch\u00fang ta c\u1ea7n implement ph\u01b0\u01a1ng th\u1ee9c hello() c\u1ee7a class HelloServiceImplBase trong t\u1eadp tin HelloServiceGrpc \u0111\u1ec3 ho\u00e0n thi\u1ec7n gRPC service c\u1ee7a ch\u00fang ta.<\/p>\n<h3>Hi\u1ec7n th\u1ef1c gRPC service<\/h3>\n<p>C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1edbi m\u1ed9t class extends class HelloServiceImplBase v\u00e0 hi\u1ec7n th\u1ef1c ph\u01b0\u01a1ng th\u1ee9c hello() nh\u01b0 sau:<\/p>\n<pre class=\"lang:java decode:true \">package com.huongdanjava.grpc;\r\n\r\nimport io.grpc.stub.StreamObserver;\r\n\r\npublic class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase {\r\n\r\n  @Override\r\n  public void hello(HelloRequest request, StreamObserver&lt;HelloResponse&gt; responseObserver) {\r\n    String greeting = \"Hello \" + request.getName() + \" from Huong Dan Java\";\r\n\r\n    HelloResponse response = HelloResponse.newBuilder()\r\n        .setMessage(greeting)\r\n        .build();\r\n\r\n    responseObserver.onNext(response);\r\n    responseObserver.onCompleted();\r\n  }\r\n}\r\n<\/pre>\n<p>Ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng \u0111\u1ed1i t\u01b0\u1ee3ng c\u1ee7a class StreamObserver \u0111\u1ec3 tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3 cho client m\u1ed7i khi c\u00f3 request t\u1edbi, sau khi build \u0111\u1ed1i t\u01b0\u1ee3ng HelloResponse c\u00e1c b\u1ea1n nh\u00e9!<\/p>\n<p>B\u00e2y gi\u1edd, ch\u00fang ta s\u1ebd th\u00eam code \u0111\u1ec3 hi\u1ec7n th\u1ef1c gRPC server trong ph\u01b0\u01a1ng th\u1ee9c main() c\u1ee7a \u1ee9ng d\u1ee5ng nh\u01b0 sau:<\/p>\n<pre class=\"lang:java decode:true \">package com.huongdanjava.grpc;\r\n\r\nimport io.grpc.Server;\r\nimport io.grpc.ServerBuilder;\r\nimport java.io.IOException;\r\n\r\npublic class Main {\r\n\r\n  public static void main(String[] args) throws IOException, InterruptedException {\r\n    Server server = ServerBuilder\r\n        .forPort(8080)\r\n        .addService(new HelloServiceImpl()).build();\r\n\r\n    server.start();\r\n    server.awaitTermination();\r\n  }\r\n}<\/pre>\n<p>Ch\u00fang ta s\u1ebd ch\u1ea1y gRPC server s\u1eed d\u1ee5ng port 8080 v\u1edbi service tr\u1ecf t\u1edbi service m\u00e0 ch\u00fang ta \u0111\u00e3 implement \u1edf tr\u00ean. Nh\u01b0 c\u00e1c b\u1ea1n th\u1ea5y, m\u00ecnh \u0111\u00e3 s\u1eed d\u1ee5ng class Server c\u1ee7a gRPC Java \u0111\u1ec3 l\u00e0m vi\u1ec7c n\u00e0y.<\/p>\n<p>Ch\u00fang ta c\u1ea7n call ph\u01b0\u01a1ng th\u1ee9c awaitTermination() \u0111\u1ec3 gi\u1eef cho gRPC server ch\u1ea1y cho \u0111\u1ebfn khi ch\u00fang ta terminate \u1ee9ng d\u1ee5ng c\u00e1c b\u1ea1n nh\u00e9!<\/p>\n<p>B\u00e2y gi\u1edd, n\u1ebfu c\u00e1c b\u1ea1n ch\u1ea1y \u1ee9ng d\u1ee5ng r\u1ed3i s\u1eed d\u1ee5ng Postman \u0111\u1ec3 g\u1ecdi t\u1edbi operation hello c\u1ee7a gRPC server v\u1edbi message:<\/p>\n<pre class=\"lang:java decode:true \">{\r\n    \"name\": \"Khanh\"\r\n}<\/pre>\n<p>c\u00e1c b\u1ea1n s\u1ebd th\u1ea5y k\u1ebft qu\u1ea3 nh\u01b0 sau:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-23195 aligncenter\" src=\"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/gioi-thieu-ve-grpc-6.png\" alt=\"\" width=\"700\" height=\"383\" \/><\/p>\n<p>Nh\u01b0 v\u1eady l\u00e0 ch\u00fang ta \u0111\u00e3 hi\u1ec7n th\u1ef1c \u0111\u01b0\u1ee3c m\u1ed9t gRPC server c\u01a1 b\u1ea3n r\u1ed3i \u0111\u00f3 c\u00e1c b\u1ea1n!<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-right kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;right&quot;,&quot;id&quot;:&quot;23170&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;4&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5 - (0 votes)&quot;,&quot;size&quot;:&quot;24&quot;,&quot;title&quot;:&quot;Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} - ({count} {votes})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 4px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 19.2px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>RPC vi\u1ebft t\u1eaft c\u1ee7a Remote Procedure Call, l\u00e0 m\u1ed9t c\u01a1 ch\u1ebf cho ph\u00e9p c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 call m\u1ed9t function hay m\u1ed9t method c\u1ee7a m\u1ed9t ch\u01b0\u01a1ng tr\u00ecnh tr\u00ean m\u00e1y n\u00e0y t\u1eeb m\u1ed9t m\u00e1y kh\u00e1c. N\u00f3 c\u0169ng gi\u1ed1ng nh\u01b0 RMI, Remote Method Invocation, trong Java v\u1eady&hellip; <a href=\"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":23196,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2404],"tags":[],"class_list":["post-23170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-grpc","clearfix"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC - Huong Dan Java<\/title>\n<meta name=\"description\" content=\"Trong b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh gi\u1edbi thi\u1ec7u v\u1edbi c\u00e1c b\u1ea1n v\u1ec1 gRPC, nh\u1eefng ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u00e0 m\u1ed9t v\u00ed d\u1ee5 v\u1ec1 c\u00e1ch hi\u1ec7n th\u1ef1c gRPC server.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC - Huong Dan Java\" \/>\n<meta property=\"og:description\" content=\"Trong b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh gi\u1edbi thi\u1ec7u v\u1edbi c\u00e1c b\u1ea1n v\u1ec1 gRPC, nh\u1eefng ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u00e0 m\u1ed9t v\u00ed d\u1ee5 v\u1ec1 c\u00e1ch hi\u1ec7n th\u1ef1c gRPC server.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html\" \/>\n<meta property=\"og:site_name\" content=\"Huong Dan Java\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/nhkhanh2406\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/nhkhanh2406\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-02T02:40:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-16T04:02:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/grpc.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"880\" \/>\n\t<meta property=\"og:image:height\" content=\"704\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Khanh Nguyen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/KhanhNguyenJ\" \/>\n<meta name=\"twitter:site\" content=\"@KhanhNguyenJ\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Khanh Nguyen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html\"},\"author\":{\"name\":\"Khanh Nguyen\",\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/#\\\/schema\\\/person\\\/dc859d7f8cbea3b593e6738de9cbb82d\"},\"headline\":\"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC\",\"datePublished\":\"2024-08-02T02:40:46+00:00\",\"dateModified\":\"2025-07-16T04:02:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html\"},\"wordCount\":1226,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/#\\\/schema\\\/person\\\/dc859d7f8cbea3b593e6738de9cbb82d\"},\"image\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/grpc.jpg\",\"articleSection\":[\"gRPC\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html\",\"url\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html\",\"name\":\"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC - Huong Dan Java\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/grpc.jpg\",\"datePublished\":\"2024-08-02T02:40:46+00:00\",\"dateModified\":\"2025-07-16T04:02:54+00:00\",\"description\":\"Trong b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh gi\u1edbi thi\u1ec7u v\u1edbi c\u00e1c b\u1ea1n v\u1ec1 gRPC, nh\u1eefng ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u00e0 m\u1ed9t v\u00ed d\u1ee5 v\u1ec1 c\u00e1ch hi\u1ec7n th\u1ef1c gRPC server.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#primaryimage\",\"url\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/grpc.jpg\",\"contentUrl\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/grpc.jpg\",\"width\":880,\"height\":704},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/vi\\\/gioi-thieu-ve-grpc.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/huongdanjava.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/#website\",\"url\":\"https:\\\/\\\/huongdanjava.com\\\/\",\"name\":\"Huong Dan Java\",\"description\":\"Java development tutorials\",\"publisher\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/#\\\/schema\\\/person\\\/dc859d7f8cbea3b593e6738de9cbb82d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/huongdanjava.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/#\\\/schema\\\/person\\\/dc859d7f8cbea3b593e6738de9cbb82d\",\"name\":\"Khanh Nguyen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg\",\"url\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg\",\"contentUrl\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg\",\"width\":1267,\"height\":1517,\"caption\":\"Khanh Nguyen\"},\"logo\":{\"@id\":\"https:\\\/\\\/huongdanjava.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg\"},\"description\":\"I love Java and everything related to Java.\",\"sameAs\":[\"https:\\\/\\\/huongdanjava.com\",\"https:\\\/\\\/www.facebook.com\\\/nhkhanh2406\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/KhanhNguyenJ\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC - Huong Dan Java","description":"Trong b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh gi\u1edbi thi\u1ec7u v\u1edbi c\u00e1c b\u1ea1n v\u1ec1 gRPC, nh\u1eefng ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u00e0 m\u1ed9t v\u00ed d\u1ee5 v\u1ec1 c\u00e1ch hi\u1ec7n th\u1ef1c gRPC server.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html","og_locale":"en_US","og_type":"article","og_title":"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC - Huong Dan Java","og_description":"Trong b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh gi\u1edbi thi\u1ec7u v\u1edbi c\u00e1c b\u1ea1n v\u1ec1 gRPC, nh\u1eefng ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u00e0 m\u1ed9t v\u00ed d\u1ee5 v\u1ec1 c\u00e1ch hi\u1ec7n th\u1ef1c gRPC server.","og_url":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html","og_site_name":"Huong Dan Java","article_publisher":"https:\/\/www.facebook.com\/nhkhanh2406","article_author":"https:\/\/www.facebook.com\/nhkhanh2406","article_published_time":"2024-08-02T02:40:46+00:00","article_modified_time":"2025-07-16T04:02:54+00:00","og_image":[{"width":880,"height":704,"url":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/grpc.jpg","type":"image\/jpeg"}],"author":"Khanh Nguyen","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/KhanhNguyenJ","twitter_site":"@KhanhNguyenJ","twitter_misc":{"Written by":"Khanh Nguyen","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#article","isPartOf":{"@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html"},"author":{"name":"Khanh Nguyen","@id":"https:\/\/huongdanjava.com\/#\/schema\/person\/dc859d7f8cbea3b593e6738de9cbb82d"},"headline":"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC","datePublished":"2024-08-02T02:40:46+00:00","dateModified":"2025-07-16T04:02:54+00:00","mainEntityOfPage":{"@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html"},"wordCount":1226,"commentCount":0,"publisher":{"@id":"https:\/\/huongdanjava.com\/#\/schema\/person\/dc859d7f8cbea3b593e6738de9cbb82d"},"image":{"@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#primaryimage"},"thumbnailUrl":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/grpc.jpg","articleSection":["gRPC"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html","url":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html","name":"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC - Huong Dan Java","isPartOf":{"@id":"https:\/\/huongdanjava.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#primaryimage"},"image":{"@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#primaryimage"},"thumbnailUrl":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/grpc.jpg","datePublished":"2024-08-02T02:40:46+00:00","dateModified":"2025-07-16T04:02:54+00:00","description":"Trong b\u00e0i vi\u1ebft n\u00e0y, m\u00ecnh gi\u1edbi thi\u1ec7u v\u1edbi c\u00e1c b\u1ea1n v\u1ec1 gRPC, nh\u1eefng ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u00e0 m\u1ed9t v\u00ed d\u1ee5 v\u1ec1 c\u00e1ch hi\u1ec7n th\u1ef1c gRPC server.","breadcrumb":{"@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#primaryimage","url":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/grpc.jpg","contentUrl":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2024\/08\/grpc.jpg","width":880,"height":704},{"@type":"BreadcrumbList","@id":"https:\/\/huongdanjava.com\/vi\/gioi-thieu-ve-grpc.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/huongdanjava.com\/"},{"@type":"ListItem","position":2,"name":"Gi\u1edbi thi\u1ec7u v\u1ec1 gRPC"}]},{"@type":"WebSite","@id":"https:\/\/huongdanjava.com\/#website","url":"https:\/\/huongdanjava.com\/","name":"Huong Dan Java","description":"Java development tutorials","publisher":{"@id":"https:\/\/huongdanjava.com\/#\/schema\/person\/dc859d7f8cbea3b593e6738de9cbb82d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/huongdanjava.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/huongdanjava.com\/#\/schema\/person\/dc859d7f8cbea3b593e6738de9cbb82d","name":"Khanh Nguyen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2021\/07\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg","url":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2021\/07\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg","contentUrl":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2021\/07\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg","width":1267,"height":1517,"caption":"Khanh Nguyen"},"logo":{"@id":"https:\/\/huongdanjava.com\/wp-content\/uploads\/2021\/07\/CC6FAC58-D227-4DD8-93D1-6D6A795577E3_1_201_a.jpeg"},"description":"I love Java and everything related to Java.","sameAs":["https:\/\/huongdanjava.com","https:\/\/www.facebook.com\/nhkhanh2406","https:\/\/x.com\/https:\/\/twitter.com\/KhanhNguyenJ"]}]}},"_links":{"self":[{"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/posts\/23170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/comments?post=23170"}],"version-history":[{"count":23,"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/posts\/23170\/revisions"}],"predecessor-version":[{"id":24322,"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/posts\/23170\/revisions\/24322"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/media\/23196"}],"wp:attachment":[{"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/media?parent=23170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/categories?post=23170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/huongdanjava.com\/wp-json\/wp\/v2\/tags?post=23170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}