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. Spring Boot中Tomcat是怎么启动的

    Spring Boot一个非常突出的优点就是不需要我们额外再部署Servlet容器,它内置了多种容器的支持.我们可以通过配置来指定我们需要的容器. 本文以我们平时最常使用的容器Tomcat为列来介绍以 ...

  2. vpp之clib.h分析

    vpp代码中有一个clib.h,其中封装了很一些很经典的位运算: //计算以2为底的对数,log2(x) //也就是计算2的N次方为x.x为uint32类型 #if defined (count_le ...

  3. java 使用正则去重

    //去重复 public static void test1() { String str = "aaactttsssfvvvvds"; String regex = " ...

  4. JVM详解之:运行时常量池

    目录 简介 class文件中的常量池 运行时常量池 静态常量详解 String常量 数字常量 符号引用详解 String Pool字符串常量池 总结 简介 JVM在运行的时候会对class文件进行加载 ...

  5. 基于Redis分布式锁的正确打开方式

    分布式锁是在分布式环境下(多个JVM进程)控制多个客户端对某一资源的同步访问的一种实现,与之相对应的是线程锁,线程锁控制的是同一个JVM进程内多个线程之间的同步.分布式锁的一般实现方法是在应用服务器之 ...

  6. Mesos+Zookeeper+Marathon+Docker环境搭建

    相关理论请参考:https://www.cnblogs.com/Bourbon-tian/p/7155054.html,本文基于https://www.cnblogs.com/Bourbon-tian ...

  7. Oracle版本发布规划 (文档 ID 742060.1)

    Oracle Database Release Schedule of Current Database Releases (文档 ID 742060.1) Oracle Database RoadM ...

  8. C++语法小记---如何判断一个变量是不是指针

    如何判断一个变量是不是指针? 思路:模板函数 + 可变参数 + sizeof(函数) #include <iostream> #include <string> using n ...

  9. 学完自动化测试,用小技能做了点兼职刷弹幕,小赚10W

    大家好,今天又给大家带来了Python爬虫的分享,继续来研究一下虎牙平台的爬虫. 起因 我冒出有一个很有趣的想法,就是,我们可以使用selenium来完成虎牙自动化登录,并且自动给主播发送弹幕功能的程 ...

  10. 聊一聊Flutter的setState()

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