• 微服务架构(从无到有)三.构建对象存储服务 1) micro+阿里云oss服务


    micro+阿里云oss服务

    对象存储服务-云存储/私有读写/私有读写



    前言

    例如:文件上传及获取服务化。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、新建对象存储服务

    1.创建新的服务

    代码如下:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    该处用micro工具创建新的服务。


    2.定义接口

    代码如下:
    此处使二个接口
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3.生成模版

    代码如下(示例):

    make proto
    
    • 1

    4.增加配置中心/注册中心配置env.yaml

    代码如下(示例):

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    5.增加model结构文件-创建obs服务相关表结构

    代码如下(示例):

    cd model 
    
    • 1

    新增表结构

    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"
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    6.变更initialize下db.go文件

    代码如下(示例):

    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{})
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    变更initialize下import下资源地址中 user_srv 为 object_oss

    7.编辑handler/object.oss.go文件

    代码如下(示例):

    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
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    8.编辑proto/object_oss.pb.micro.go文件(此步骤每执行一遍 make proto执行一次)

    代码如下(示例):
    变更使用的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"
    )
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    9.变更main.go文件内容

    代码如下(示例):

    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("注销成功")
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    10.移除model,global,initialize下.git

    代码如下(示例):
    此为隐藏文件,在命令行删除

    到这大致结构基本上已完成,可以先打包发到git上,留存个版本,git怎么用就不展示了,到目前为止得到了这样一个项目,记得master设置成保护分支
    
    • 1

    在这里插入图片描述

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

    在这里插入图片描述

    二、开发调试

    1.切换到开发分支

    代码如下(示例):

    git checkout -b release
    
    
    • 1
    • 2

    2. 未完待续


    结尾

    。。。。。。。。。:

  • 相关阅读:
    伪静态web.config常见规则写法与参数介绍说明
    Python实现的基于数据包队列管理内容
    JS-内置对象API-Array(数组)-(二)不改变原数组的API-篇
    螺旋模型的优点与缺点
    手工测试如何进阶自动化测试?熬夜7天整理出这一份3000字的超全学习指南...
    【python基础学习3】jupyter notebook 相关技巧学习
    vant 按需导入 vue2
    linux 发行版中在容器内访问热插拔 U 盘的分区内容
    [附源码]计算机毕业设计在线图书销售系统Springboot程序
    专为医疗领域打造!飞凌嵌入式新一代FDU显控一体机发布
  • 原文地址:https://blog.csdn.net/qq_35786954/article/details/125598850