Golang gRPC服务端与Angular gRPC客户端实现

Golang gRPC服务端与Angular gRPC客户端实现 大家好,

请问有没有人拥有 Go 语言 gRPC 和 Angular gRPC 的演示应用程序。

此致, Prakash

3 回复

你在网上搜索过这个吗?我相信之前肯定有人做过。

此外,这个论坛不是讨论 Angular 的。所以你只会得到与 Go 服务器部分相关的帮助。

更多关于Golang gRPC服务端与Angular gRPC客户端实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


尊敬的团队,

我需要一个 gRPC Go 语言服务器和 gRPC Angular 前端的示例代码。

此致, Prakash

以下是一个完整的Go gRPC服务端与Angular gRPC客户端的实现示例:

1. 定义Protocol Buffers(proto/user.proto)

syntax = "proto3";

package user;
option go_package = "./proto";

service UserService {
  rpc GetUser (UserRequest) returns (UserResponse);
  rpc CreateUser (CreateUserRequest) returns (UserResponse);
}

message UserRequest {
  string id = 1;
}

message CreateUserRequest {
  string name = 1;
  string email = 2;
}

message UserResponse {
  string id = 1;
  string name = 2;
  string email = 3;
}

2. Go gRPC服务端实现

// main.go
package main

import (
	"context"
	"log"
	"net"

	"google.golang.org/grpc"
	pb "your-project/proto"
)

type server struct {
	pb.UnimplementedUserServiceServer
	users map[string]*pb.UserResponse
}

func (s *server) GetUser(ctx context.Context, req *pb.UserRequest) (*pb.UserResponse, error) {
	if user, exists := s.users[req.Id]; exists {
		return user, nil
	}
	return nil, status.Errorf(codes.NotFound, "user not found")
}

func (s *server) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.UserResponse, error) {
	id := generateID()
	user := &pb.UserResponse{
		Id:    id,
		Name:  req.Name,
		Email: req.Email,
	}
	s.users[id] = user
	return user, nil
}

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	s := grpc.NewServer()
	pb.RegisterUserServiceServer(s, &server{
		users: make(map[string]*pb.UserResponse),
	})

	log.Println("gRPC server listening on port 50051")
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

3. Angular gRPC客户端实现

安装依赖

npm install @grpc/grpc-js google-protobuf @types/google-protobuf

生成TypeScript代码

protoc --plugin=protoc-gen-ts_proto=./node_modules/.bin/protoc-gen-ts_proto \
  --ts_proto_out=./src/app/proto \
  --ts_proto_opt=outputServices=grpc-js \
  --ts_proto_opt=esModuleInterop=true \
  proto/user.proto

Angular服务层(user.service.ts)

import { Injectable } from '@angular/core';
import { GrpcClientFactory, GrpcMetadata } from '@ngx-grpc/common';
import { GrpcWebClientFactory } from '@ngx-grpc/grpc-web-client';
import { UserServiceClient } from './proto/user.pb';
import { UserRequest, CreateUserRequest, UserResponse } from './proto/user.pb';

@Injectable({
  providedIn: 'root'
})
export class UserService {
  private client: UserServiceClient;

  constructor(
    private grpcClientFactory: GrpcClientFactory,
    private grpcWebClientFactory: GrpcWebClientFactory
  ) {
    this.client = this.grpcClientFactory.createClient(
      'UserService',
      UserServiceClient,
      'http://localhost:50051'
    );
  }

  getUser(id: string): Promise<UserResponse> {
    const request = new UserRequest();
    request.setId(id);
    
    return new Promise((resolve, reject) => {
      this.client.getUser(request, null, (err, response) => {
        if (err) {
          reject(err);
        } else {
          resolve(response);
        }
      });
    });
  }

  createUser(name: string, email: string): Promise<UserResponse> {
    const request = new CreateUserRequest();
    request.setName(name);
    request.setEmail(email);
    
    return new Promise((resolve, reject) => {
      this.client.createUser(request, null, (err, response) => {
        if (err) {
          reject(err);
        } else {
          resolve(response);
        }
      });
    });
  }
}

Angular组件(user.component.ts)

import { Component } from '@angular/core';
import { UserService } from './user.service';

@Component({
  selector: 'app-user',
  template: `
    <div>
      <h2>Create User</h2>
      <input [(ngModel)]="name" placeholder="Name">
      <input [(ngModel)]="email" placeholder="Email">
      <button (click)="createUser()">Create</button>
      
      <h2>Get User</h2>
      <input [(ngModel)]="userId" placeholder="User ID">
      <button (click)="getUser()">Get User</button>
      
      <div *ngIf="user">
        <h3>User Details</h3>
        <p>ID: {{user.id}}</p>
        <p>Name: {{user.name}}</p>
        <p>Email: {{user.email}}</p>
      </div>
    </div>
  `
})
export class UserComponent {
  name: string = '';
  email: string = '';
  userId: string = '';
  user: any = null;

  constructor(private userService: UserService) {}

  async createUser() {
    try {
      const response = await this.userService.createUser(this.name, this.email);
      console.log('User created:', response.toObject());
      alert(`User created with ID: ${response.getId()}`);
    } catch (error) {
      console.error('Error creating user:', error);
    }
  }

  async getUser() {
    try {
      const response = await this.userService.getUser(this.userId);
      this.user = response.toObject();
    } catch (error) {
      console.error('Error getting user:', error);
      this.user = null;
    }
  }
}

4. 配置Angular模块

// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { GrpcCoreModule } from '@ngx-grpc/core';
import { GrpcWebClientModule } from '@ngx-grpc/grpc-web-client';
import { AppComponent } from './app.component';
import { UserComponent } from './user.component';

@NgModule({
  declarations: [
    AppComponent,
    UserComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    GrpcCoreModule.forRoot(),
    GrpcWebClientModule.forRoot({
      settings: { host: 'http://localhost:50051' }
    })
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

5. 运行说明

  1. 启动Go服务端
go run main.go
  1. 启动Angular应用
ng serve
  1. 启用CORS(Go服务端)
import "github.com/rs/cors"

func main() {
    // ... 其他代码
    grpcServer := grpc.NewServer(
        grpc.UnaryInterceptor(cors.UnaryServerInterceptor(cors.Options{
            AllowedOrigins: []string{"http://localhost:4200"},
        })),
    )
    // ... 注册服务
}

这个实现展示了完整的gRPC双向通信,包括服务定义、Go服务端实现、Angular客户端集成和前后端交互。

回到顶部