go-kratos 学习笔记(4) 服务注册与发现 nacos注册

接口实现

Registry 接口分为两个,Registrar 为实例注册和反注册,Discovery 为服务实例列表获取

type Registrar interface {
    // 注册实例
    Register(ctx context.Context, service *ServiceInstance) error
    // 反注册实例
    Deregister(ctx context.Context, service *ServiceInstance) error
}

type Discovery interface {
    // 根据 serviceName 直接拉取实例列表
    GetService(ctx context.Context, serviceName string) ([]*ServiceInstance, error)
    // 根据 serviceName 阻塞式订阅一个服务的实例列表信息
    Watch(ctx context.Context, serviceName string) (Watcher, error)
}
nacos的注册数据data层,在data目录选创建一个 register.go
下载包
go get github.com/nacos-group/nacos-sdk-go 


go get github.com/go-kratos/kratos/contrib/registry/nacos/v2

go get github.com/nacos-group/nacos-sdk-go/clients/config_client
package data

import (
	"github.com/go-kratos/kratos/contrib/registry/nacos/v2"
	"github.com/go-kratos/kratos/v2/registry"
	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/nacos-group/nacos-sdk-go/vo"
	"log"
	conf "xgs_kratos/gen/users"
)

func CreateRegister(conf *conf.Data) registry.Registrar {
	sc := []constant.ServerConfig{
		*constant.NewServerConfig(conf.Nacos.Addr, conf.Nacos.Port),
	}

    配置项自己定义
	cc := constant.ClientConfig{
		NamespaceId:         conf.Nacos.NamespaceId, // namespace id
		TimeoutMs:           5000, //配置项自己定义
		NotLoadCacheAtStart: true,
		LogDir:              "tmp/nacos/log",
		CacheDir:            "tmp/nacos/cache",
		LogLevel:            "debug",
	}

	// a more graceful way to create naming client
	client, err := clients.NewNamingClient(
		vo.NacosClientParam{
			ClientConfig:  &cc,
			ServerConfigs: sc,
		},
	)

	if err != nil {
		log.Panic(err)
	}

	r := nacos.New(client)
	return r
}
配置文件需要修改

api/user/conf.proto

syntax = "proto3";
package kratos.api;

option go_package = "xgs_kratos/app/users/internal/conf;conf";

import "google/protobuf/duration.proto";

message Bootstrap {
  Server server = 1;
  Data data = 2;
}

message Server {
  message HTTP {
    string network = 1;
    string addr = 2;
    google.protobuf.Duration timeout = 3;
  }
  message GRPC {
    string network = 1;
    string addr = 2;
    google.protobuf.Duration timeout = 3;
  }
  HTTP http = 1;
  GRPC grpc = 2;
}

message Data {
  message Database {
    string driver = 1;
    string source = 2;
  }
  message Redis {
    string network = 1;
    string addr = 2;
    google.protobuf.Duration read_timeout = 3;
    google.protobuf.Duration write_timeout = 4;
  }
//新增nacos的配置
  message Nacos{
    string addr = 1;
    uint64 port = 2;
    string namespaceId = 3;
  }
  Database database = 1;
  Redis redis = 2;
  Nacos nacos = 3;
}

然后执行 buf generate

在app/users/connfigs里面写入配置

server:
  http:
    addr: 0.0.0.0:8000
    timeout: 1s
  grpc:
    addr: 0.0.0.0:9000
    timeout: 1s
data:
  database:
    driver: mysql
    source: root:root@tcp(127.0.0.1:3306)/test?parseTime=True&loc=Local
  redis:
    addr: 127.0.0.1:6379
    read_timeout: 0.2s
    write_timeout: 0.2s
  nacos:
    addr: 127.0.0.1
    port: 8848
    namespaceId: local

由于使用的是模版默认的需要替换一下 app/users下 xgs_kratos/app/users/internal/conf替换成 xgs_kratos/gen/users

main.go中修改

package main

import (
	"flag"
	"github.com/go-kratos/kratos/v2/registry"
	"os"
	"xgs_kratos/gen/users"

	"github.com/go-kratos/kratos/v2"
	"github.com/go-kratos/kratos/v2/config"
	"github.com/go-kratos/kratos/v2/config/file"
	"github.com/go-kratos/kratos/v2/log"
	"github.com/go-kratos/kratos/v2/middleware/tracing"
	"github.com/go-kratos/kratos/v2/transport/grpc"
	"github.com/go-kratos/kratos/v2/transport/http"

	_ "go.uber.org/automaxprocs"
)

// go build -ldflags "-X main.Version=x.y.z"
var (
	// Name is the name of the compiled software.
	Name string = "users-xgs"
	// Version is the version of the compiled software.
	Version string = "v1.0.0"
	// flagconf is the config flag.
	flagconf string

	id, _ = os.Hostname()
)

func init() {
	flag.StringVar(&flagconf, "conf", "../../configs", "config path, eg: -conf config.yaml")
}

func newApp(rg registry.Registrar, logger log.Logger, gs *grpc.Server, hs *http.Server) *kratos.App {
	return kratos.New(
		kratos.ID(id),
		kratos.Name(Name),
		kratos.Version(Version),
		kratos.Metadata(map[string]string{}),
		kratos.Logger(logger),
		kratos.Registrar(rg),
		kratos.Server(
			gs,
			hs,
		),
	)
}

func main() {
	flag.Parse()
	logger := log.With(log.NewStdLogger(os.Stdout),
		"ts", log.DefaultTimestamp,
		"caller", log.DefaultCaller,
		"service.id", id,
		"service.name", Name,
		"service.version", Version,
		"trace.id", tracing.TraceID(),
		"span.id", tracing.SpanID(),
	)
	c := config.New(
		config.WithSource(
			file.NewSource(flagconf),
		),
	)
	defer c.Close()

	if err := c.Load(); err != nil {
		panic(err)
	}

	var bc conf.Bootstrap
	if err := c.Scan(&bc); err != nil {
		panic(err)
	}

	app, cleanup, err := wireApp(bc.Server, bc.Data, logger)
	if err != nil {
		panic(err)
	}
	defer cleanup()

	// start and wait for stop signal
	if err := app.Run(); err != nil {
		panic(err)
	}
}

修改完代码之后需要生成一下依赖 在app/users下执行  wire

然后直接执行 kratos run 

 nacos上报成功!!

相关推荐

  1. Nacos如何支持服务发现注册

    2024-07-22 21:38:04       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 21:38:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 21:38:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 21:38:04       45 阅读
  4. Python语言-面向对象

    2024-07-22 21:38:04       55 阅读

热门阅读

  1. Leetcode热题100 Day4

    2024-07-22 21:38:04       15 阅读
  2. Python每日学习

    2024-07-22 21:38:04       15 阅读
  3. web前端 React 框架面试200题(七)

    2024-07-22 21:38:04       15 阅读
  4. 鸡兔同笼求解器

    2024-07-22 21:38:04       17 阅读
  5. 深度学习中的损失函数和网络优化方法

    2024-07-22 21:38:04       13 阅读
  6. VUE复习

    VUE复习

    2024-07-22 21:38:04      10 阅读
  7. Unity扩展 UI线段绘制组件——UI上的LineRenderer

    2024-07-22 21:38:04       13 阅读
  8. IDM破解

    IDM破解

    2024-07-22 21:38:04      11 阅读
  9. 通过Python面向对象编程探索克苏鲁神话

    2024-07-22 21:38:04       12 阅读