Go-Micro基本方式调用http api
简介Go-Micro基本方式调用http api
            1、最基本的方式,通过服务发现进行调用http api
package main
import (
    "fmt"
    "github.com/micro/go-micro/client/selector"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-plugins/registry/consul"
    "io/ioutil"
    "log"
    "net/http"
)
//基本方式调用服务
func baseCallApi(address string, path string, method string) (string, error) {
    url := "http://" + address + path
    println("请求地址:", url)
    req, err := http.NewRequest(method, url, nil)
    if err != nil {
        log.Fatal(err)
    }
    client := http.DefaultClient
    rsp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer rsp.Body.Close()
    buf, _ := ioutil.ReadAll(rsp.Body)
    return string(buf), nil
}
func main() {
    registry := consul.NewRegistry(func(options *registry.Options) {
        options.Addrs = []string{
            "192.168.1.171:8500",
            "192.168.1.177:8500",
            "192.168.1.178:8500",
        }
    })
    //获取服务
    services, err := registry.GetService("gin-web")
    if err != nil {
        log.Fatal(err)
    }
    next := selector.Random(services) //随机从服务中获取
    //next := selector.RoundRobin(services) //轮询算法
    node, err := next()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("NODE ID:", node.Id)
    fmt.Println("ADDRESS:", node.Address)
    fmt.Println("METADATA:", node.Metadata)
    result, err := baseCallApi(node.Address, "/", "GET")
    if err != nil {
        log.Fatal(err)
    }
    println(result)
    result, err = baseCallApi(node.Address, "/version", "GET")
    if err != nil {
        log.Fatal(err)
    }
    println(result)
}
2、使用插件调用
github.com/micro/go-plugins/client/http
首先我们对注册的服务进行改造
package main
import (
    "github.com/gin-gonic/gin"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/web"
    "github.com/micro/go-plugins/registry/consul"
    "strconv"
)
//学生类型
type StudentType struct {
    Name   string
    Number int64
}
//请求
type RequestType struct {
    Number int `json:"number"`
}
func main() {
    //注册
    registry := consul.NewRegistry(func(options *registry.Options) {
        options.Addrs = []string{
            "192.168.1.171:8500",
            "192.168.1.177:8500",
            "192.168.1.178:8500",
        }
    })
    routers := gin.Default()
    routers.GET("/", func(context *gin.Context) {
        context.JSON(200, map[string]interface{}{
            "name": 1,
        })
    })
    routers.GET("/version", func(context *gin.Context) {
        context.JSON(200, map[string]interface{}{
            "version": "1.0.0",
        })
    })
    routers.POST("/lists", func(context *gin.Context) {
        var req RequestType
        err := context.Bind(&req)
        if err != nil {
            context.JSON(200, gin.H{
                "status": 200,
                "data":   err.Error(),
            })
            return
        }
        var students []*StudentType
        for i := 1; i <= req.Number; i++ {
            students = append(students, &StudentType{
                Name:   "name_" + strconv.Itoa(i),
                Number: int64(i),
            })
        }
        context.JSON(200, gin.H{
            "status": 200,
            "data":   students,
        })
    })
    server := web.NewService(
        web.Name("gin-web"),    //服务名称
        web.Registry(registry), //注册到服务
        //web.Address(":8080"),//这个可以不写,最好使用配置文件进行配置
        web.Handler(routers),
    )
    server.Init() //加了这句就可以使用命令行的形式去设置我们一些启动的配置
    server.Run()
}
对客户端进行改造:
package main
import (
    "context"
    "fmt"
    "github.com/micro/go-micro/client"
    "github.com/micro/go-micro/client/selector"
    "github.com/micro/go-micro/registry"
    goMicroHttp "github.com/micro/go-plugins/client/http"
    "github.com/micro/go-plugins/registry/consul"
    "io/ioutil"
    "log"
    "net/http"
)
//基本方式调用服务
func baseCallApi(address string, path string, method string) (string, error) {
    url := "http://" + address + path
    println("请求地址:", url)
    req, err := http.NewRequest(method, url, nil)
    if err != nil {
        log.Fatal(err)
    }
    client := http.DefaultClient
    rsp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer rsp.Body.Close()
    buf, _ := ioutil.ReadAll(rsp.Body)
    return string(buf), nil
}
//插件方式调用服务
func callApi(selector selector.Selector) {
    myClient := goMicroHttp.NewClient(
        client.Selector(selector),
        client.ContentType("application/json"),
    )
    req := myClient.NewRequest("gin-web", "/lists", map[string]interface{}{"number": 5})
    var resp map[string]interface{}
    err := myClient.Call(context.Background(), req, &resp) //发起请求调用,并返回结果
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp)
}
func main() {
    registry := consul.NewRegistry(func(options *registry.Options) {
        options.Addrs = []string{
            "192.168.1.171:8500",
            "192.168.1.177:8500",
            "192.168.1.178:8500",
        }
    })
    s := selector.NewSelector(
        selector.Registry(registry),
        selector.SetStrategy(selector.RoundRobin),
    )
    callApi(s)
}
3、使用proto构造参数进行调用
新增proto目录,进入proto目录,新增model.proto文件,内容如下:
syntax = "proto3";
message StudentModel {
    string name = 1;
    int32 number = 2;
}
message StudentRequest {
    int32 number = 1;
}
message StudentsResponse {
    int32 status = 1;
    repeated StudentModel data = 2;
}
生成命令:
protoc --go_out=./ model.proto
修改客户端:
package main
import (
    "context"
    "fmt"
    "github.com/micro/go-micro/client"
    "github.com/micro/go-micro/client/selector"
    "github.com/micro/go-micro/registry"
    goMicroHttp "github.com/micro/go-plugins/client/http"
    "github.com/micro/go-plugins/registry/consul"
    "io/ioutil"
    "log"
    model "micro-api/proto"
    "net/http"
)
//基本方式调用服务
func baseCallApi(address string, path string, method string) (string, error) {
    url := "http://" + address + path
    println("请求地址:", url)
    req, err := http.NewRequest(method, url, nil)
    if err != nil {
        log.Fatal(err)
    }
    client := http.DefaultClient
    rsp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer rsp.Body.Close()
    buf, _ := ioutil.ReadAll(rsp.Body)
    return string(buf), nil
}
//插件方式调用服务
func callApi(selector selector.Selector) {
    myClient := goMicroHttp.NewClient(
        client.Selector(selector),
        client.ContentType("application/json"),
    )
    req := myClient.NewRequest("gin-web", "/lists", model.StudentRequest{Number: 10})
    var resp model.StudentsResponse
    err := myClient.Call(context.Background(), req, &resp) //发起请求调用,并返回结果
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp.Status)
    fmt.Println(resp.Data)
}
func main() {
    registry := consul.NewRegistry(func(options *registry.Options) {
        options.Addrs = []string{
            "192.168.1.171:8500",
            "192.168.1.177:8500",
            "192.168.1.178:8500",
        }
    })
    s := selector.NewSelector(
        selector.Registry(registry),
        selector.SetStrategy(selector.RoundRobin),
    )
    callApi(s)
}
 如果在使用Gin框架编写web应用程序中,如果里面包含了模板文件和静态文件,我们如何进行打包呢?本文主要记录该操作。
如果在使用Gin框架编写web应用程序中,如果里面包含了模板文件和静态文件,我们如何进行打包呢?本文主要记录该操作。 nodejs中使用npm和yarn,使用最新阿里云镜像 aliyun mirror,网上很多还是文章用的是下面这个地址~~yarn config set registry https://registry.npm.taobao.org~~
nodejs中使用npm和yarn,使用最新阿里云镜像 aliyun mirror,网上很多还是文章用的是下面这个地址~~yarn config set registry https://registry.npm.taobao.org~~ 《是妈妈是女儿》聚焦母女间未曾言明的爱意,以书信对话的形式呈现出各自的内心独白,表达彼此的牵挂。黄绮珊与希林娜依·高用跨越时空、打开心扉、深情对唱的形式,将天下母女爱的寄语化作心灵的倾诉。黄绮珊的每一句话,每一个字都演绎出了妈妈对女儿的爱,而希林依娜·高把女儿对妈妈的爱由不理解到理解再到感恩演绎得淋漓尽致。
《是妈妈是女儿》聚焦母女间未曾言明的爱意,以书信对话的形式呈现出各自的内心独白,表达彼此的牵挂。黄绮珊与希林娜依·高用跨越时空、打开心扉、深情对唱的形式,将天下母女爱的寄语化作心灵的倾诉。黄绮珊的每一句话,每一个字都演绎出了妈妈对女儿的爱,而希林依娜·高把女儿对妈妈的爱由不理解到理解再到感恩演绎得淋漓尽致。 Towxml 是一个让小程序(微信/QQ)可以解析Markdown、HTML的解析库。能够使小程序完美解析Markdown内容。
Towxml 是一个让小程序(微信/QQ)可以解析Markdown、HTML的解析库。能够使小程序完美解析Markdown内容。 Editor.md 是一个可嵌入的开源 Markdown 在线编辑器组件,你可以很方便用在浏览器、NW.js(Node-webkit)等地方,基于CodeMirror、jQuery 和 Marked 构建。
Editor.md 是一个可嵌入的开源 Markdown 在线编辑器组件,你可以很方便用在浏览器、NW.js(Node-webkit)等地方,基于CodeMirror、jQuery 和 Marked 构建。 快速生成表格
快速生成表格 Electron页面跳转、浏览器打开链接和打开新窗口
Electron页面跳转、浏览器打开链接和打开新窗口 Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题 在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。 在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。