目的

1 主进程为nodejs 进程,为了给nodejs 进程提供计算心率hrv服务,制作该微服务进程,占用一个端口
2 利用go服务携程进行概率计算服务,不占用nodejs主进程

2 图示结构

2.1步骤如下

a 从传感器传入数据,接收到数据以后存储
b 需要计算的时候调用算法服务

2.2 如下图所示

3 微服务制作

3.1 充分利用go语言携程功能,制作sdnn心率计算包

hrv 5 min RR 间期 平均值标准差 sdann
24h 正常的RR间期总体标准差 sdnn
24h 每5分钟时段 标准差的平均值 sdnn index
两个相邻RR间期 差值的均方根RMSSD
24h 相邻两个正常RR 间期差值 大于50ms 的个数百分比pnn50
主要计算公式如下

3.2 制作http服务示例

写好mode包模式,go.mode 内容如下
module hrv
go 1.15
require github.com/garyburd/redigo v1.6.3

制作数据结构

如下,心率数据和时间,姓名

type Data struct {Heart intTime  intName  string
}type Cmd struct {Type intData []Data
}

携程函数示例

func calculate1(cmd *Cmd, w http.ResponseWriter) {//in1 := []float32{71, 72, 69, 70, 65, 74}size := len(cmd.Data)var in []float32 = make([]float32, size)for i, v := range cmd.Data {in[i] = (float32)(v.Heart)}//标准差函数在sdnn包里面ret := sdnn.Get_Stddev(in)fmt.Fprintf(w, "%f", ret)//
}

启动函数的时候这样写
go calculate(cmd,w)
这样没接收到一个任务以后,都会启动携程处理,然后返回结果

package mainimport ("encoding/json""fmt""hrv/sdnn""html""io/ioutil""log""net/http"
)type Data struct {Heart intTime  intName  string
}type Cmd struct {Type intData []Data
}// 创建一个错误处理函数,避免过多的 if err != nil{} 出现
func dropErr(e error) {if e != nil {panic(e)}
}
func calculate1(cmd *Cmd, w http.ResponseWriter) {//in1 := []float32{71, 72, 69, 70, 65, 74}size := len(cmd.Data)var in []float32 = make([]float32, size)for i, v := range cmd.Data {in[i] = (float32)(v.Heart)}ret := sdnn.Get_Stddev(in)fmt.Fprintf(w, "%f", ret)//
}
func main() {runtime.GOMAXPROCS(4)http.HandleFunc("/hrv", func(w http.ResponseWriter, r *http.Request) {fmt.Println(html.EscapeString(r.URL.Path))if r.Method == "POST" {b, err := ioutil.ReadAll(r.Body)if err != nil {log.Println("Read failed:", err)}defer r.Body.Close()cmd := &Cmd{}err = json.Unmarshal(b, cmd)if err != nil {log.Println("json format error:", err)}//携程处理go calculate1(cmd, w)log.Println("cmd:", string(b))log.Println("cmd:", cmd.Data[0])//w.ResponseWriter("1")} else {log.Println("not support")w.WriteHeader(405)return}})fmt.Println("server lister at 8080")log.Fatal(http.ListenAndServe(":8080", nil))}

为了充分利用多核,我们可以设定并发携程处理器个数
runtime.GOMAXPROCS(4)

测试client

package mainimport ("bytes""fmt""io/ioutil""net/http"
)type Data struct {Heart intTime  intName  string
}
type Cmd struct {Type intData []Data
}func main() {str := `{"Type":1,"Data":[{"Heart":78,"Time":678,"Name":"qianbo"},{"Heart":75,"Time":679,"Name":"guanzhi"},{"Heart":69,"Time":679,"Name":"guanzhi"},{"Heart":72,"Time":679,"Name":"guanzhi"},{"Heart":73,"Time":679,"Name":"guanzhi"},{"Heart":70,"Time":679,"Name":"guanzhi"}]}`//var arr [2]Data//json.Unmarshal([]byte(str), &s)// data := make(map[string]interface{})// data["Name"] = "qianbo"// data["Heart"] = 67// data["Time"] = 778// D := make(map[string]interface{})// D["Type"] = 1// D["Data"] = data// bytesData, err := json.Marshal(D)// if err != nil {//     fmt.Println(err.Error())//  return// }// reader := bytes.NewReader(bytesData)//request, err := http.NewRequest("POST", url, reader)url := "http://127.0.0.1:8080/hrv"var jsonStr = []byte(str)request, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))if err != nil {fmt.Println(err.Error())return}request.Header.Set("Content-Type", "application/json;charset=UTF-8")client := http.Client{}resp, err := client.Do(request)if err != nil {fmt.Println(err.Error())return}body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err.Error())return}fmt.Println(string(body))}

运行服务器
go run main.go

运行客户端测试
go run post.go
返回结果如下:

使用go制作微服务数据计算相关推荐

  1. 使用c++制作微服务计算服务

    其他链接 上次使用了go来制作微服务计算服务 go制作微服务计算服务 c++制作标准差服务计算 使用c++的计算服务速度是更快的,一下只是一个计算标准差的函数样例,和go服务之间进行交换可以使用更简单 ...

  2. 分布式场景实战第六节 微服务数据治理方案

    16 数据一致性:下游服务失败上游服务如何独善其身? 前面三讲我们聊了微服务的 9 个痛点,有些痛点没有好的解决方案,而有些痛点刚好有一些对策,后面的课程我们就来讲解某些痛点对应的解决方案. 这一讲我 ...

  3. 小程聊微服务-数据抽取那点事(一)

    一.前言 我们在<微服务是在双刃剑 http://blog.csdn.net/u013970991/article/details/73195907 >中提到了当我们将应用服务化以后,很多 ...

  4. 【2017年第3期】交通大数据:一种基于微服务的敏捷处理架构设计

    杜圣东, 杨燕, 滕飞 西南交通大学信息科学与技术学院,四川 成都 610031 摘要:面对智慧交通广泛的大数据应用场景和技术需求,一般大数据系统难以适应多种处理情况并做出快速响应.针对这一问题,首次 ...

  5. Dockerfile制作jdk镜像和微服务镜像部署的最佳实践【Dockerfile实战】

    因为公司之前搭建测试服务器是我搭建的,其中包含使用docker来部署微服务项目,于是将这篇Dockerfile的最佳实践记录于此,为避免大家被坑,希望此文能帮你解除疑惑~ ps:因为是公司服务器不是个 ...

  6. 如何在微服务架构下进行数据设计?

    作者:唐建法 && Mongoing中文社区 来自:http://www.mongoing.com/ 微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微 ...

  7. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  8. 一文详解微服务架构的数据设计

    微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务这些方面. 本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方,旨在帮助大家在构建微服务架构 ...

  9. 一文透析 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

最新文章

  1. 关于ASP.Net的导入导出的[转]
  2. python众数问题给定含有n个元素的多重集合s_2-1 问题描述:给定含有n个元素的多重集合S - 下载 - 搜珍网...
  3. stl中Priority Queues(优先队列)的基本用法
  4. mysql 递归_「MySQL」 - SQL Cheat Sheet - 未完成
  5. mysql的配置实现远程访问_MySQL 远程连接配置的正确实现 | 学步园
  6. cognos报表导出excel_有了这个报表工具,一键生成自定义的各种报表,还可以导出Excel...
  7. win2003 apache php5.4 mysql_【php】在Windows2003下配置Apache2.4与php5.4
  8. SDL 1.2.14在windows平台下的编译及例子
  9. 甲骨文通知用户需付费取得 Java 8 更新
  10. Linux服务器的那些性能参数指标
  11. python数据分析有哪些模型-python数据挖掘的基本流程有哪些?
  12. 手扎20190521——bolg示例
  13. vue和php前后端分离
  14. ue快捷键一览 UltraEdit (UE) 快捷键 ue 复制并粘贴当前行
  15. 清除缓存-Ctrl+Shift+Delete
  16. B树与B+树的特点、区别及优点
  17. 微信小程序-自定义导航栏及返回上一级页面的实现
  18. jquery的运行机制
  19. 教你批量消除视频原声,一学就会
  20. 数仓建模—用户旅程地图

热门文章

  1. CNN_TensorFlow图像分类代码
  2. Python项目:用微信自动给女朋友每天一句英语问候
  3. script地下状态栏效果
  4. 转载一篇杨澜的演讲稿——关于孩子的想象力创造力
  5. 罗永浩:因为要烧投资人的钱 所以没有勇气再做手机了
  6. 豆瓣再被约谈处罚150万!一年被罚20次,豆瓣到底怎么了?
  7. 蔚来、威马抢装的英伟达Orin,正成为高端智能车标配
  8. 京东618期间将累计发放百亿消费券
  9. 官宣了!百度36亿美元收购YY直播,一个用户“值”87.4美元
  10. 潮流电商平台毒App正式改名了!