Bootstrap

【grpc】内容回顾

建议先看官网了解概念,点击跳转到官网

proto约束文件介绍

命令

message关键字

相当于golang里的结构体

  • 字段规则

repeated:代表切片等可重复类型

options:其他默认是options

  • 消息号

message中每个字段必须有一个唯一标识号

服务定义

`rpc 服务函数名()returns()`

服务端编写

  • 写服务端实际的服务逻辑
  • 创建grpcserver对象→server端的抽象对象
  • 将编写的服务注册到grpcserver中
  • 创建listen,grpcserver启动服务,listen监听server端口

客户端编写

  • grpc连接到server端,加密认证
  • 获得与server端连接的客户端
  • 客户端执行rpc调用

认证-安全传输

多个server与client之间的认证

  • SSL/TSL认证
  • Token认证
  • 不安全连接
  • 自定义身份认证

加入证书,实现安全调用

https://www.kuangstudy.com/bbs/1604044550878703617

认证方式

SSL/TLS认证
命令:
生成私钥
openssl genrsa -out server.key 2048
生成证书
openssl req -new -x509 -key server.key -out server.crt -days 36500(有效期)
生成证书签名请求文件
openssl req -new -key server.key -out server.csr

修改配置文件
    cp openssl.cnf key
    copy_extensions = copy
    req_extensions = v3_req # The extensions to add to a certificate request
    [ v3_req ]中添加 subjectAltName = @alt_names
    添加标签:[alt_names]DNS.1=*.zy.com=》只有这个域名可以访问到代码

生成证书私钥test.key
    openssl genpkey -algorithm RSA -out test.key
生产证书请求文件test.csr
 openssl req -new -nodes -key test.key -out test.csr -days 3650 -subj
 "/C=cn/OU=myorg/O=mycomp/CN=myname" -config ./openssl.cnf -extensions v3_req
生成SAN证书pem
openssl x509 -req -days 365 -in test.csr -out test.pem -CA
server.crt -CAcreateserial -extfile ./openssl.cnf -extensions v3_req
改正版命令:
sudo openssl x509 -req -days 365 -in test.csr -out test.pem
-CA /usr/local/sdk/go/src/hello/key/server.crt
-CAkey /usr/local/sdk/go/src/hello/key/server.key
-CAcreateserial -extfile ./openssl.cnf -extensions v3_req


认证生成私钥证书文件命令在hello-server key 命令.txt文件中

  • server端传入.key文件,.pem文件生成证书
  • 在创建grpcserver时将证书塞进去
  • client端传入.pem文件和域名生成证书
  • 再获得conn连接时,塞入证书
Token认证
  • 将客户端实现有关Token的接口:GetRequestMetadata →返回携带信息,RequireTransportSecurity→是否开启ssl
  • 客户端获得携带ssl与token的切片
  • server端在服务(不推荐)或者拦截器中校验token令牌

可以与SSL/TLS结合

go-zero基础

简介

微服务

将大系统按照功能或者产品进行服务拆分→独立的服务

服务间通信→rpc通信连接

准备工具

Etcd

→是什么:etcd是一个高可用的分布式键值存储系统。采用Raft一致性算法保证数据的强一致性,并支持对数据进行监听更新。
→用途:微服务的配置中心,服务发现

→理解:数据可靠性更强,加强版redis

etcd的基本命令  

1.etcdctl put name zy  

2.etcdctl get name->返回键值对  

3.etcdctl get name --print-value-only->只希望返回值  

4.etcdctl get na --prefix->返回前缀符合条件的键值对  

5.etcdctl watch name->监听键的变化  

6.etcdctl del name->删除键

命令:

zsy@zsy-21CY:/usr/local/sdk/go/src/zero-study/user/rpc$ goctl rpc protoc user.proto --go_out=types --go-grpc_out=types --zrpc_out=.

goctl api go -api video/api/video.api -dir video/api/

api服务

api go -api xxx.api -dir .

api语法

syntax = “v1”

type :类似于结构体→请求体、响应体、实例

  • 支持结构体嵌套和引用

service:定义微服务

  • @handler 方法名
  • 请求方法 路由 请求、响应

@server():控制对http服务生成时meta信息

  • group:路由分组目录
  • prefix:路由前缀
  • jwt:鉴权Auth 值为 jwt 密钥,过期 等信息配置的 golang 结构体名称
  1. 在user.yaml中配置秘钥与过期时间
  • middleware:中间件
  • timeout:3s超时控制,值为 time.Duration
  • maxBytes: 最大请求控制

api封装

避免重复写响应体的重复字段信息。我们可以将 codemsg 抽象在 base.api 中,然后 user.api 中复用和定义具体的响应结构体即可。

http服务→main.api→引入没有service块的api

结构体→xxx.api

api命令

goctl api new demo
goctl api go -api xxx.api -dir. 

类似的proto文件生成代码命令:

 goctl rpc new demo

但rpc需要在配置文件中添加代码

`etc/demo.yaml:`
Name: demo.rpc
ListenOn: 0.0.0.0:8080
Mode: dev

api格式化命令:

goctl api format —dir demo.api

jwt鉴权实现

  • @server(jwt:Auth)
  • 在xxx.yaml文件中配置秘钥以及有效期
  • 在公共目录中完成jwt的签发逻辑
  • login后获得jwt签发的token,并返回
  • 在main函数中加入鉴权失败的回调函数,说明鉴权失败的原因。

操作mysql

生成model代码

goctl model mysql ddl —src xx.sql —dir .(有表)

→自动加入了增删改的代码

→也可以自己添加手写sql

model代码使用

  • 再config写上mysql配置→数据源
  • 在xxx.yaml文件中配置数据源
  • 在svn包里的创建mysql连接
  • 登录逻辑中可以查询数据库了

结合gorm

→开发更加高效

  • 在models创建type,引入gorm.Model(直接编写model文件)
  • 在common中加入初始化gorm的代码
  • config.go中不变
  • svc中连接mysql
  • login逻辑中使用gorm

rpc服务

单rpc服务模式

编写一个proto文件在service块添加rpc→通过命令[goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.]生成对应的文件,其中rpc文件生成在types文件夹中→补充逻辑就行了

服务分组

proto文件在不同的service块放不同的rpc服务→在命令后面加上-m

结合gorm

proto文件→命令→配置文件.yaml文件添加mysql数据库信息→config.go添加mysql映射→svc依赖注入mysql,初始化连接数据库→补充逻辑

结合api

api文件→命令goctl api go -api user.api -dir .

配置文件里写rpc服务的key→填写配置文件→svc依赖注入rpc客户端→逻辑写一下。

;