go微服务系列(二) - 服务注册/服务发现

1. 服务注册#

1.1 代码演示#

还是跟上一篇:go微服务(一) - go micro入门一样使用consul

Copy
package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/web" "github.com/micro/go-plugins/registry/consul" ) func main() { // 1.添加consul地址 cr := consul.NewRegistry( registry.Addrs("127.0.0.1:8500")) // 2.使用gin作为router router := gin.Default() router.GET("/user", func(c *gin.Context) { c.String(http.StatusOK, "user api") }) // 3.初始化go micro server := web.NewService( web.Name("productService"), // 当前微服务服务名 web.Registry(cr), // 注册到consul web.Address(":8081"), // 端口 web.Metadata(map[string]string{"protocol": "http"}), // 元信息 web.Handler(router)) // 路由 _ = server.Run() }

1.2 在go run的时候传入服务注册的参数#

上面为了演示简便,直接将服务注册的服务名端口等写死在代码里,但是实际运用场景不可能这么写,所以我们一般会

  • 把这部分定义在配置文件里
  • 使用go micro提供的功能,可以在go run的时候传入参数

下面演示下如何在go run的时候传入参数

第一步

在原来的服务注册的基础代码上添加server.Init()

加上这个就会解析cli命令中的参数

如下导航到源码看下具体的实现,就是添加了Init()方法之后,会将我们传入的cli命令的特定参数,进行注册,优先级高于代码定义的

第二步

这里选择改变下服务注册的端口,即在main包路径下执行以下命令,且开两个tab执行两次

Copy
# tab1 go run productService_main.go --server_address :8088 # tab2 go run productService_main.go --server_address :8089

如下运行成功:

然后去consul界面查看,两个实例都注册成功:


2. 服务发现均衡负载#

2.1 均衡负载算法#

go-micro的服务发现的算法由github.com/micro/go-micro/client/selector下的selector提供,目前提供了两种算法

  • RoundRobin(轮询算法)
  • Random(随机算法)

2.2 服务发现均衡负载的演示#

使用上一节的方式,服务注册部分,同时启动了以下三个端口的productService服务

  • 8088
  • 8089
  • 8090

然后在服务发现部分

  • 使用selector.Random来随机发现服务
  • 使用for循环来持续获取
  • 打印出当前获取到的服务实例的端口
Copy
func main() { // 1.连接到consul cr := consul.NewRegistry(registry.Addrs("127.0.0.1:8500")) // 使用for循环持续获取 for { // 2.根据service name获取对应的微服务列表 services, err := cr.GetService("productService") if err != nil { log.Fatal("cannot get service list") } // 3.使用random随机获取其中一个实例 next := selector.Random(services) svc, err := next() if err != nil { log.Fatal("cannot get service") } fmt.Println("[测试输出]:", svc.Address) time.Sleep(time.Second * 1) } }

所以输出的实例端口可以看如下,随机获取到三个端口中的任意一个

这时候吧8090端口的服务给关掉,再看下输出,就不会有8090端口的实例了

posted @   宝树呐  阅读(2737)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
CONTENTS