8.客户端直接调用服务
时间:2019-12-22
本文章向大家介绍8.客户端直接调用服务,主要包括8.客户端直接调用服务使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
TransPoint代码
package Services
import (
"context"
"encoding/json"
"errors"
"net/http"
"strconv"
)
func GetUserInfo_Request(_ context.Context, request *http.Request, r interface{}) error {
user_request := r.(UserRequest)
request.URL.Path += "/user/" + strconv.Itoa(user_request.Uid)
return nil
}
func GetUserInfo_Response(_ context.Context, res *http.Response) (response interface{}, err error) {
if res.StatusCode > 400 {
return nil, errors.New("no data")
}
var user_response UserResponse
err = json.NewDecoder(res.Body).Decode(&user_response)
if err != nil {
return nil, err
}
return user_response, err
}
调用代码
package main
import (
"context"
"fmt"
httptransport "github.com/go-kit/kit/transport/http"
. "gomicro2/Services"
"net/url"
"os"
)
func main() {
tgt,_:=url.Parse("http://127.0.0.1:8080")
//创建一个直连client,这里我们必须写两个func,一个是如何请求,一个是响应我们怎么处理
client:=httptransport.NewClient("GET",tgt,GetUserInfo_Request,GetUserInfo_Response)
/*
func GenUserEnPoint(userService IUserService) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
r := request.(UserRequest) //通过类型断言获取请求结构体
result := "nothings"
if r.Method == "GET" {
result = userService.GetName(r.Uid)
} else if r.Method == "DELETE" {
err := userService.DelUser(r.Uid)
if err != nil {
result = err.Error()
} else {
result = fmt.Sprintf("userid为%d的用户已删除", r.Uid)
}
}
return UserResponse{Result: result}, nil
}
}
*/
getUserInfo:=client.Endpoint() //通过这个拿到了定义在服务端的endpoint也就是上面这段代码return出来的函数,直接在本地就可以调用服务端的代码
ctx:=context.Background()//创建一个上下文
//执行
res,err:=getUserInfo(ctx,UserRequest{Uid:101}) //使用go-kit插件来直接调用服务
if err!=nil{
fmt.Println(err)
os.Exit(1)
}
userinfo:=res.(UserResponse)
fmt.Println(userinfo.Result)
}
原文地址:https://www.cnblogs.com/hualou/p/12080806.html
- 【Go 语言社区】POJ 1047 Round and Round We Go 循环数新解
- 【Go 语言社区】删除redis所有KEY
- 【Go 语言社区】Golang 动态实例化结构体
- 【Go 语言社区】Go 错误处理
- 【Go 语言社区】Go 语言范围(Range)
- 【Go 语言社区】JS 相关---Window Location
- 【Go 语言社区】Go 语言Map(集合)
- 【Go 语言社区】JavaScript Date(日期)对象
- UWP基础教程 - XAML类型转换器
- Oracle 12c Data Guard搭建(一) (r10笔记第57天)
- 【Go 语言社区】Go语言 Cookie的使用
- 【Go 语言社区】HTML5 Geolocation(地理定位)-转
- Oracle 12c PDB迁移(一)(r10笔记第56天)
- 【Go 语言社区】Go worker线程池
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JVM系列之:再谈java中的safepoint
- 《图解算法》第2章 选择排序
- 《图解算法》第3章 递归
- 《图解算法》第4章 快速排序
- 基于H5的Speedtest网速测试工具搭建
- Phaser类在性能测试中应用
- Mockito框架Mock Void方法
- 未来的神器fiddler Everywhere
- Sentinel整合Apollo进行规则持久化
- DevTools(Chrome 85)的新功能
- 在Node.js中处理Zip文件
- 构建一个带身份验证的 Deno 应用
- Sentinel整合Apollo进行规则持久化(二)
- Sentinel整合Apollo进行规则持久化(三)
- BeesCMS的SQL注入漏洞