对象存储服务-云存储/私有读写/私有读写
例如:文件上传及获取服务化。
提示:以下是本篇文章正文内容,下面案例可供参考
代码如下:
micro new object_oss
cd object_oss
#阿里云oss-sdk
go get -u github.com/aliyun/aliyun-oss-go-sdk/oss
# 拉取预先封装好的公共配置文件(之后会抽取成封装好的包)
git clone https://gitee.com/my_go/initialize.git
git clone https://gitee.com/my_go/global.git
git clone https://gitee.com/my_go/model.git
该处用micro工具创建新的服务。
代码如下:
此处使二个接口
1.服务端上传接口
2.服务端获取图片地址接口
syntax = "proto3";
package object_oss;
option go_package = "./proto;object_oss";
service Object_oss {
rpc RequestOss(RequestData) returns (ResponseOss) {}
rpc GetImgUrl(RequestKey) returns (ResponseImgUrl) {}
}
message RequestData {
string key = 1;
string data = 2;
}
message ResponseOss {
int64 code = 1;
string msg = 2;
string data = 3;
}
// 接收参数
message RequestKey {
string key = 1;
}
// 返回参数
message ResponseImgUrl {
string url = 1;
}
代码如下(示例):
make proto
代码如下(示例):
name: testsvr
auto: false
port: 9999
nacos:
http: nacos.topwhere.cn # url
port: 8848 # 端口
config_data_id: db_conf.yaml # 配置中心配置id
config_group: DEFAULT_GROUP # 配置中心配置组
client_configs:
namespace_id: 926bc8a0-540d-4ff5-9365-646c48b11ae4
region_id: private
timeout_ms: 5000
not_load_cache_at_start: true
log_dir: /tmp/nacos/log
cache_dir: /tmp/nacos/cache
log_level: debug
server_configs:
ip_addr1: nacos.topwhere.cn
context_path1: /nacos
port1: 80
cheme1: http
# IpAddr2: nacos2.topwhere.cn
# ContextPath2: /nacos
# Port2: 80
# Scheme2: http
代码如下(示例):
cd model
新增表结构
package model
/*
OssLog文件
*/
type OssLog struct {
BaseHeaderModel
Key string `gorm:"type:varchar(255);default:'';comment:key值"`
BaseFooterModel
}
func (u *OssLog) TableName() string {
return "oss_log"
}
代码如下(示例):
package initialize
import (
"fmt"
"go.uber.org/zap"
"log"
"object_oss/global"
"os"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"object_oss/model"
)
func InitDB() {
// Mysql配置信息
mysqlInfo := global.GlobalConf.MysqlConfig
zap.S().Info("Mysql配置信息:", mysqlInfo)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
mysqlInfo.User, mysqlInfo.Pwd, mysqlInfo.Host, mysqlInfo.Port, mysqlInfo.Database)
zap.S().Info("Mysql链接信息:", dsn)
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Silent, // Log level
Colorful: true, // 禁用彩色打印
},
)
// 全局模式
var err error
global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
Logger: newLogger,
})
if err != nil {
panic(err)
}
//校验数据库数否存在表,不存在创建 OssLog文件
if !global.DB.Migrator().HasTable("admin_oss_log") {
global.DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=测试")
if err = global.DB.Migrator().CreateTable(&model.OssLog{}); err != nil {
zap.S().Debug("数据库创建异常", err)
}
}
//global.DB.AutoMigrate(&model.User{}, &model.Department{})
}
变更initialize下import下资源地址中 user_srv 为 object_oss代码如下(示例):
package handler
import (
"context"
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"go.uber.org/zap"
"object_oss/global"
"object_oss/model"
proto "object_oss/proto"
)
type Object_oss struct{}
// GetUserList 上传对象
func (h *Object_oss) RequestOss(ctx context.Context, req *proto.RequestData, rep *proto.ResponseOss) error {
var OssLog []model.OssLog
zap.S().Debug("原始结构", OssLog)
//获取总数
result := global.DB.Find(&OssLog)
if result.Error != nil {
return result.Error
}
fmt.Println("OSS Go SDK Version: ", oss.Version)
zap.S().Debug("全量数据", OssLog)
return nil
}
// GetImgUrl 获取地址
func (O *Object_oss) GetImgUrl(ctx context.Context, req *proto.RequestKey, rep *proto.ResponseImgUrl) error {
return nil
}
代码如下(示例):
变更使用的micro版本,本来打算全用micro3,但是这里每调通,暂时做下处理实现功能
#import (
# context "context"
# api "github.com/micro/micro/v3/service/api"
# client "github.com/micro/micro/v3/service/client"
# server "github.com/micro/micro/v3/service/server"
#)
换成
import (
context "context"
api "github.com/micro/go-micro/v2/api"
client "github.com/micro/go-micro/v2/client"
server "github.com/micro/go-micro/v2/server"
)
代码如下(示例):
package main
import (
"fmt"
"github.com/micro/go-micro/v2"
"go.uber.org/zap"
"object_oss/global"
handler "object_oss/handler"
initialize "object_oss/initialize"
proto "object_oss/proto"
"os"
"os/signal"
"strconv"
"syscall"
"github.com/micro/go-micro/v2/logger"
)
func main() {
//初始化配置参数
initialize.RegisterEnv()
//注册配置参数
initialize.RegisterConfig(global.GlobalEnv.Nacos.Config_data_id, global.GlobalEnv.Nacos.Config_group)
//初始化log
initialize.InitLogger()
//初始化数据库
initialize.InitDB()
//服务注册至nacos
registry := initialize.RegisterServer(global.GlobalEnv.Nacos.Http + ":" + strconv.Itoa(global.GlobalEnv.Nacos.Port))
//2 创建服务并注册到注册中心
service := micro.NewService(
micro.Name("object.oss"),
micro.Version("v1.0.0"),
micro.Registry(registry),
)
// 3 Register handler
err := proto.RegisterObjectOssHandler(service.Server(), new(handler.Object_oss))
if err != nil {
fmt.Println(err)
}
// 4 Run service
if err := service.Run(); err != nil {
logger.Fatal(err)
}
接收终止信号 程序出现异常,终止
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
zap.S().Info("注销成功")
}
代码如下(示例):
此为隐藏文件,在命令行删除
到这大致结构基本上已完成,可以先打包发到git上,留存个版本,git怎么用就不展示了,到目前为止得到了这样一个项目,记得master设置成保护分支

到这定义好了空的框架,已经可以和注册中心联通

代码如下(示例):
git checkout -b release
。。。。。。。。。: