hprose

Go语言开发的微服务框架

喜你入骨 提交于 2020-04-09 05:35:04
 Go语言开发的微服务框架有什么?   1、项目名称:Istio   项目简介:Istio是由Google、IBM和Lyft开源的微服务管理、保护和监控框架。使用istio可以很简单的创建具有负载均衡、服务间认证、监控等功能的服务网络,而不需要对服务的代码进行任何修改。   2、项目名称:Go-kit   项目简介:Go-kit 是一个 Go 语言的分布式开发包,用于开发微服务。   3、项目名称:Jaeger   项目简介:Jaeger是Uber的分布式跟踪系统 ,基于google dapper的原理构建, 以Cassandra作为存储层。   4、项目名称:Micro   项目简介:Micro是一个专注于简化分布式系统开发的微服务生态系统。可插拔的插件化设计,提供强大的可插拔的架构来保证基础组件可以被灵活替换。   5、项目名称:fabio 项目简介:fabio 是 ebay 团队用 golang 开发的一个快速、简单零配置能够让 consul 部署的应用快速支持 http(s) 的负载均衡路由器。   6、项目名称:Goa   项目简介:Goa 是一款用 Go 用于构建微服务的框架,采用独特的设计优先的方法。   7、项目名称:gizmo   项目简介:gizmo是纽约时报开源的go微服务工具,提供如下特性:标准化配置和日志;可配置策略的状态监测端点;用于管理 pprof

golang json.Marshal interface 踩坑

拜拜、爱过 提交于 2020-03-09 12:53:44
Golang 使用 hprose 调用 php 接口,各种类型不确定,用了好多interface,然后发现了 json.Marshal 在处理map类型的时候,key 不能是 interface,否则就会报错 package main import ( "encoding/json" "fmt" ) func main() { m := make(map[interface{}]interface{}) m["k1"] = "ddd" m["k2"] = "ddd" b, err := json.Marshal(m) if err != nil { fmt.Println(err) return } fmt.Println(string(b)) } 输出 json: unsupported type: map[interface {}]interface {} 怎么办呢? 还能怎么办,只能不用 interface 做 key 。 如果遇到接口返回的 key 是 interface 的情况,在输出的时候,用断言判断他的类型,转成正常的 map 或者 struct switch i.(type) { case int: v = strconv.Itoa(i.(int)) case string: v = k.(string) …… } 类似这种写法,哦,有点恶心。 更多架构、PHP

Hprose开源的高性能远程对象服务引擎

旧时模样 提交于 2020-02-29 13:21:02
Hprose是 andot 开发的一套开源的高性能远程对象服务 引擎(High Performance Remote Object Service Engine)。非常易用,而且性能极佳,对传统WebService和RPC有性能或跨平台意见的同学可以用用,因为作者把市面上流行的几种语言、框架 都做了支持,如:php、go、ruby、python、nodejs、object-c、AAutor Quicker、ActionScript、ASP、Hack、Delphi、javascript、java、.NET、dart、D、Perl、 swift、lua、cpp等。你可以在 https://github.com/hprose 找到它们。大家可以在 http://hprose.com/ 了解更多,提供对以下语言的支持。 相关案例: 延吉新闻网 延吉新闻网(www.yanjinews.com)是由中共延吉市委、延吉市人民政府主办,中共延吉市委宣传部承办,延吉市互联网信息中心运营的延边地区 最具有新闻权威性的新闻门户网站,是延边朝鲜族自治州的权威主流媒体,我们的新闻主要汇集了延边州内、延吉本市、省内、国内、国际及各专题新闻,并将陆续 开设汽车、房产、IT数码、健康、美食、朝鲜族、信息、教育、婚嫁、便民、旅游、论坛等各类频道,做延边综合门户网,延边人的网上家园,点击延吉新闻网、 掌握延边新动向。

序列化和反序列化浅析

杀马特。学长 韩版系。学妹 提交于 2019-12-01 12:36:25
简介 序列化和反序列化对于现代的程序员来说是一个既熟悉又陌生的概念。说熟悉是因为几乎每个程序员在工作中都直接或间接的使用过它,说陌生是因为大多数程序员对序列化和反序列化的认识仅仅停留在比较一下各种不同实现的序列化的性能上面,而很少有程序员对序列化和反序列化的设计和实现有深入的研究。 本文将从序列化和反序列化的设计和实现的入手,来简单讲解一下序列化和反序列化。其中包括以下几个方面: 序列化和反序列化的作用 什么样的数据是可序列化的 序列化和反序列化的分类 序列化和反序列化的类型映射 本文不会涉及到某几种语言的某几种序列化实现的性能对比之类的内容。 序列化和反序列化的作用 我们在编写程序代码时,通常会定义一些常量和变量,然后再写一堆操作它们的指令。不管是变量还是常量,它们表示的都是数据。所以简单的说,一个程序就是一堆指令操作一堆数据。 但是为了更有效的管理这堆数据,现代的程序设计语言都会引入一个类型系统来对这些数据进行分类管理,而不是让程序员把所有数据都一股脑的当做二进制串来进行操作。 比如一个常量可能是一个数字,一个布尔值,一个字符串,或者是一个由它们构成的数组。而变量通常具有更丰富的类型可以使用。甚至你还可以自定义类型。对于面向对象的语言来说,一个类型表示的不仅仅是数据本身,还包括了对这种类型数据的一组操作。 一个程序可以以源码或者可执行的二进制形式保存在磁盘(或者其它存储介质)上

在 PHP 中使用 Promise + co/yield 协程

扶醉桌前 提交于 2019-12-01 06:21:49
为什么需要异步方式 一个函数执行之后,在它后面顺序编写的代码中,如果能够直接使用它的返回结果或者它修改之后的引用参数,那么我们通常认为该函数是同步的。 而如果一个函数的执行结果或者其修改的引用参数,需要通过设置回调函数或者回调事件的方式来获取,而在其后顺序编写的代码中无法直接获取的话,那么我们通常认为这样的函数是异步的。 PHP 提供的大部分函数都是同步的。通常我们会有一个误解,那就是容易把同步和阻塞当成同一个概念,但实际上同步代码不一定都是阻塞的,只是同步代码对阻塞天然友好,当同步代码和阻塞结合时,代码通常是简单易懂的。 阻塞带来的问题是当前线程(或进程)会陷入等待,一直等到阻塞结束,这样就会造成线程(或进程)资源的浪费。所以,通常认为阻塞是不够高效的。 但是如果要编写非阻塞代码,使用同步方式会变得有些复杂,且不够灵活。同步方式的非阻塞代码通常会使用 select 模式,例如 curl_multi_select , stream_select , socket_select 等就是 PHP 中提供的一些典型的 select 模式的函数。 我们说它复杂且不够灵活是有理由的,例如使用上面的 select 模式编写同步的非阻塞代码时,我们需要先构造一个并发任务的列表,之后手动构造循环来执行这些并发的任务,在循环开始之后,虽然这几个任务可以并发

如何在微信小程序中使用 Hprose(三)

家住魔仙堡 提交于 2019-12-01 06:21:39
Hprose 技术交流群:48855729 如何在微信小程序中使用 Hprose 如何在微信小程序中使用 Hprose(二) 书接上回,上一回中我们讲到 Hprose 提供的协程可以让 Hprose 的异步调用同步化。但是在最后的例子中,有一个小的细节,不知道你有没有注意到,就是程序的最后,我们使用了这样的代码: this.setData({ userInfo: yield app.getUserInfo }); 将原本复杂的通过异步调用来设置 setData 的过程同步化了。这是因为 hprose 提供了的协程,可以 yield 单参数回调方法的函数,并将回调方法的参数作为该 yield 调用的返回值。从而避免了 that 和 this 之间的转换,也避免了写回调函数。 但是 hprose 的所提供对协程的支持不止于此,hprose 还将 wx 的所有 API 都封装到了 hprose.wx 下面,将需要使用回调方式的 API 封装成了返回 promise 对象的 API,通过这种封装,所有这些 API,就都可以使用 co/yield 方式同步调用了。 例如微信官方例子中,上传文件的例子是这样的: wx.chooseImage({ success: function(res) { var tempFilePaths = res.tempFilePaths wx

如何在微信小程序中使用 Hprose(二)

这一生的挚爱 提交于 2019-12-01 06:21:20
Hprose 技术交流群:48855729 如何在微信小程序中使用 Hprose 书接上文。 这次仍然是下载 hprose-wx ,或者从 开源中国的 Git 服务器镜像 下载。 这次我们发现 dist 目录下多了一个文件: regenerator-runtime.js 现在我们把它也下载下来,放在上一篇文章里说的那个微信小程序的 utils 目录下。 接下来,打开 pages/index/index.js 文件。 在开头加上: var hprose = require('../../utils/hprose.js'); var co = hprose.co; var regeneratorRuntime = require("../../utils/regenerator-runtime.js"); 第一句是引入 hprose。 第二句引入的 co 是 hprose 中实现的协程,后面我们重点讲的就是它。 第三句引入了一个 regeneratorRuntime ,这个又是干啥的呢?因为微信小程序的执行环境是 ES5 的,但是协程本身是 ES6 中才有的实现,所以呢,想直接用,是没有的。 但是呢,微信小程序开发环境提供了一个开启 ES6 转 ES5 的选项: 打开这个选项呢,ES6 的协程代码就自动转换成 ES5 的代码了,但是转换之后的代码其实是需要引用一个库的,这个库就是

秒杀 tj/co 的 hprose 协程库

妖精的绣舞 提交于 2019-11-30 01:13:07
tj/co 有以下几个方面的问题: 首先, tj/co 库中的 yield 只支持 thunk 函数,生成器函数,promise 对象,以及数组和对象,但是不支持普通的基本类型的数据,比如 null , 数字,字符串等都不支持。这对于 yield 一个类型不确定的变量来说,是很不方便的。而且这跟 await 也是不兼容的。 其次,在 yield 数组和对象时, tj/co 库会自动对数组中的元素和对象中的字段递归的遍历,将其中的所有的 Promise 元素和字段替换为实际值,这对于简单的数据来说,会方便一些。但是对于带有循环引用的数组和对象来说,会导致无法获取到结果,这是一个致命的问题。即使对于不带有循环引用结构的数组和对象来说,如果该数组和对象比较复杂,这也会消耗大量的时间。而且这跟 await 也是不兼容的。 再次,对于 thunk 函数, tj/co 库会认为回调函数第一个参数必须是表示错误,从第二个参数开始才表示返回值。而这对于回调函数只有一个返回值参数的函数,或者回调函数的第一个参数不表示错误的函数来说, tj/co 库就无法使用了。 而 hprose.co 对 yield 的支持则跟 await 完全兼容,支持对所有类型的数据进行 yield 。 当 hprose.co 对 chunk 函数进行 yield 时,如果回调函数第一个参数是 Error

基于hprose-golang创建RPC微服务

£可爱£侵袭症+ 提交于 2019-11-27 02:11:10
Hprose (High Performance Remote Object Service Engine) 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。 官网:https://hprose.com/ 本文将讲解如何使用 Hprose go 服务端编写一个微服务,并实现客户端调用。 本文的涉及的项目代码托管在github:https://github.com/52fhy/hprose-sample 。 使用Go实现服务端 初始化 git初始化: git init echo "main" >> .gitignore echo "# hprose-sample" >> README.md 项目使用 go mod 管理依赖,请确保安装的Go版本支持该命令。先初始化 go.mod 文件: go mod init sample 最终项目目录结构一览: ├── config │ └── rd.ini ├── dao ├── main.go ├── model └── util ├── config.go └── state.go ├── service │ └── sample.go ├── go.mod ├── go.sum ├── client_test.go ├── README.md ├── php ├── logs