import{_ as c,r as p,o as i,c as l,a as n,b as s,w as t,e as r,d as e}from"./app-DGEoe1Q7.js";const u={},d=n("h1",{id:"grpc",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#grpc"},[n("span",null,"Grpc")])],-1),k={class:"table-of-contents"},v=r(`<h2 id="introduction" tabindex="-1"><a class="header-anchor" href="#introduction"><span>Introduction</span></a></h2><p>Grpc module can be operated by <code>facades.Grpc()</code>.</p><h2 id="controllers" tabindex="-1"><a class="header-anchor" href="#controllers"><span>Controllers</span></a></h2><p>Controllers can be defined in the <code>/app/grpc/controllers</code> directory.</p><div class="language-go line-numbers-mode" data-ext="go" data-title="go"><pre class="language-go"><code><span class="token comment">// app/grpc/controllers</span>
<span class="token keyword">package</span> controllers

<span class="token keyword">import</span> <span class="token punctuation">(</span>
  <span class="token string">&quot;context&quot;</span>
  <span class="token string">&quot;net/http&quot;</span>

  <span class="token string">&quot;github.com/goravel/grpc/protos&quot;</span>
<span class="token punctuation">)</span>

<span class="token keyword">type</span> UserController <span class="token keyword">struct</span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span>

<span class="token keyword">func</span> <span class="token function">NewUserController</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>UserController <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token operator">&amp;</span>UserController<span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">func</span> <span class="token punctuation">(</span>r <span class="token operator">*</span>UserController<span class="token punctuation">)</span> <span class="token function">Show</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> req <span class="token operator">*</span>protos<span class="token punctuation">.</span>UserRequest<span class="token punctuation">)</span> <span class="token punctuation">(</span>protoBook <span class="token operator">*</span>protos<span class="token punctuation">.</span>UserResponse<span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token operator">&amp;</span>protos<span class="token punctuation">.</span>UserResponse<span class="token punctuation">{</span>
    Code<span class="token punctuation">:</span> http<span class="token punctuation">.</span>StatusOK<span class="token punctuation">,</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="define-routing" tabindex="-1"><a class="header-anchor" href="#define-routing"><span>Define routing</span></a></h2><p>All routing files can be defined in the <code>/routes</code> directory, such as <code>/routes/grpc.go</code>. Then bind routes in the <code>app/providers/grpc_service_provider.go</code> file.</p><div class="language-go line-numbers-mode" data-ext="go" data-title="go"><pre class="language-go"><code><span class="token comment">// routes/grpc.go</span>
<span class="token keyword">package</span> routes

<span class="token keyword">import</span> <span class="token punctuation">(</span>
  <span class="token string">&quot;github.com/goravel/grpc/protos&quot;</span>
  <span class="token string">&quot;github.com/goravel/framework/facades&quot;</span>

  <span class="token string">&quot;goravel/app/grpc/controllers&quot;</span>
<span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token function">Grpc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  protos<span class="token punctuation">.</span><span class="token function">RegisterUserServer</span><span class="token punctuation">(</span>facades<span class="token punctuation">.</span><span class="token function">Grpc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Server</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> controllers<span class="token punctuation">.</span><span class="token function">NewUserController</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="register-routing" tabindex="-1"><a class="header-anchor" href="#register-routing"><span>Register routing</span></a></h3><p>Register routing in the <code>app/providers/grpc_service_provider.go</code> file after routing was defined.</p><div class="language-go line-numbers-mode" data-ext="go" data-title="go"><pre class="language-go"><code><span class="token comment">// app/providers/grpc_service_provider.go</span>
<span class="token keyword">package</span> providers

<span class="token keyword">import</span> <span class="token punctuation">(</span>
  <span class="token string">&quot;goravel/routes&quot;</span>
<span class="token punctuation">)</span>

<span class="token keyword">type</span> GrpcServiceProvider <span class="token keyword">struct</span> <span class="token punctuation">{</span>
<span class="token punctuation">}</span>

<span class="token keyword">func</span> <span class="token punctuation">(</span>router <span class="token operator">*</span>GrpcServiceProvider<span class="token punctuation">)</span> <span class="token function">Register</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>

<span class="token punctuation">}</span>

<span class="token keyword">func</span> <span class="token punctuation">(</span>router <span class="token operator">*</span>GrpcServiceProvider<span class="token punctuation">)</span> <span class="token function">Boot</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  routes<span class="token punctuation">.</span><span class="token function">Grpc</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="start-grpc-server" tabindex="-1"><a class="header-anchor" href="#start-grpc-server"><span>Start Grpc Server</span></a></h2><p>Start Grpc in the <code>main.go</code> file.</p><div class="language-go line-numbers-mode" data-ext="go" data-title="go"><pre class="language-go"><code><span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> err <span class="token operator">:=</span> facades<span class="token punctuation">.</span><span class="token function">Grpc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span>facades<span class="token punctuation">.</span><span class="token function">Config</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">GetString</span><span class="token punctuation">(</span><span class="token string">&quot;grpc.host&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
    facades<span class="token punctuation">.</span><span class="token function">Log</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Errorf</span><span class="token punctuation">(</span><span class="token string">&quot;Grpc run error: %v&quot;</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="interceptor" tabindex="-1"><a class="header-anchor" href="#interceptor"><span>Interceptor</span></a></h2><p>The interceptor can be defined in the <code>app/grpc/inteceptors</code> folder, and then registered to <code>app/grpc/kernel.go</code>.</p><p><strong>Server Interceptor</strong></p><p>You can set the server interceptors in the <code>app/grpc/kernel.go:UnaryServerInterceptors</code> method. For example:</p><div class="language-go line-numbers-mode" data-ext="go" data-title="go"><pre class="language-go"><code><span class="token comment">// app/grpc/kernel.go</span>
<span class="token keyword">import</span> <span class="token punctuation">(</span>
  <span class="token string">&quot;goravel/app/grpc/interceptors&quot;</span>

  <span class="token string">&quot;google.golang.org/grpc&quot;</span>
<span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token punctuation">(</span>kernel <span class="token operator">*</span>Kernel<span class="token punctuation">)</span> <span class="token function">UnaryServerInterceptors</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>grpc<span class="token punctuation">.</span>UnaryServerInterceptor <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>grpc<span class="token punctuation">.</span>UnaryServerInterceptor<span class="token punctuation">{</span>
    interceptors<span class="token punctuation">.</span>Server<span class="token punctuation">,</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>Client Interceptor</strong></p><p>You can set the client interceptor in the <code>app/grpc/kernel.go:UnaryClientInterceptorGroups</code> method, the method can group interceptors. For example, <code>interceptors.Client</code> is included under the <code>trace</code> group.</p><div class="language-go line-numbers-mode" data-ext="go" data-title="go"><pre class="language-go"><code><span class="token comment">// app/grpc/kernel.go</span>
<span class="token keyword">import</span> <span class="token punctuation">(</span>
  <span class="token string">&quot;goravel/app/grpc/interceptors&quot;</span>

  <span class="token string">&quot;google.golang.org/grpc&quot;</span>
<span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token punctuation">(</span>kernel <span class="token operator">*</span>Kernel<span class="token punctuation">)</span> <span class="token function">UnaryClientInterceptorGroups</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span>grpc<span class="token punctuation">.</span>UnaryClientInterceptor <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span>grpc<span class="token punctuation">.</span>UnaryClientInterceptor<span class="token punctuation">{</span>
    <span class="token string">&quot;trace&quot;</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
      interceptors<span class="token punctuation">.</span>Client<span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>the <code>trace</code> group can be applied to the configuration item <code>grpc.clients.interceptors</code>, in this way, the Client will be applied to all interceptors under the group. For example:</p><div class="language-go line-numbers-mode" data-ext="go" data-title="go"><pre class="language-go"><code><span class="token keyword">package</span> config

<span class="token keyword">import</span> <span class="token punctuation">(</span>
  <span class="token string">&quot;github.com/goravel/framework/facades&quot;</span>
<span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  config <span class="token operator">:=</span> facades<span class="token punctuation">.</span>Config
  config<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span><span class="token string">&quot;grpc&quot;</span><span class="token punctuation">,</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">{</span>
    <span class="token comment">// Grpc Configuration</span>
    <span class="token comment">//</span>
    <span class="token comment">// Configure your server host</span>
    <span class="token string">&quot;host&quot;</span><span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token function">Env</span><span class="token punctuation">(</span><span class="token string">&quot;GRPC_HOST&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>

    <span class="token comment">// Configure your client host and interceptors.</span>
    <span class="token comment">// Interceptors can be the group name of UnaryClientInterceptorGroups in app/grpc/kernel.go.</span>
    <span class="token string">&quot;clients&quot;</span><span class="token punctuation">:</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span>any<span class="token punctuation">{</span>
      <span class="token string">&quot;user&quot;</span><span class="token punctuation">:</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span>any<span class="token punctuation">{</span>
        <span class="token string">&quot;host&quot;</span><span class="token punctuation">:</span>         config<span class="token punctuation">.</span><span class="token function">Env</span><span class="token punctuation">(</span><span class="token string">&quot;GRPC_USER_HOST&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        <span class="token string">&quot;port&quot;</span><span class="token punctuation">:</span>         config<span class="token punctuation">.</span><span class="token function">Env</span><span class="token punctuation">(</span><span class="token string">&quot;GRPC_USER_PORT&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        <span class="token string">&quot;interceptors&quot;</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span><span class="token string">&quot;trace&quot;</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,24);function g(m,b){const a=p("router-link"),o=p("CommentService");return i(),l("div",null,[d,n("nav",k,[n("ul",null,[n("li",null,[s(a,{to:"#introduction"},{default:t(()=>[e("Introduction")]),_:1})]),n("li",null,[s(a,{to:"#controllers"},{default:t(()=>[e("Controllers")]),_:1})]),n("li",null,[s(a,{to:"#define-routing"},{default:t(()=>[e("Define routing")]),_:1}),n("ul",null,[n("li",null,[s(a,{to:"#register-routing"},{default:t(()=>[e("Register routing")]),_:1})])])]),n("li",null,[s(a,{to:"#start-grpc-server"},{default:t(()=>[e("Start Grpc Server")]),_:1})]),n("li",null,[s(a,{to:"#interceptor"},{default:t(()=>[e("Interceptor")]),_:1})])])]),v,s(o)])}const f=c(u,[["render",g],["__file","grpc.html.vue"]]),y=JSON.parse('{"path":"/the-basics/grpc.html","title":"Grpc","lang":"en-US","frontmatter":{"description":"Grpc Introduction Grpc module can be operated by facades.Grpc(). Controllers Controllers can be defined in the /app/grpc/controllers directory. Define routing All routing files ...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://goravel.dev/zh/the-basics/grpc.html"}],["meta",{"property":"og:url","content":"https://goravel.dev/the-basics/grpc.html"}],["meta",{"property":"og:site_name","content":"Goravel"}],["meta",{"property":"og:title","content":"/the-basics/grpc.html"}],["meta",{"property":"og:description","content":"Grpc Introduction Grpc module can be operated by facades.Grpc(). Controllers Controllers can be defined in the /app/grpc/controllers directory. Define routing All routing files ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Grpc\\",\\"image\\":[\\"\\"],\\"dateModified\\":null,\\"author\\":[]}"]]},"headers":[{"level":2,"title":"Introduction","slug":"introduction","link":"#introduction","children":[]},{"level":2,"title":"Controllers","slug":"controllers","link":"#controllers","children":[]},{"level":2,"title":"Define routing","slug":"define-routing","link":"#define-routing","children":[{"level":3,"title":"Register routing","slug":"register-routing","link":"#register-routing","children":[]}]},{"level":2,"title":"Start Grpc Server","slug":"start-grpc-server","link":"#start-grpc-server","children":[]},{"level":2,"title":"Interceptor","slug":"interceptor","link":"#interceptor","children":[]}],"git":{},"filePathRelative":"the-basics/grpc.md","autoDesc":true}');export{f as comp,y as data};
