golang go语言 组建微服务架构详解 - 代码基于开源框架grpc+nacos服务管理配置平台

整体介绍:

本文主要介绍如何用go语言 来组建微服务的框架,grpc+服务管理 

示例框架 代码由grpc+nacos go sdk 组成。 grpc负责将调用序列化并传递到远端,nacos负责服务发现和服务管理。

grpc和nacos都是开源产品。代码复制下来就能跑。

微服务解决了什么问题?

微服务架构通过将应用拆分为一系列小而自治的服务,解决了单体应用在扩展性和维护性上的问题。它主要提升了系统的可用性和稳定性,同时促进了开发团队间的高效协作。

例如,在一个快速成长的项目中,随着业务增长,订单处理、商品展示等功能模块逐渐庞大复杂。采用微服务后,可以将这些功能独立部署为单独的服务,每个服务由专门的小团队负责。

这样不仅加快了新功能的迭代速度,也使得故障隔离变得更容易,从而提高了整体系统的健壮性。

团队规模扩大时,这种模式有助于明确职责划分,减少沟通成本,进而加速产品开发周期。

微服务实战中的应用拆分

在对一个典型的交易网站进行微服务切分时,可以采用领域驱动设计(DDD)的思想。

首先,识别出业务中的核心领域,比如用户管理、商品展示与管理、交易处理以及评价系统等。每个领域对应着一个或多个关键实体。以淘宝为例,它可以被拆分为“用户”、“商品”、“交易”和“评价”四大主要领域,领域主要和团队的角色分工相关。

然后 规划和构建领域内的核心方法,“用户”领域负责账号注册、登录验证和个人信息管理;“商品”领域则专注于商品的发布、搜索与分类;“交易”领域涵盖下单、支付及订单状态跟踪等功能;而“评价”领域则处理买家对卖家或商品的反馈。

最后,用微服务框架来实现,本例假设前两步已经做好,那么就可以用grpc+nacos来实现服务调用和服务管理。

这种按照业务领域来划分的方式,不仅使得每个服务都能由专门的团队独立开发维护,而且还能提高系统的可扩展性和灵活性,便于后续的技术迭代升级。

Nacos Go SDK 概述

Nacos 是一个动态服务发现、配置管理和服务管理平台,旨在帮助开发者更容易地构建、维护和管理微服务架构。

它提供了包括服务注册与发现、动态配置、DNS 服务等多种功能,并支持多种主流的编程语言。这个产品最新推出了Nacos go sdk,开源免费,可以作为Go语言微服务的最佳拍档。

服务注册与发现流程解析

在Nacos中,服务注册和服务发现是两个核心的功能,这两个功能共同保证了微服务架构下的服务能够被有效管理和访问。以下将基于提供的知识内容,对服务注册和服务发现的主要流程进行介绍,并提及如何使用gRPC和Nacos Go SDK来实现这些过程。

服务注册

  1. 启动服务实例:首先,开发者需要启动一个或多个服务实例。每个实例拥有自己独立的网络地址(IP:Port)。
  1. 配置Nacos客户端:接下来,在服务实例内部配置Nacos客户端的相关参数,包括Nacos服务器的地址等信息。如果使用的是Nacos Go SDK,则需按照其文档指南初始化客户端。
  1. 注册服务至Nacos:通过调用Nacos客户端提供的API(对于Go语言环境而言就是通过Nacos Go SDK),将当前服务实例的信息提交给Nacos服务端。这里提交的信息可能包括但不限于服务名、IP地址、端口号以及元数据(如版本号)。对于支持gRPC协议的服务来说,还需要额外指定服务所使用的协议类型为gRPC。
  1. 健康检查设置:配置好自动健康检查机制。一旦服务成功注册到Nacos之后,Nacos会定期对该服务执行健康状态检测以确保其实例处于可用状态。这一步骤对于保持整个服务体系稳定运行非常重要。

服务发现

  1. 客户端初始化:与服务注册类似,任何希望查找特定服务位置的应用程序都需要先完成Nacos客户端的初始化工作。
  1. 请求获取服务列表:应用程序通过Nacos客户端向Nacos服务器发起查询请求,询问指定名称的服务有哪些正在运行中的实例。这里同样可以利用Nacos Go SDK简化开发流程。
  1. 解析服务信息:从Nacos返回的结果中解析出所需的服务实例详情,比如它们的具体IP地址及端口等信息。如果目标服务支持gRPC通信方式的话,还需注意选择合适的服务实例来进行后续交互。
  1. 建立连接并调用服务:根据获取到的服务实例信息,客户端可以直接与其建立TCP连接(对于gRPC服务则是gRPC连接),然后开始发送请求并接收响应。

综上所述,借助于Nacos强大的服务注册与发现能力,结合gRPC高效的数据传输效率以及Nacos Go SDK提供的便捷接口支持,可以轻松构建起一套灵活可靠的服务管理体系。在整个过程中,重要的是正确配置各项参数,并合理设计系统的健壮性和容错性,以应对可能出现的各种异常情况。

基于gRPC和Nacos的服务发现与注册构建过程

实际的构建过程,基于grpc 和 nacos 的服务发现和服务注册

1. GRPC Prerequisites

在开始之前,请确保已安装protoc及其Go插件,以生成gRPC服务所需的Go代码。这可以通过执行以下命令完成:

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

之后,更新您的环境变量PATH来包含这些工具:

$ export PATH="$PATH:$(go env GOPATH)/bin"
2. Nacos-sdk-go 安装

接着,通过运行下面的命令安装Nacos Go SDK:

$ go get -u github.com/nacos-group/nacos-sdk-go/v2
3. Grpc proto文件准备 & 代码生成

创建一个简单的gRPC服务定义(这里假设为helloworld.proto),然后使用protoc工具生成对应的Go语言实现:

// helloworld.proto
service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }

运行如下命令来从.proto文件生成Go代码:

protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
helloworld/helloworld.proto
4. Go Grpc Server与Nacos集成

现在我们有了基本的服务接口和数据结构定义,接下来是服务器端的实现,并将其与Nacos结合用于服务注册。这部分代码展示了如何初始化gRPC服务并将其注册到Nacos:

import ("context""flag""fmt""log""net""os""os/signal""syscall"pb "your_project_path/helloworld" // 导入自动生成的pb包grpc "google.golang.org/grpc""github.com/nacos-group/nacos-sdk-go/v2/clients"constant "github.com/nacos-group/nacos-sdk-go/v2/common/constant"vo "github.com/nacos-group/nacos-sdk-go/v2/vo"
)var port = flag.Uint64("port", 50051, "The server port")type server struct{ pb.UnimplementedGreeterServer }func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {log.Printf("Received: %v", in.GetName())return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}func main() {flag.Parse()lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterGreeterServer(s, &server{})clientConfig := constant.ClientConfig{NamespaceId:         "public",TimeoutMs:           5000,NotLoadCacheAtStart: true,LogDir:              "/tmp/nacos/log",CacheDir:            "/tmp/nacos/cache",LogLevel:            "info",}serverConfigs := []constant.ServerConfig{{IpAddr: "mse-51d24ce0-p.nacos-ans.mse.aliyuncs.com", Port: 8848}}namingClient, _ := clients.CreateNamingClient(map[string]interface{}{"serverConfigs": serverConfigs,"clientConfig":  clientConfig,})serviceName, groupName, clusterName := "example.grpc.server", "DEFAULT_GROUP", "cluster-a"_, err = namingClient.RegisterInstance(vo.RegisterInstanceParam{Ip:          "127.0.0.1",Port:        *port,ServiceName: serviceName,Weight:      10,Enable:      true,Healthy:     true,Ephemeral:   true,Metadata:    map[string]string{"idc": "shanghai"},ClusterName: clusterName,GroupName:   groupName,})if err != nil {log.Fatalf("Error registering service: %v", err)}go func() {if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}}()sigCh := make(chan os.Signal, 1)signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)<-sigChfmt.Println("Shutting down...")_, err = namingClient.DeregisterInstance(vo.DeregisterInstanceParam{Ip:          "127.0.0.1",Port:        *port,ServiceName: serviceName,Ephemeral:   true,Cluster:     clusterName,GroupName:   groupName,})if err != nil {log.Printf("Error deregister service: %v", err)}s.GracefulStop()fmt.Println("grpc server is stopped")
}
5. Go Grpc Client与Nacos集成

最后一步是客户端代码,它通过Nacos发现服务实例并调用远程方法。

const defaultName = "world"
var name = flag.String("name", defaultName, "Name to greet")func main() {flag.Parse()clientConfig := constant.ClientConfig{NamespaceId:         "public",TimeoutMs:           5000,NotLoadCacheAtStart: true,LogDir:              "/tmp/nacos/log",CacheDir:            "/tmp/nacos/cache",LogLevel:            "info",}serverConfigs := []constant.ServerConfig{{IpAddr: "mse-51d24ce0-p.nacos-ans.mse.aliyuncs.com", Port: 8848}}namingClient, _ := clients.CreateNamingClient(map[string]interface{}{"serverConfigs": serverConfigs,"clientConfig":  clientConfig,})instance, err := namingClient.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{ServiceName: "example.grpc.server",GroupName:   "DEFAULT_GROUP",Clusters:    []string{"cluster-a"},})if err != nil {log.Fatalf("failed to select instances: %v", err)}addr := fmt.Sprintf("%s:%d", instance.Ip, instance.Port)conn, err := grpc.Dial(addr, grpc.WithInsecure())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()c := pb.NewGreeterClient(conn)ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})if err != nil {log.Fatalf("could not greet: %v", err)}log.Printf("Greeting: %s", r.GetMessage())
}
解释

以上步骤描述了从设置环境直到创建gRPC服务并通过Nacos进行服务发现的完整流程。首先,您需要准备好必要的开发工具如protoc;其次,通过编写.proto文件定义服务接口;然后,分别实现服务端和客户端程序,并将它们与Nacos服务发现机制集成起来。这样做的好处在于能够动态地发现可用的服务实例,并支持负载均衡等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13819.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

open3d

open3d open3d用于 3D 数据处理的现代库。 简介 Open3D 是一个开源库&#xff0c;支持快速开发处理 3D 数据的软件。Open3D 前端公开了一组精心挑选的 C 和 Python 数据结构和算法。后端经过高度优化&#xff0c;并设置为并行化。Open3D 是从零开始开发的&#xff0c;具有一更…

一个轻量级RAG文本切块项目Chonkie

**Chonkie&#xff1a;**实用的RAG分块库&#xff0c;轻量级、速度快&#xff0c;可随时对文本进行分块 支持的方法 Chonkie 提供了多个分块器&#xff0c;可高效地为RAG应用程序拆分文本。以下是可用分块器的简要概述&#xff1a; TokenChunker&#xff1a;将文本分割成固定大…

如何通过AB测试找到最适合的Yandex广告内容

想要在Yandex上找到最能吸引目标受众的广告内容&#xff0c;A/B测试是一个不可或缺的步骤。通过对比不同版本的广告&#xff0c;我们可以发现哪些元素最能引起用户的共鸣。首先&#xff0c;设计两个或多个广告版本&#xff0c;确保每个版本在标题、文案、图片等关键元素上有所不…

车载空气净化器语音芯片方案

开发背景&#xff1a; 随着人们生活质量的不断提升和环保意识的日益增强&#xff0c;车内空气质量成为了广大车主关注的焦点。长时间封闭的车厢环境&#xff0c;加之城市空气污染、新车内饰材料释放的有害气体等因素&#xff0c;使得车内空气质量往往不尽如人意&#xff0c;严重…

JUC-locks锁

JUC-locks锁 1、JUC-locks锁概述2、管程模型3、ReentrantLock可重入锁3.1 ReentrantLock源码3.2 Sync静态内部类3.3 NonfairSync非公平锁3.4 FairSync公平锁 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎批评指正&#xff5e; 1、JUC-locks锁概述 java…

如何将交叉编译配置在环境变量中

-- 将交叉编译配置到环境变量中&#xff0c;就可以直接用了 -- 环境变量 PATH -- 修改 Linux 的环境变量需要哪个文件 针对本用户修改&#xff1a; ~/.bashrc针对所有用户修改&#xff1a; /etc/profile -- 这里针对所有用户修改 sudo gedit /etc/profile-- 注意这个文件…

LeetCode-222.完全二叉树的节点个数

. - 力扣&#xff08;LeetCode&#xff09; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一…

Jmeter中的配置原件(五)

17--登录配置原件/素 用途 管理登录信息&#xff1a;为测试计划中的多个请求提供统一的登录信息。简化配置&#xff1a;避免在每个请求中重复配置用户名和密码。支持多种认证方式&#xff1a;支持Basic、Digest等认证方式。 配置步骤 添加登录配置元件 右键点击线程组&#…

深度解析 ArrayList:揭开源码背后的设计与实现原理

一、ArrayList 简介 ArrayList 的底层是数组队列&#xff0c;相当于动态数组。与 Java 中的数组相比&#xff0c;它的容量能动态增长。在添加大量元素前&#xff0c;应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 ArrayLi…

网络安全应该学什么?别被培训机构这些内容给骗了!

了解过的朋友都知道&#xff0c;网络安全内容十分丰富&#xff0c;大大小小的知识点都包含。所以有的朋友就都想学&#xff0c;尤其一些培训机构的课程大纲介绍的特别详细&#xff0c;又包含这又包含那&#xff0c;但是这些内容真的都实用吗&#xff1f;如果想系统学习&#xf…

吴恩达LLM Agent工作流Prompt设计精解

在详解和实测吴恩达4种Agentic 工作流之中&#xff0c;我测试了各种框架诸如反思、工具调用、规划、多智能体&#xff0c;在学习了其中各种Prompt设计后&#xff0c;有了一些新的认识。 对于特定的任务来说&#xff0c;没有万能的Prompt&#xff0c;只有一些通用的模式&#xf…

除了 Mock.js,前端还有更方便的 Mock 数据工具吗?

在前端开发中&#xff0c;模拟数据&#xff08;Mock Data&#xff09;是不可或缺的一部分&#xff0c;它能够帮助开发者在后端接口未完成前进行界面和逻辑的测试。而 Mock.js 是一个广泛使用的库&#xff0c;它通过简洁的语法和强大的功能&#xff0c;让前端开发者可以轻松地创…

【原创】java+ssm+mysql高校学籍管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

pytorch深度学习环境安装 + 讲解【新手版】

不知道有没有学深度学习的小伙伴在安装深度学习环境时候很头疼&#xff0c;反正我在研一时候是很头疼很头疼的一件事&#xff0c;根本搞不清楚什么显卡、显卡驱动、pytorch版本、cuda、cudnn等等等&#xff0c;这些是不是非常的头疼。 好&#xff0c;你们的救星来了。我&#x…

zabbix搭建钉钉告警流程

目录 zabbix实验规划 zabbix实验步骤 1 使用钉钉添加一个自定义的机器人 ​编辑2在zabbix-server上编写钉钉信息发送脚本&#xff0c;设置钉钉报警媒介 设置钉钉报警媒介​编辑​编辑 在添加消息模板​编辑​编辑​编辑 3设置动作条件 触发后的行为&#xff1a;重新添加一…

无人机飞手考证,地面站培训技术详解

无人机飞手考证及地面站培训技术涉及多个关键方面&#xff0c;以下是对这些方面的详细解析&#xff1a; 一、无人机飞手考证流程与要求 1. 证书类型 民用无人机驾驶员证书&#xff1a;这是国家民航局颁发的无人机操作人员资质证书&#xff0c;分为视距内驾驶员、超视距驾驶员…

高颜值的卡片折叠效果(附源码)

预览效果 源码(html部分) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>17sucai -Holiday Feature Folding Cards [Pure CSS]</title><meta charset"UTF-8"><meta name&qu…

Mybatis的执行流程解析

根据图中步骤&#xff0c;我们可以将这个执行流程分成了8个步骤。 1、读取MyBatis的核心配置文件。mybatis-config.xml为MyBatis的全局配置文件&#xff0c;用于配置数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器&#xff08;mapper.xml&#xff09;等信息…

24年下软考系统架构设计师真题及答案,估分、备考速看!

2024下半年软考考试已经圆满结束了&#xff0c;为大家整理了网友回忆版的软考高级系统架构设计师真题真题及答案。下半年考试的宝子们可以对答案预估分数&#xff01;准备明年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff01; 一、…

手把手教你用Coze零代码搭建一个智能搜索智能体,高时效性、保姆级!

随着大模型技术的发展&#xff0c;越来越多的技术开始涌现&#xff0c;从聊天助手&#xff0c;到智能体&#xff0c;再到工作流&#xff0c;最后到三者的整合。大模型技术朝着更加智能化、通用化、个性化的方向发展&#xff0c;为人们的生活和工作带来了更多的便利和创新。 今…