成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言微服務(wù)框架 Kratos 服務(wù)注冊與發(fā)現(xiàn)

開發(fā) 前端
Go 語言微服務(wù)框架 Kratos 服務(wù)注冊與發(fā)現(xiàn),支持多種注冊中心,本文我們以 Consul 為例,介紹 Kratos 項(xiàng)目怎么實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)。

1.介紹

Go 語言微服務(wù)框架 Kratos 服務(wù)注冊與發(fā)現(xiàn),支持多種注冊中心,本文我們以 Consul 為例,介紹 Kratos 項(xiàng)目怎么實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)。

以 blog 項(xiàng)目作為 RPC 服務(wù)端,我們再創(chuàng)建一個 blog-client 項(xiàng)目作為 RPC 客戶端。

2.服務(wù)注冊

我們通過改造 blog 項(xiàng)目的代碼,將 blog 服務(wù)作為 RPC 服務(wù)端,注冊到 Consul 中。

創(chuàng)建 Consul 注冊中心

在 blog/internal 目錄中,創(chuàng)建 registry 目錄,并創(chuàng)建 consul.go 和 registry.go 文件。

編寫 blog/internal/registry/consul.go 文件。

func NewConsulRegistry(c *conf.Registry) *consul.Registry {
 client, err := api.NewClient(&api.Config{
  Address: c.Consul.Addr,
  Scheme:  c.Consul.Schema,
 })
 if err != nil {
  panic(err)
 }
 return consul.New(client)
}

編寫 blog/internal/registry/registry.go 文件。

var ProviderSet = wire.NewSet(NewConsulRegistry)

編寫 blog/cmd/blog/wire.go 文件。

func wireApp(*conf.Server, *conf.Data, *conf.Registry, log.Logger) (*kratos.App, func(), error) {
 panic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, registry.ProviderSet, newApp))
}

wire 生成文件

cd /root/go/src/blog/cmd/blog
wire

編寫 blog/cmd/blog/main.go 文件。

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

運(yùn)行項(xiàng)目

cd /root/go/src/blog/cmd/blog
kratos run

訪問 consul UI

在瀏覽器中訪問 http://IP:8500/ui/dc1/services,檢查 blog 服務(wù)的注冊狀態(tài)。

3.服務(wù)發(fā)現(xiàn)

使用 kratos 創(chuàng)建一個客戶端項(xiàng)目 blog-client。

創(chuàng)建 Consul 注冊中心

在 blog-client/internal 目錄中,創(chuàng)建 registry 目錄,并創(chuàng)建 consul.go 和 registry.go 文件。

編寫 blog-client/internal/registry/consul.go 文件。

func NewConsulRegistry(c *conf.Registry) *consul.Registry {
 client, err := api.NewClient(&api.Config{
  Address: c.Consul.Addr,
  Scheme:  c.Consul.Schema,
 })
 if err != nil {
  panic(err)
 }
 return consul.New(client)
}

編寫 blog-client/internal/registry/registry.go 文件。

var ProviderSet = wire.NewSet(NewConsulRegistry)

創(chuàng)建 RPC 客戶端

在 blog-client/internal 目錄中,創(chuàng)建 client 目錄,并創(chuàng)建 blog_client.go 和 client.go 文件。

編寫 blog-client/internal/client/blog_client.go 文件。

func NewBlogClient(registry *consul.Registry, logger log.Logger) (v1.UserClient, error) {
 conn, err := grpc.DialInsecure(
  context.Background(),
  grpc.WithEndpoint("discovery:///blog"),
  grpc.WithDiscovery(registry),
  grpc.WithMiddleware(
   recovery.Recovery(),
  ),
  grpc.WithNodeFilter(
   filter.Version("1.0.0")),
 )
 if err != nil {
  log.NewHelper(logger).WithContext(context.Background()).Errorw("err", err)
  return nil, err
 }
 return v1.NewUserClient(conn), nil
}

編寫 blog-client/internal/client/client.go 文件。

var ProviderSet = wire.NewSet(NewBlogClient)

拷貝 pb 文件

拷貝 /root/go/src/blog/api/user 目錄,粘帖到 /root/go/src/blog-client/api 目錄。

創(chuàng)建 domain 和 usecase 層

創(chuàng)建 blog-client/internal/biz/user.go 文件。

type User struct {
 Id       int64 `xorm:"autoincr"`
 Name     string
 Email    string
 Password string
 Created  int64 `xorm:"created"`
 Updated  int64 `xorm:"updated"`
}

type UserUsecase struct {
 rpcClient v1.UserClient
}

func NewUserUsecase(client v1.UserClient) *UserUsecase {
 return &UserUsecase{
  rpcClient: client,
 }
}

func (u *UserUsecase) GetUser(ctx context.Context, user *User) (reply *v1.GetUserReply, err error) {
 req := &v1.GetUserRequest{
  Id: user.Id,
 }
 reply, err = u.rpcClient.GetUser(ctx, req)
 if err != nil {
  return nil, err
 }
 return
}

編寫 blog-client/internal/biz/biz.go 文件。

var ProviderSet = wire.NewSet(NewUserUsecase)

生成 server 源碼

cd /root/go/src/blog-client
kratos proto server api/user/v1/user.proto

編寫生成文件 internal/service/user.go。

func (s *UserService) GetUser(ctx context.Context, req *v1.GetUserRequest) (*v1.GetUserReply, error) {
 user := &biz.User{
  Id: req.Id,
 }
 reply, err := s.userUcase.GetUser(ctx, user)
 if err != nil {
  return nil, err
 }
 return &v1.GetUserReply{
  Name: reply.Name,
 }, nil
}

編寫 blog-client/internal/service/service.go 文件。

var ProviderSet = wire.NewSet(NewUserService)

添加 wire 提供者

編寫 blog-client/cmd/blog-client/wire.go 文件。

func wireApp(*conf.Server, *conf.Data, *conf.Registry, log.Logger) (*kratos.App, func(), error) {
 panic(wire.Build(server.ProviderSet, biz.ProviderSet, registry.ProviderSet, service.ProviderSet, client.ProviderSet, newApp))
}

wire 生成文件

cd /root/go/src/blog-client/cmd/blog-client
wire

運(yùn)行項(xiàng)目

cd /root/go/src/blog-client/cmd/blog
kratos run

curl 請求示例

curl -H "Content-Type: application/json" -X GET http://192.168.110.209:8001/user/get/1
{"name":"frank"}

4.總結(jié)

本文我們通過示例代碼,介紹 Kratos 項(xiàng)目怎么實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)。

需要注意的是,RPC 服務(wù)端和 RPC 客戶端的端口不能相同。

責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2024-12-23 00:22:55

2025-01-13 00:00:07

Go語言微服務(wù)

2024-12-30 00:38:23

Go語言微服務(wù)

2022-01-16 23:10:40

語言服務(wù)注冊

2022-06-17 12:05:25

微服務(wù)注冊

2025-01-06 00:00:01

KratosGo微服務(wù)

2017-06-25 13:33:25

Spring Clou微服務(wù)架構(gòu)

2022-04-26 05:36:42

服務(wù)治理模式

2021-04-20 17:20:59

SpringColud EurekaNetflix開發(fā)

2015-12-25 11:00:52

Zookeeper的Python

2023-09-07 23:25:34

微服務(wù)服務(wù)發(fā)現(xiàn)

2023-06-02 08:33:43

微服務(wù)架構(gòu)服務(wù)注冊

2023-11-29 16:21:30

Kubernetes服務(wù)注冊

2022-08-14 07:04:44

微服務(wù)架構(gòu)設(shè)計(jì)模式

2023-12-13 07:19:01

微服務(wù)架構(gòu)Golang

2018-09-14 09:23:03

微服務(wù)服務(wù)集成

2022-01-26 09:36:53

Consul語言微服務(wù)

2021-01-14 09:55:21

Java微服務(wù)Go

2020-10-14 15:37:04

Goconsul接口

2021-03-05 11:09:46

Go框架微服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲综合精品 | 国产美女久久久 | 国产乱码精品1区2区3区 | a级片在线| 久草免费电影 | 日韩av高清在线 | 日韩一级黄色毛片 | 国产一区二区三区 | 91视频播放 | 国产aⅴ爽av久久久久久久 | 国产激情视频在线观看 | 亚洲视频在线看 | 青青草在线视频免费观看 | 一区二区在线观看av | 中文字幕一区二区三区四区五区 | a国产一区二区免费入口 | 日本亚洲一区二区 | 精品欧美一区二区在线观看视频 | 国产一区二区视频免费在线观看 | 在线国产视频 | 欧美日韩高清一区二区三区 | www.久久久久久久久久久久 | 精品美女视频在线观看免费软件 | 91在线观看 | 搞av.com| 久草青青 | 国产农村一级片 | 伊人在线| 欧美在线一区二区三区 | 精品乱码一区二区三四区 | 欧美日韩中文在线 | 欧美一区二区三区在线观看视频 | 中文字幕av第一页 | 欧美性视频在线播放 | 国产精品久久久久久久岛一牛影视 | 日韩精品福利 | 一区日韩 | 欧美三级电影在线播放 | 日韩在线国产 | 日韩av成人在线观看 | 欧美一级欧美一级在线播放 |