Java转go第6阶段
前言
本阶段开始微服务的学习
我的项目地址
学习经过
- 观看狂神的视频这个视频很快的来了一遍gRPC的基础应用
- 一篇非常不错的博客,介绍了微服务的基础知识
- 一个大佬的视频
- 安装docker过程中我看的有收获的一些博客: 安装wsl2与乌班图、Docker Engine Stopped的解决历程、docker的安装与汉化、docker安装、wsl更新、安装docker在其他盘
学习总结
1 gRPC简单demo
环境准备
前往protobuf官方下载并安装protobuf将它配置进环境变量中(一个自动转换将proto代码生成对应格式代码的工具)
然后新建项目下载依赖的包
go get github.com/golang/protobuf/proto
go get google.golang.org/grpc
go install github.com/golang/protobuf/protoc-gen-go
我的目录结构,下面用到的都是duo开头的
编写protobuf文件
我这里直接跳过单个服务,从多服务开始,因为感觉没太大差别。
如果用goland进行编写正常会捆绑插件,能识别proto格式让它变色,但如果没有可以自己下一下插件,阅读起来方便点
duo_service.proto
syntax = "proto3"; // 指定proto版本
// 指定golang包名
option go_package = "/duo_proto";
// 定义服务
service VideoService {
//定义方法
rpc Look(Request)returns(Response){}
}
service OrderService {
rpc Buy(Request)returns(Response){}
}
// 定义请求和响应
message Request{
//这里的1并不是赋值,而是表示字段的顺序序号,应该是在数据传输的编解码时有用
string name = 1;
}
message Response{
string name = 1;
}
proto文件的语法非常简单,如果向了解系统点可以去看我的学习经过中第三个视频。其他的只需要知道service定义服务、rpc定义方法、message定义结构体。其余的代码一般变动不大,包名自己改改,多试几次体会一下就明白了。
在命令行里面输入命令生成pb.go文件
protoc -I . --go_out=.\proto --go-grpc_out=.\proto .\proto\duo_service.proto
这段命令中–go_out和–go-grpc_out是要生成什么文件
.\proto是生成文件存放的路径,如果是.的话代表命令行打开的当前路径下
最后的.\proto\duo_service.proto代表作为生成依据的proto文件的路径
之后会生成两个文件duo_service_grpc.pb.go和duo_service.pb.go,代码不放了,反正如果用我的proto文件生成出来的都一模一样,这两个文件前者定义了grpc服务与方法,后者定义了请求与响应的结构体用于数据传输的编解码。
服务端代码
duo_service.go
就不单独解释了,注释里面都解释明白了
package main
import (
"context"
"fmt"
"gRPC-demo/proto/duo_proto"
"google.golang.org/grpc"
"net"
)
// 结构体叫什么无所谓但需要实现接口的方法
type OrderServer struct {
// 在高版本proto生成时会生成UnimplementedOrderServiceServer结构体,它实现了所有服务的空方法,
// 所以你的结构体继承了这个结构体,当访问没有实现的方法时,会调用空方法,返回错误方法未实现
duo_proto.UnimplementedOrderServiceServer
}
func (s *OrderServer) Buy(ctx context.Context, req *duo_proto.Request) (*duo_proto.Response, error) {
fmt.Println("服务端收到请求:" + req.Name)
return &duo_proto.Response{Name: "buy " + req.Name}, nil
}
type VideoServer struct {
duo_proto.UnimplementedVideoServiceServer
}
func (s *VideoServer) Look(ctx context.Context, req *duo_proto.Request) (*duo_proto.Response, error) {
fmt.Println("服务端收到请求:" + req.Name)
return &duo_proto.Response{Name: "look " + req.Name}, nil
}
func main() {
// 监听端口9090
listen, err := net.Listen("tcp", ":9090")
if err != nil {
panic(err)
}
// 创建一个grpc服务器
grpcServer := grpc.NewServer()
// 注册服务
duo_proto.RegisterOrderServiceServer(grpcServer, &OrderServer{})
duo_proto.RegisterVideoServiceServer(grpcServer, &VideoServer{})
// 启动grpc服务器
err = grpcServer.Serve(listen)
if err != nil {
panic(err)
}
}
客户端代码
package main
import (
"context"
"fmt"
"gRPC-demo/proto/duo_proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"time"
)
func main() {
// 设置带超时的上下文
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
//conn, err := grpc.Dial("localhost:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
//conn, err := grpc.DialContext(ctx, "localhost:8080", grpc.WithInsecure())
//上面两种方法被弃用,但目前仍可使用
conn, err := grpc.NewClient("localhost:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
panic(err)
}
defer conn.Close()
// 创建一个grpc客户端
orderClient := duo_proto.NewOrderServiceClient(conn)
videoClient := duo_proto.NewVideoServiceClient(conn)
orderResp, err := orderClient.Buy(ctx, &duo_proto.Request{Name: "苹果"})
if err != nil {
panic(err)
}
fmt.Println(orderResp.Name)
videoResp, err := videoClient.Look(ctx, &duo_proto.Request{Name: "电影"})
if err != nil {
panic(err)
}
fmt.Println(videoResp.Name)
}
2 docker安装
我的环境与建议
先说明我的电脑环境我是Windows10系统
在开始之前给大家一些建议,首先我只安装过一次,我说的肯定只是我的个人经验,你需要多看些博客看看别人的安装经验,另外不要完全按照ai的来,ai给的安装步骤未必完全适合你,在安装之前你需要多看看别人的经验,不要让自己的眼睛看的太窄了。
需要安装哪些东西
- 首先你需要有能够科学上网的方法
- 你需要下载wsl2
- 你需要打开电脑的虚拟化以及hyper-v(这个我不确定,虽然我跟着开了)
- 你需要用wsl下载一个Linux系统比如乌班图
- 你需要安装docker desktop
hyper-v的开启
开启hyper-v
这个我没踩什么坑,所以也不知道有没有用,直接看别人的文章跟着做就是
wsl2的下载
这里我踩了一个卡了我特别旧的坑,我起初是下载的豆包给我的链接,结果后来我才知道,那个版本低了,我一直docker引擎启动失败。
1 首先用管理员身份用PowerShell运行以下命令
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
这两个好像是启动了系统的什么配置,启用 Windows 子系统(WSL)功能,启用虚拟机平台功能
下载wsl2,去官网下载最新版。
如果你不幸跟我一样下了不是最新版的也可以直接去官网下载,网络更为稳定,不会像命令行一样容易失败
设置wsl的默认版本为wsl2
wsl --set-default-version 2
乌班图下载
我是跟着这个博客下载的,他是完全使用的命令行进行的解压安装啥的,我之间命令行出了个错,但手动解压也没遇到什么问题
docker desktop下载
这里我踩了坑ai告诉我中间有自定义安装路径的界面,结果我安装完也没看到,安在了C盘。然后我被迫卸载重新安装了。
想要安装在其他盘需要使用命令行的方式进行安装
首先在D盘新建Docker目录,然后将安装包剪切到该文件夹使用管理员权限打开该目录的命令行,用以下代码安装:
"Docker Desktop Installer.exe" install --install-dir="PATH"
其中PATH替换为你想要安装的路径,例如"D:\Program\Docker"。
然后顺着一路点就能下载下来了
进来以后登录注册一下
更改镜像默认保存路径
更改镜像源
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com",
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
如果出现了engine stopped的情况这些配置都是无法配置成功的,记得配置完重启,而engine stopped往往是由于wsl需要更新导致的,反正我的是这个原因,其他的可以看这个博客逐步排查一下
安装成功
我们可以在命令行里面输入以下命令,检查安装是否成功
docker run hello-world
总结
其实还有docker的使用,但最近有点忙,以后在补,更新也暂停一段时间