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. ArcGIS 10.2安装及卸载教程

    卸载 在控制面板中找到程序->卸载程序 找到ArcGIS的相关软件 这里以ArcGIS 10.2 Destop为例,选中,然后点击卸载,会出现如下界面 选择Remove,然后根据提示进行操作,即 ...

  2. JavaScript 基础 学习 (一)

    JavaScript 基础 学习 获取页面中的元素的方法 作用:通过各种方式获取页面中的元素 ​ 比如:id,类名,标签名,选择器 的方式来获取元素 ​ 伪数组: ​ 长的和数组差不多,也是按照索引排 ...

  3. python利用difflib判断两个字符串的相似度

    我们再工作中可能会遇到需要判断两个字符串有多少相似度的情况(比如抓取页面内容存入数据库,如果相似度大于70%则判定为同一片文章,则不录入数据库) 那这个时候,我们应该怎么判断呢? 不要着急,pytho ...

  4. scss : div水平垂直居中

    scss 是一个很好用的css预处理语言,有很多很好的特性. 比如 mixin. 我们可以像使用函数那样使用mixin. 比如写一个div水平垂直居中. 上代码. @mixin absolute_ce ...

  5. vue : rem自适应的应用

    我们知道,rem是一个css单位,指的是HTML根节点的字体大小. MDN:css单位 而我们在用rem布局的时候必然会遇到一个问题:我们需要根据用户的屏幕大小去计算rem. 以下是代码. (在VUE ...

  6. 浅谈6种JS数组遍历方法的区别

    本篇文章给大家介绍一下6种JS数组遍历方法:for.foreach.for in.for of.. each. ().each的区别.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. ...

  7. 扩展BSGS

    \(BSGS\) 求解\(a^x\equiv b\pmod p\),且\(a\)与\(p\)互质 由\(a^{φ(p)}\equiv1 \pmod p\)和\(a^0\equiv 1\pmod p\) ...

  8. vue中引入jq的步骤--以及注意事项

  9. es6 Proxy简单使用

    es6的Proxy是什么? 可以理解为,是在访问对象前的一层拦截.只要访问的该对象,就要通过这个一层拦截.这一层的拦截,可以进行数据的过滤和更改 比如下面这个 var p = new Proxy({} ...

  10. 聊一聊Flutter的setState()

    Flutter 里面包含两种widget 一种可变的,一种不可变的: 在可变的widget中可以使用 setstate(){} 函数. 官方也给出了例子: _onClick(){ setState() ...