Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang实现http2.0服务端,客户端完整案例

golang实现http2.0服务端,客户端完整案例

作者头像
公众号-利志分享
发布于 2022-04-25 01:41:05
发布于 2022-04-25 01:41:05
5.2K00
代码可运行
举报
文章被收录于专栏:利志分享利志分享
运行总次数:0
代码可运行

为了学习golang的client源码执行流程,所以笔者通过golang实现http2的服务端和客户端,然后通过单步调试学习源码。下面我们看下整个golang实现http2的服务步骤。

1 生成公钥私钥文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl req -newkey rsa:2048 -nodes -keyout private.pem -x509 -days 365 -out certificate.pem

private.pem:服务端私钥

certificate.pem:证书文件

2 实现server端代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "golang.org/x/net/http2"
    "golang.org/x/net/http2/h2c"
    "log"
    "net/http"
    "os"
)

func main() {
    path, _ := os.Getwd()
    handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello world")
        fmt.Fprintf(w, "Protocol: %s\n", r.Proto)
    })
    h2s := &http2.Server{
        // ...
    }
    h1s := &http.Server{
        Addr:    ":8080",
        Handler: h2c.NewHandler(handler, h2s),
    }
    log.Fatal(h1s.ListenAndServeTLS(path+"\\certificate.pem", path+"\\private.pem"))
}

3 实现客户端代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "golang.org/x/net/http2"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "time"
)

var url = "https://localhost:8080"

func main() {
    request2()
}

func request2() {
    path, _ := os.Getwd()
    client := &http.Client{
        Timeout: 100 * time.Millisecond,
    }
    //读取证书文件,正式环境无读取证书文件,因为本地测试是无法认证证书
    caCert, err := ioutil.ReadFile(path + "\\http_connect\\certificate.pem")
    if err != nil {
        log.Fatalf("Reading server certificate: %s", err)
        return
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)
    //tls协议配置,InsecureSkipVerify认证证书是否跳过
    tlsConfig := &tls.Config{
        RootCAs: caCertPool,
        //设置安全跳跃认证
        InsecureSkipVerify: true,
    }
    client.Transport = &http2.Transport{
        TLSClientConfig: tlsConfig,
    }
    resp, err := client.Get(url)
    if err != nil {
        fmt.Printf("Failed get: err:%s \n", err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("Failed reading response body: %s\n", err)
        return
    }
    fmt.Printf("Get request2 response %d: %s %s\n", resp.StatusCode, resp.Proto, string(body))
}

//http1请求
func request1() {
    //http1
    _, err := http.Get(url)
    fmt.Println(err)
}

//http11请求
func request11() {
    path, _ := os.Getwd()
    client := &http.Client{}
    //证书文件
    caCert, err := ioutil.ReadFile(path + "\\certificate.pem")
    if err != nil {
        log.Fatalf("Reading server certificate: %s", err)
        return
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)
    // Create TLS configuration with the certificate of the server
    tlsConfig := &tls.Config{
        RootCAs: caCertPool,
        //设置安全跳跃认证
        InsecureSkipVerify: true,
    }
    client.Transport = &http.Transport{
        TLSClientConfig: tlsConfig,
    }
    resp, err := client.Get(url)
    if err != nil {
        log.Fatalf("Failed get: %s", err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Failed reading response body: %s", err)
        return
    }
    fmt.Printf("Got response %d: %s %s\n", resp.StatusCode, resp.Proto, string(body))
}

问题总结:

报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 x509: certificate is not valid for any names, but wanted to match localhost

是http2请求安全认证不过,通过设置如下参数来实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置安全跳跃认证
InsecureSkipVerify: true,
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go-https的简单实现
X.509 Certificate Signing Request (CSR) Management.
fnatic
2022/07/22
24.7K0
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
本篇教程我们将介绍 HTTP 服务端技术,包括如何处理 HTTP 请求和 HTTPS 请求。
学院君
2019/11/12
2.3K0
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
golang源码分析:分布式链路追踪
在上一节搭完分布式追踪的采集展示链路后,这一节开始分析分析分布式链路追踪的核心源码。我们知道分布式追踪的原理是通过traceId串联调用链路上的所有服务和日志,每个服务都有一个自己的spanId,每一次rpc调用都需要生成一个子spanId,通过父子spanID的对应关系,构建一个有向无环图实现分布式追踪的。因此在业务代码的接入过程中需要实现如下功能,父子span关系的构建,父子span关系的传递(包括context内部传递和rpc服务之间的传递有可能跨协议比如http和grpc协议之间传递),rpc日志的采样,上报等等。每一个厂商都有自己的实现,opentrace定义了统一的标准接口,我们按照标准实现即可。在业务代码中实现包括四步:
golangLeetcode
2022/12/17
8520
golang源码分析:分布式链路追踪
go https 笔记
理解为运行在SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议所构建的安全层之上的HTTP协议
solate
2019/07/22
9030
Go每日一库之126:h2c(明文https)
net/http包默认支持http2的,而HTTP/2强制使用TLS的,所以在使用的时候必须指定证书,正好最近玩过,在这写一下:
luckpunk
2023/09/30
7720
Golang(十二)TLS 相关知识(三)理解并模拟简单代理
0. 前言 前面的介绍我们理解了数字签名等知识,同时学习了 OpenSSL 生成私钥和证书并验证 之前提过我们基于 BitTorrent 协议开发了一个 docker 镜像分发加速插件 中间涉及到了配置 docker 的代理 下面我们简单介绍下 Golang 的 http.transport 配置了网络代理后的网络行为并编写一个简单的代理转发,加深理解代理转发行为 1. http.Transport 配置代理 http 代理配置代码如下: func TLSTransport(caFile string)
西凉风雷
2022/11/23
7120
Golang(十二)TLS 相关知识(三)理解并模拟简单代理
go 原生代码搞定https双向认证客户端私钥加密
最近有一个https双向认证的项目,客户端的证书是加密的,之前用python requests 做原型测试发现不支持加密,需要运行的时候在终端输入密码。
有福
2019/02/22
3.1K0
go 原生代码搞定https双向认证客户端私钥加密
有关[Http持久连接]的一切,卷给你看
上文中我的结论是: HTTP Keep-Alive 是在应用层对TCP连接进行滑动续约复用, 如果客户端/服务器稳定续约,就成了名副其实的长连接。
有态度的马甲
2021/12/05
4990
有关[Http持久连接]的一切,卷给你看
Go 每日一库之 rpcx
在之前的两篇文章rpc和json-rpc中,我们介绍了 Go 标准库提供的rpc实现。在实际开发中,rpc库的功能还是有所欠缺。今天我们介绍一个非常优秀的 Go RPC 库——rpcx。rpcx是一位国人大牛开发的,详细开发历程可以在rpcx官方博客了解。rpcx拥有媲美,甚至某种程度上超越gRPC的性能,有完善的中文文档,提供服务发现和治理的插件。
用户7731323
2020/09/08
9540
KubeEdge云边隧道Stream源码解析
Stream是KubeEdge中提供云边隧道的模块,目前支持ApiServer向Kubelet发起的containerLog、exec和metrics请求。云边隧道基于WebSocket建造,支持双向传输和流式传输。
CNCF
2021/05/07
1.5K0
KubeEdge云边隧道Stream源码解析
Go代码打通HTTPs
TL;DR 手工创建CA证书链,手写代码打通HTTPs的两端 HTTPs最近是一个重要的话题,同时也是一个有点难懂的话题。所以网上有大量的HTTPs/TLS/SSL的教程。关于这些的原理,这里不做讲解,有兴趣的可以自行搜索。 本文介绍一个自己创建证书,并编写 Go 代码实现 client/server 两端的过程。从实践的角度帮助理解。 构建 CA 证书链 我们首先要创建 client/server 使用的证书。创建证书的方法有很多种:有不怕麻烦,直接通过 openssl 创建的,有通过 cfssl 创建的
李海彬
2018/03/16
1.5K0
【实践】如何在本地环境用GO实现HTTPS链接?
本篇文章是基于实操,如何在本地环境用GO实现HTTPS链接。原理部分请参考文章《【深度知识】HTTPS协议原理和流程分析》。
辉哥
2019/05/15
2.6K0
【实践】如何在本地环境用GO实现HTTPS链接?
gRPC如何在Golang和PHP中进行实战?7步教你上手!
导语 | gRPC也是RPC技术家族的一种,它由Google主导开发,是一个跨平台的调用框架,其中和go语言结合的是最紧密的,在go语言的开发和调用中占据主导地位。gRPC采用protobuf作为配置载体来实现通讯和调用。本文主要实战演示一下gRPC的几种调用通讯模式(普通、客户端流、服务端流、双向流)以及和PHP客户端的联通调用。 在学习gRPC之前,我们需要了解一下ptorobuf语法和protoc的命令,能帮助我们更加深入的学习和理解gRPC。 一、需求分析 我们这次只搞个很简单的需求,搞个用户
腾讯云开发者
2021/10/20
3K1
gRPC,爆赞
gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。
AlwaysBeta
2021/10/12
1.2K0
Go实战--golang中使用RethinkDB(gorethink/gorethink.v3)
生命不止,继续go go go !!! 关于golang中操作数据库,曾经介绍了不少: Go实战–go语言操作sqlite数据库(The way to go) Go实战–go语言操作MySQL数据库
程序员的酒和故事
2018/03/12
1.9K0
Go实战--golang中使用RethinkDB(gorethink/gorethink.v3)
Go语言 如果实现http重连?
怎样做到每次使用一个连接发送和接收前就设置超时呢?我想了个办法是在Dial回调返回自己包装过的TimeoutConn,间接的调用真实的Conn,这样就可以再每次Read和Write之前设置超时时间了。 以下是修改后的实验代码: // // How to set timeout for http.Get() in golang // package main import ( "io" "io/ioutil" "log" "net" "net/ht
李海彬
2018/03/19
1.2K0
Golang|记录一些踩坑笔记
var xhr = new XMLHttpRequest(); xhr.open('get', 'https://v1.hitokoto.cn/'); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { var data = JSON.parse(xhr.responseText); var hitokoto = document.getElementById('hitokoto'); hitokoto.innerText = data.hitokoto; } } xhr.send();
TRY博客-简单的网络技术
2022/09/08
2810
客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?
之前我有结论:HTTP keep-alive 是在应用层对TCP连接的滑动续约复用,如果客户端、服务器稳定续约,就成了名副其实的长连接。
有态度的马甲
2022/03/30
1.3K0
客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?
如何用Golang模拟客户端发送Http请求
在Golang中web开发中net/http是经常用到的包,在这个包中包含了各种请求与响应的方式,下面我会一一进行介绍。
陌无崖
2019/08/16
8.1K0
go: grpc tls 应用一览
在go 1.15以上版本,必须使用SAN方式,否则会报"transport: authentication handshake failed: x509: certificate relies on legacy Common Name field, use SANs instead"
超级大猪
2023/01/31
1.3K0
相关推荐
go-https的简单实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档