一,服务与服务之间采用TLS加密通信
在Golang基于gRPC的微服务开发中,可以采用TLS加密通信来确保服务与服务之间的安全通信。下面是一个简单的设计示例:
- 生成证书和密钥:
$ openssl req -newkey rsa:2048 -nodes -keyout server.key \
-x509 -days 365 -out server.crt
- 定义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
}
- 客户端连接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)
// ...
}
- 在服务实现中添加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服务注册和服务发现文章来源:https://www.toymoban.com/news/detail-627791.html
在Golang基于gRPC的微服务开发中,可以使用etcd来实现服务注册和服务发现。下面是一个简单的设计示例:文章来源地址https://www.toymoban.com/news/detail-627791.html
- 安装etcd客户端:
$ go get go.etcd.io/etcd/clientv3
- 在服务启动时注册到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)
}
// ...
}
- 在客户端中从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:] // 去掉前缀
到了这里,关于在CSDN学Golang场景化解决方案(基于grpc的微服务开发脚手架)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!