Eureka-Client

Golang实现eureka-client

原理

根据Java版本的源码,可以看出client主要是通过REST请求来与server进行通信。

Java版本的核心实现:com.netflix.discovery.DiscoveryClient

其中主要逻辑如下:

  • client启动时注册信息到server
  • 定时心跳、刷新服务列表,主要是两个线程池:heartbeatExecutorcacheRefreshExecutor
  • client关闭时删除注册信息

实现

这里不限制语言,主要是发送REST请求到server。

注册信息

通过POST请求,将服务信息注册到server。

请求地址:POST /eureka/apps/{APP_NAME}

信息如下:(不是完整的信息)

{
"instance":{
"instanceId":"192.168.1.107:golang-example:10000",
"hostName":"192.168.1.107",
"ipAddr":"192.168.1.107",
"app":"golang-example",
"port":{
"@enabled":"true",
"$":10000
},
"securePort":{
"@enabled":"true",
"$":443
},
"status":"UP",
"overriddenStatus":"UNKNOWN",
"dataCenterInfo":{
"name":"MyOwn",
"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo"
}
}
}

定时心跳、刷新服务列表

服务启动后,接下来就是维持client与server之间的心跳等。

定时心跳

默认情况下是30秒发送心跳信息到server。

请求地址:PUT /eureka/apps/{APP_NAME}/{INSTANCE_ID}?status=UP&lastDirtyTimestamp={TIMESTAMP}

定时刷新服务列表

默认情况下是30秒刷新服务列表。

刷新服务列表有全量和增量两种方式:

  • 全量:GET /eureka/apps
  • 增量(delta):GET /eureka/apps/delta

其中,全量就是每次都拉取到所有服务信息;而增量拉取变化的服务信息,然后本地去做更新。

为了方便我只实现了全量拉取,没有实现delta。

删除注册信息

在服务停止时,删除注册的信息即可。

请求地址:DELETE /eureka/apps/{APP_NAME}/{INSTANCE_ID}

Golang核心实现

有2个定时器:

  • refreshTicker来刷新服务列表
  • heartbeatTicker进行心跳
func (c *Client) Start() {
c.mutex.Lock()
c.Running = true
c.mutex.Unlock() refreshTicker := time.NewTicker(c.EurekaClientConfig.RefreshIntervalSeconds)
heartbeatTicker := time.NewTicker(c.EurekaClientConfig.HeartbeatIntervalSeconds) go func() {
for range refreshTicker.C {
if c.Running {
if err := c.doRefresh(); err != nil {
fmt.Println(err)
}
} else {
break
}
}
}() go func() {
if err := c.doRegister(); err != nil {
fmt.Println(err)
}
for range heartbeatTicker.C {
if c.Running {
if err := c.doHeartbeat(); err != nil {
fmt.Println(err)
}
} else {
break
}
}
}()
}

例子

下面是使用的例子,为了在client停止时删除注册信息,这里用到了signal

package main

import (
"encoding/json"
"fmt"
"net/http"
"os"
"os/signal"
"syscall" client "github.com/xuanbo/eureka-client"
) func main() {
// 1.创建客户端
c := client.NewClient(&client.EurekaClientConfig{
DefaultZone: "http://127.0.0.1:8080/eureka/",
App: "golang-example",
Port: 10000,
})
// 2.启动client,注册到server。并定心跳、刷新服务列表
c.Start() sigs := make(chan os.Signal)
exit := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) // 随便弄一个请求
http.HandleFunc("/services", func(writer http.ResponseWriter, request *http.Request) {
// 3.获取所有服务(status均为UP)
services := c.Services b, _ := json.Marshal(services)
_, _ = writer.Write(b)
})
server := &http.Server{
Addr: ":10000",
Handler: http.DefaultServeMux,
} // 启动http服务
go func() {
if err := server.ListenAndServe(); err != nil {
fmt.Println(err)
}
}() // 关闭
go func() {
fmt.Println(<-sigs) // 停止http服务
if err := server.Close(); err != nil {
panic(err)
} // 4.停止客户端,并删除注册信息
c.Shutdown() exit <- true
}() <-exit
}

主要是4步,用起来比较简单。

Github地址

Github

说明

未在生产中使用,只是想把Golang的服务与Java的Spring Cloud结合起来玩耍。

Just for fun!

Eureka-Client(Golang实现)的更多相关文章

  1. 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)

    目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...

  2. 第一个Eureka程序,Eureka Client的自启动原理和简要过程

    https://blog.csdn.net/u011531425/article/details/81675289 在之前的Spring Cloud Config的基础上,搭建简单的Eureka Se ...

  3. eureka client服务续约源码分析

    必备知识: 1.定时任务 ScheduledExecutorService public class demo { public static void main(String[] args){ Sc ...

  4. 深入理解Eureka - Eureka Client获取注册信息机制

    深入理解Eureka - Eureka Client获取注册信息机 Eureka Client提供了定时获取注册信息的机制.Eureka Client获取注册信息的所有逻辑都在DiscoveryCli ...

  5. spring cloud Eureka client配置(consumer通过Eureka发起对provider的调用)

    参考:http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html springboot版本:2.0.3 ...

  6. 为什么Eureka Client获取服务实例这么慢

    1. Eureka Client注册延迟 Eureka Client启动后不会立即向Eureka Server注册,而是有一个延迟时间,默认为40s 2. Eureka Server更新响应缓存 Eu ...

  7. 2.spring cloud eureka client配置

    红色加粗内容表示修改部分 1.把server项目打成jar包并启动 在项目根目录cmd执行  mvn clean package -Dmaven.test.skip=true mavne仓库地址建议 ...

  8. SpringCloud IDEA 教学 (三) Eureka Client

    写在前头 本篇继续介绍基于Eureka的SpringCloud微服务搭建,回顾一下搭建过程, 第一步:建立一个服务注册中心: 第二步:建立微服务并注入到注册中心: 第三步:建立client端来访问微服 ...

  9. Spring Cloud Eureka 3 (Eureka client注册服务提供者)

    在完成服务注册中心的搭建后我们来尝试下将一个既有的spring boot应用加入eureka的服务治理体系中 新建一个spring boot项目加入eureka client依赖 这里加入的eurek ...

  10. spring boot eureka client

    eureka client @EnableDiscoveryClient @SpringBootApplication public class DemoApplication { public st ...

随机推荐

  1. word20170102日用家电 household appliances

    1. Vacuum cleaner: 吸尘器 2.Cordless vacuum cleaner: 无线吸尘器 3.Robotic vacuum cleaner: 机器人吸尘器 动词:to vacuu ...

  2. opencv基础教程 之 图像基础和绘图

    1,教程:感谢小强 2,用argparse传参数来显示一张图片 #!/usr/bin/python #linux系统 #coding=utf-8 import cv2 import argparse ...

  3. 开源智能英文单词提取翻译工具(C#)

    WordsTool 这个工具用于分析文本文件中所有的英语单词 并且通过内置字典数据库工具对这些单词进行解析 可以生成表格形式 并且支持导出到excel文件中 用于学习单词 本代码禁止商业用途 如需要商 ...

  4. 一个 戴尔 dell 笔记本 bios Preparing to begin setup 问题

    昨天帮亲戚安装系统,是一个dell 笔记本,原本想的很简单,但是在修改了bios里的 SATA 模式后,不但系统启动不了,连bios都进不去了,就像一直在检测一个错误的硬件.google了很多,也没有 ...

  5. (原创)动态内存管理练习 C++ std::vector<int> 模拟实现

    今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自 ...

  6. neo4j-cypher

    cypher查询务必在需要查询的节点上加上标签,否则数据量一大查询就会非常慢(在查询时必须设置实体标签,否则不走索引),另外Neo4j索引做好了查询的优化基本上就完成了80%.需要注意index是建立 ...

  7. The Apache Tomcat installation at this directory is version 8.5.40. A Tomcat 8.0 installation is expected.

    问题描述 Eclipse 配置 Apache Tomcat 8.5.40(8.0.x 以上版本),会报如下错误信息: 解决方法 1)在 Apache Tomcat 的安装目录中找到 lib 目录下的 ...

  8. C# 关于X86/X64/AnyCpu 的关系

    电脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系 ...

  9. git - 1.基础

    配置 C:\Users\Administrator λ git config --global user.name 'tangsansan' C:\Users\Administrator λ git ...

  10. [原创]免固件开发USB2.0 FPGA方案 速度40Mbyte/s+

    USB 2.0接口,实测速度40Mbyte/s: 一个接口实现两种功能(USB2.0+FPGA配置): 免固件开发: 完整的FPGA代码,即拿即用: FPGA逻辑工程师开发USB接口福音: 平台可移植 ...