go从0到1项目实战体系六十六:Http服务

1. 让gRPC提供Http服务:

grpcserver\service.go:

// 注释RPC服务
// 监听所有网卡8028端口的TCP连接
// lis, _:=net.Listen("tcp",":8081")
// err = rpcServer.Serve(lis)

// 启动Http服务 
mux := http.NewServeMux()
mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
    fmt.Println(request.Proto)       // 打印所使用的协议:HTTP/2.0
    fmt.Println(request.Header)      // 打印使用的头
    fmt.Println(request)             // 打印请求体
    rpcServer.ServeHTTP(writer, request)
});
httpServer := &http.Server{Addr: ":8081", Handler: mux,}
httpServer.ListenAndServe()

(1). 浏览器请求:

①. 访问:http://localhost:8081/

②. 结果:
   浏览器显示:gRPC requires HTTP/2

③. 原因:
   a. 在gRPC中提供的是HTTP/2这个协议,使用HTTP/1.1这个方式是访问不了的.

(2). RPC客户端连接:

①. 报错:
   error: code = Unavailable desc = connection error: desc = "transport: authentication handshake failed: tls: first record does not look like a TLS handshake"

②. RPC客户端也是访问不了的,会报一个错误.因为没有使用证书.

2. 支持HTTP2协议:

(1). 改进服务端代码:
grpcserver\service.go:

...
// httpServer.ListenAndServe()
httpServer.ListenAndServeTLS("keys/server.crt", "keys/server_no_passwd.key"):. 在启动HTTPserver的时候,加入证书,会自动进化为HTTP2.

(2). 浏览器访问:

①. 访问:https://localhost:8081/
   注:需要是https

②. 结果:
   a. 提示"您的连接不是私密连接",点击"高级"->"继续前往localhost(不安全)".
   b. invalid gRPC request method:表示可以正常访问,只是请求方法是不正确的.

(3). RPC客户端访问:

①. 服务端会报出警告:
   http: TLS handshake error from [::1]:52155: remote error: tls: unknown certificate

②. 因为是自签的证书,没有使用双向验证,会出现一些警告.

(4). 浏览器访问服务端日志:

HTTP/2.0
****************
map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9] Accept-Encoding:[gzip, deflate, br] Accept-Langu
age:[zh-CN,zh;q=0.9] Cache-Control:[max-age=0] Sec-Fetch-Mode:[navigate] Sec-Fetch-Site:[none] Sec-Fetch-User:[?1] Upgrade-Insecure-Requests:[1] User-Agent:[Mozilla/5.0 (Windows NT 10.0;
 Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36]]
****************
&{GET / HTTP/2.0 2 0 map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9] Accept-Encoding:[gzip, defl
ate, br] Accept-Language:[zh-CN,zh;q=0.9] Cache-Control:[max-age=0] Sec-Fetch-Mode:[navigate] Sec-Fetch-Site:[none] Sec-Fetch-User:[?1] Upgrade-Insecure-Requests:[1] User-Agent:[Mozilla/
5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36]] 0xc000108ba0 <nil> 0 [] false localhost:8081 map[] map[] <nil> map[] [::1]:52
281 / 0xc000182160 <nil> <nil> 0xc00005e840}
2019/12/19 14:51:40 http: TLS handshake error from [::1]:52280: remote error: tls: unknown certificate
****************
HTTP/2.0
****************
map[Accept:[image/webp,image/apng,image/*,*/*;q=0.8] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9] Cache-Control:[no-cache] Pragma:[no-cache] Referer:[https://loca
lhost:8081/] Sec-Fetch-Mode:[no-cors] Sec-Fetch-Site:[same-origin] User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari
/537.36]]
****************
&{GET /favicon.ico HTTP/2.0 2 0 map[Accept:[image/webp,image/apng,image/*,*/*;q=0.8] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9] Cache-Control:[no-cache] Pragma:
[no-cache] Referer:[https://localhost:8081/] Sec-Fetch-Mode:[no-cors] Sec-Fetch-Site:[same-origin] User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like G
ecko) Chrome/79.0.3945.79 Safari/537.36]] 0xc0001241b0 <nil> 0 [] false localhost:8081 map[] map[] <nil> map[] [::1]:52281 /favicon.ico 0xc000182160 <nil> <nil> 0xc000126280}

(5). RPC客户端访问服务端日志:

HTTP/2.0
****************
map[Content-Type:[application/grpc] Te:[trailers] User-Agent:[grpc-go/1.26.0]]
****************
&{POST /services.ProdService/GetProdStock HTTP/2.0 2 0 map[Content-Type:[application/grpc] Te:[trailers] User-Agent:[grpc-go/1.26.0]] 0xc000108bd0 <nil> -1 [] false demo map[] map[] <nil
> map[] 127.0.0.1:52284 /services.ProdService/GetProdStock 0xc000138160 <nil> <nil> 0xc00005e880}

:. 使用HTTP/2.0的协议POST方式请求.. /services.ProdService/GetProdStock是请求的路径(好比是:/{包名}/{方法名}).. content-type是application/grpc.
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值