在CSDN学Golang场景化解决方案(基于grpc的微服务开发脚手架)

一,服务与服务之间采用TLS加密通信

在Golang基于gRPC的微服务开发中,可以采用TLS加密通信来确保服务与服务之间的安全通信。下面是一个简单的设计示例:

  1. 生成证书和密钥:
$ openssl req -newkey rsa:2048 -nodes -keyout server.key \
    -x509 -days 365 -out server.crt
  1. 定义gRPC服务器:
func newServer() (*grpc.Server, error) {
	// 加载证书和密钥
	creds, err := credentials.NewServerTLSFromFile("server.crt", "server.key")
	if err != nil {
		return nil, err
	}

	// 创建gRPC服务器并添加证书和拦截器
	srv := grpc.NewServer(
        grpc.Creds(creds),
        grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
            // 添加其他中间件拦截器,如认证、日志等
        )),
    )

    // 注册gRPC服务
    pb.RegisterUserServiceServer(srv, &userService{})

	return srv, nil
}
  1. 客户端连接gRPC服务器:
func main() {
    // 加载证书和密钥,并创建凭据对象
    creds, err := credentials.NewClientTLSFromFile("server.crt", "")
    if err != nil {
        log.Fatal(err)
    }

    // 建立连接并创建客户端对象,并添加拦截器(可选)
    conn, err := grpc.Dial(":9000", grpc.WithTransportCredentials(creds))
    if err != nil {
        log.Fatal(err)
    }
    
    defer conn.Close()

	client := pb.NewUserServiceClient(conn)

    // ...
}
  1. 在服务实现中添加TLS加密通信:
type userService struct {
	pb.UnimplementedUserServiceServer
}

func (s *userService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {
	// 从请求中获取用户ID并查询用户信息
	user := &User{ID: req.Id}
	err := db.First(user).Error
	if err != nil {
		return nil, status.Errorf(codes.NotFound, "User not found")
	}

	// 将用户信息转换为gRPC响应对象并返回
	res := &pb.GetUserResponse{
		Id:    user.ID,
		Name:  user.Name,
		Email: user.Email,
	}

	return res, nil
}

func newServer() (*grpc.Server, error) {
	// 加载证书和密钥,并创建凭据对象
	creds, err := credentials.NewServerTLSFromFile("server.crt", "server.key")
	if err != nil {
		return nil, err
	}

	// 创建gRPC服务器并添加证书和拦截器
	srv := grpc.NewServer(
        grpc.Creds(creds),
        grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
            // 添加其他中间件拦截器,如认证、日志等
        )),
    )

    // 注册gRPC服务
    pb.RegisterUserServiceServer(srv, &userService{})

	return srv, nil
}

这样,在Golang基于gRPC的微服务开发中,就可以使用TLS加密通信确保服务与服务之间的安全通信了。注意,在生成证书和密钥时,请按照实际情况替换成自己的证书和密钥。

二,etcd服务注册和服务发现

在Golang基于gRPC的微服务开发中,可以使用etcd来实现服务注册和服务发现。下面是一个简单的设计示例:

  1. 安装etcd客户端:
$ go get go.etcd.io/etcd/clientv3
  1. 在服务启动时注册到etcd:
func main() {
    // ...
    
	// 创建etcd客户端并连接到etcd服务器
	cli, err := clientv3.New(clientv3.Config{
		Endpoints: []string{"localhost:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		log.Fatal(err)
	}
	defer cli.Close()

	// 创建gRPC服务器并添加证书和拦截器
	srv := grpc.NewServer(
        // ...
    )

    // 注册gRPC服务
    pb.RegisterUserServiceServer(srv, &userService{})

    // 启动gRPC服务器
	go func() {
		lis, err := net.Listen("tcp", ":9000")
		if err != nil {
			log.Fatal(err)
		}

        if err = srv.Serve(lis); err != nil {
            log.Fatalf("failed to serve: %v", err)
        }
    }()

    // 在etcd中注册服务信息(IP地址、端口等)
	serviceKey := fmt.Sprintf("/services/%s/%s:%d",
                            serviceName, serviceIP, servicePort)

	resp, err := cli.Grant(context.Background(), 5*time.Minute)
	if err != nil {
	    log.Fatal(err)
	}

	if _, err = cli.Put(context.Background(), serviceKey, "", clientv3.WithLease(resp.ID)); 
        if err != nil {
            log.Fatal(err)
        }
    
    // ...
}
  1. 在客户端中从etcd获取服务地址:
func main() {
    // ...

	// 创建etcd客户端并连接到etcd服务器
	cli, err := clientv3.New(clientv3.Config{
		Endpoints: []string{"localhost:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		log.Fatal(err)
	}
	defer cli.Close()

    // 从etcd中获取服务地址
	serviceKey := fmt.Sprintf("/services/%s", serviceName)

	resp, err := cli.Get(context.Background(), serviceKey, clientv3.WithPrefix())
	if err != nil {
	    log.Fatal(err)
	}

	var addresses []string
	for _, kv := range resp.Kvs {
	    address := string(kv.Key)[len(serviceKey)+1:] // 去掉前缀
	  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值