1. 服务注册

1.1 代码演示

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

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执行两次

 # 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循环来持续获取
  • 打印出当前获取到的服务实例的端口
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端口的实例了

go微服务系列(二) - 服务注册/服务发现的更多相关文章

  1. Dubbo 微服务系列(03)服务注册

    Dubbo 微服务系列(03)服务注册 [TOC] Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 图1 Dubbo经典架构图 注:本图来源 Dubbo官方架构 ...

  2. 【spring cloud】一个ms微服务想要给注册中心eureka发现,需要满足这些条件,微服务不能被eureka注册中心发现的解决方案

    在spring cloud中,一个新的微服务想要被注册中心发现,需要注意几个地方: 1.pom.xml文件依赖中需要有这个依赖 spring boot 2.x 需要这个依赖 <dependenc ...

  3. 服务端使用Zookeeper注册服务地址,客户端从Zookeeper获取可用的服务地址。

    一个轻量级分布式RPC框架--NettyRpc - 阿凡卢 - 博客园 http://www.cnblogs.com/luxiaoxun/p/5272384.html 这个RPC框架使用的一些技术所解 ...

  4. 微服务系列之 Consul 注册中心

    原文链接:https://mrhelloworld.com/posts/spring/spring-cloud/consul-service-registry/ Netflix Eureka 2.X ...

  5. 带你十天轻松搞定 Go 微服务系列(八、服务监控)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

  6. C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...

  7. Java微服务(二):服务消费者与提供者搭建

    本文接着上一篇写的<Java微服务(一):dubbo-admin控制台的使用>,上篇文章介绍了docker,zookeeper环境的安装,并参考dubbo官网演示了dubbo-admin控 ...

  8. hyperf从零开始构建微服务(二)——构建服务消费者

    阅读目录 构建服务消费者 安装json rpc依赖 安装JSON RPC客户端 server配置 编写业务代码 编写服务消费者类 consumer配置 配置 UserServiceInterface ...

  9. springcloud入门系列(二):注册中心Eureka

    搭建注册中心Eureka 1.pom中依赖 <dependencies> <dependency> <groupId>org.springframework.clo ...

随机推荐

  1. Kafka Eagle V2.0.0新版预览

    1.概述 Kafka Eagle是一款用于管理Kafka的监控系统,且完全开源.当前Kafka Eagle发布了2.0.0版本.今天笔者就为大家来介绍一下2.0.0更新了哪些功能. 官网地址:http ...

  2. gvim使用总结

    我的gvim配置 set nocompatible " 关闭vi兼容 " 显示相关 set go= set number set cursorline set nowrap set ...

  3. CISSP 考试经验分享

    复习资料: <Eleventh Hour CISSP> <汇哲培训讲义> <CISSP Official Security Professional>Eighth ...

  4. ref和动态组件

    ref--------指引 另一种获取表单值的方法 是Vue环境中一个内置的属性.它可以使用this.$refs可以快速拿到DOM对象.

  5. vue : 对 vue-class-component 的个人理解

    vue-class-component 是 vue 的官方库,作用是用类的方式编写组件. 这种编写方式可以让.vue文件的js域结构更扁平,并使vue组件可以使用继承.混入等高级特性. 简单的示例: ...

  6. web自动化 -- 框架

    一.框架源码 https://github.com/jiangnan27/Autotest_UI_Open   二.框架大概介绍 Python3 + selenium3 + pytest5.3 + a ...

  7. js 从目标数组中过滤掉 一个数组元素,

    标题描述的有点僵硬,大概需求是,从目标数组中过滤掉我想要删除的元素集合,这里使用的是遍历+过滤器的组合,很方便,做个笔记! let old = ["AE_CN_SUPER_ECONOMY_G ...

  8. HTML主要标签应用

     HTML属性 属性一般描述于开始标签 属性总是以名称/值对的形式出现,比如:name="value". HTML颜色 1.英文单词表示. red.green <p styl ...

  9. makefile for Linux纯小白版

    某大佬曾说过: 不会makefile,不要说你会linux,因为makefile是合格程序员的必经之路 首先你要有个vi或者emacs 之类的编辑器 编写几个程序 test1.c #include&l ...

  10. ROS 机器人技术 - 广播与接收 TF 坐标

    上次我们学习了 TF 的基本概念和如何发布静态的 TF 坐标: ROS 机器人技术 - TF 坐标系统基本概念 ROS 机器人技术 - 静态 TF 坐标帧 这次来总结下如何发布一个自定义的 TF 坐标 ...