Eureka-Client(Golang实现)
Eureka-Client
Golang实现eureka-client
原理
根据Java版本的源码,可以看出client主要是通过REST请求来与server进行通信。
Java版本的核心实现:com.netflix.discovery.DiscoveryClient
。
其中主要逻辑如下:
- client启动时注册信息到server
- 定时心跳、刷新服务列表,主要是两个线程池:
heartbeatExecutor
、cacheRefreshExecutor
- 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地址
说明
未在生产中使用,只是想把Golang的服务与Java的Spring Cloud结合起来玩耍。
Just for fun!
Eureka-Client(Golang实现)的更多相关文章
- 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)
目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...
- 第一个Eureka程序,Eureka Client的自启动原理和简要过程
https://blog.csdn.net/u011531425/article/details/81675289 在之前的Spring Cloud Config的基础上,搭建简单的Eureka Se ...
- eureka client服务续约源码分析
必备知识: 1.定时任务 ScheduledExecutorService public class demo { public static void main(String[] args){ Sc ...
- 深入理解Eureka - Eureka Client获取注册信息机制
深入理解Eureka - Eureka Client获取注册信息机 Eureka Client提供了定时获取注册信息的机制.Eureka Client获取注册信息的所有逻辑都在DiscoveryCli ...
- spring cloud Eureka client配置(consumer通过Eureka发起对provider的调用)
参考:http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html springboot版本:2.0.3 ...
- 为什么Eureka Client获取服务实例这么慢
1. Eureka Client注册延迟 Eureka Client启动后不会立即向Eureka Server注册,而是有一个延迟时间,默认为40s 2. Eureka Server更新响应缓存 Eu ...
- 2.spring cloud eureka client配置
红色加粗内容表示修改部分 1.把server项目打成jar包并启动 在项目根目录cmd执行 mvn clean package -Dmaven.test.skip=true mavne仓库地址建议 ...
- SpringCloud IDEA 教学 (三) Eureka Client
写在前头 本篇继续介绍基于Eureka的SpringCloud微服务搭建,回顾一下搭建过程, 第一步:建立一个服务注册中心: 第二步:建立微服务并注入到注册中心: 第三步:建立client端来访问微服 ...
- Spring Cloud Eureka 3 (Eureka client注册服务提供者)
在完成服务注册中心的搭建后我们来尝试下将一个既有的spring boot应用加入eureka的服务治理体系中 新建一个spring boot项目加入eureka client依赖 这里加入的eurek ...
- spring boot eureka client
eureka client @EnableDiscoveryClient @SpringBootApplication public class DemoApplication { public st ...
随机推荐
- 2018-2019-2 网络对抗技术 20165231 Exp2 后门原理与实践
实验内容 1.使用netcat获取主机操作Shell,cron启动 2.使用socat获取主机操作Shell, 任务计划启动 3.使用MSF meterpreter(或其他软件)生成可执行文件,利用n ...
- Appnium-API-Dvice
Device Activity Start Activity Start an Android activity by providing package name and activity name ...
- 龙芯yl8089无声音的解决方案
网上搜索到的解决方法都是卸载pulseaudio,但这种方法比较暴力不能从根本上解决问题. 经过一段时间的排查,我发现最终问题出现在resample-method上. 由于内核内CS5536 AC97 ...
- 记录一个pom文件
rt <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://m ...
- nginx代理 (带着请求头)
当你获得云服务器之后, 你有这样一个需求:当你要访问一个url的时候,这个URL只能在人家的云服务器上访问(比如百度),所以你要买百度的BCC,你可能在想在BCC起服务,那样有点麻烦,直接使用ngin ...
- 网络流24题——魔术球问题 luogu 2765
题目描述:这里 这道题是网络流问题中第一个难点,也是一个很重要的问题 如果直接建图感觉无从下手,因为如果不知道放几个球我就无法得知该如何建图(这是很显然的,比如我知道 $1+48=49=7^2$ ,可 ...
- 认识 Linux 文件权限
Linux 之所以是比较安全的操作系统,和它丰富的文件权限设定是有关系的,学习 Linux 操作系统一定要懂文件的权限识别和设置.通过这篇博文我们了解 Linux 操作系统的文件权限. 拥有者 / ...
- 论文阅读笔记五十一:CenterNet: Keypoint Triplets for Object Detection(CVPR2019)
论文链接:https://arxiv.org/abs/1904.08189 github:https://github.com/Duankaiwen/CenterNet 摘要 目标检测中,基于关键点的 ...
- Javascript执行上下文和执行栈
什么是执行上下文? 执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,JavaScript中运行任何的代码都是在执行上下文. 什么是执行栈? 执行栈,在其他编程语言中也被叫做 ...
- C#控制台或应用程序中两个多个Main()方法的设置
大多数初级程序员或学生都认为在C#控制台或应用程序中只能有一个Main()方法.但是事实上是可以有多个Main()方法的. 在C#控制台或应用程序中,在多个类中,且每个类里最多只能存在一个Main() ...