ディレクトリ
マイクロサービスを行ってフレームワークKRATOSの研究ノート4(KRATOSウォーデン-クイックスタートウォーデン-直接的な方法のクライアント・コール)
看守ダイレクト
この記事ではKRATOS看守、KRATOS看守のダイレクトコネクトクライアントは、デモのサンプルプロジェクトを行うために直接私を最初に研究されて呼び出します
デモサーバー
grpc-サーバーを作成するために使用します
kratos new grpc-server
grpc・サーバ・インタフェースを作成すると、コールサーバーを呼び出します
kratos new call-server
そのディレクトリの2つのサービスがあります。
[I:\VSProject\kratos-note\warden\direct]$ tree
卷 办公 的文件夹 PATH 列表
卷序列号为 00650064 0007:32FD
I:.
├─call-server
│ ├─api
│ ├─cmd
│ ├─configs
│ ├─internal
│ │ ├─dao
│ │ ├─di
│ │ ├─model
│ │ ├─server
│ │ │ ├─grpc
│ │ │ └─http
│ │ └─service
│ └─test
└─grpc-server
├─api
├─cmd
├─configs
├─internal
│ ├─dao
│ ├─di
│ ├─model
│ ├─server
│ │ ├─grpc
│ │ └─http
│ └─service
└─test
私たちの背後にあるコールサーバとの直接呼び出しgrpc grpcサーバ・インタフェース。
grpc.toml
grpcサーバアドレスを追加したコールサーバは、これは私の9003である一方で、ポート内の設定を変更します。
[Server]
addr = "0.0.0.0:9004"
timeout = "1s"
[Client]
addr = "0.0.0.0:9003"
timeout = "1s"
サービス登録
grpc・サーバの内部/サーバー/ grpcオープンserver.goファイルディレクトリは、次のコードを見ることができ、コメントの内容を置き換えるgRPCを開始することができ、我々はデモプロジェクトは、交換を必要としないです。
package grpc
import (
pb "grpc-server/api"
"github.com/bilibili/kratos/pkg/conf/paladin"
"github.com/bilibili/kratos/pkg/net/rpc/warden"
)
// New new a grpc server.
func New(svc pb.DemoServer) (ws *warden.Server, err error) {
var (
cfg warden.ServerConfig
ct paladin.TOML
)
if err = paladin.Get("grpc.toml").Unmarshal(&ct); err != nil {
return
}
if err = ct.Get("Server").UnmarshalTOML(&cfg); err != nil {
return
}
ws = warden.NewServer(&cfg)
// 注意替换这里:
// RegisterDemoServer方法是在"api"目录下代码生成的
// 对应proto文件内自定义的service名字,请使用正确方法名替换
pb.RegisterDemoServer(ws.Server(), svc)
ws, err = ws.Start()
return
}
そして、ダイレクトスタートgrpcサーバ
kratos run
I:/VSProject/go/pkg/mod/github.com/bilibili/[email protected]/pkg/net/rpc/warden/server.go:329 warden: start grpc listen addr: [::]:9003
サービス検出
それがいるProtobufを生成し、提出しなければならないgrpcクライアント側のインターフェースを起動するには
通常二つの方法:
1は、それらのプロト項目および実行するコード生成にファイルをコピー
2、サーバーに直接インポートAPIパッケージ
デモここではまったく同じので、私は、インポート、およびAPIファイルpb.goの内部に直接アクセスしていないサービスAPI
でinternal/dao
、ファイル内で直接変更してDAOを追加direct_client.go
direct_client.go
これは、ターゲットはサービス検出するレゾルバに利用可能な標準形式のURLリソースを使用して、サービスの発見のためのターゲットgRPCです。直接の直接接続、直接接続サーバ側のデフォルトの監視員。その他のサービスには、次の時間を参照する方法を見つけます。
package dao
import (
"context"
"github.com/bilibili/kratos/pkg/net/rpc/warden"
"google.golang.org/grpc"
)
// target server addrs.
const target = "direct://default/127.0.0.1:9003" // NOTE: example
// NewClient new member grpc client
func NewClient(cfg *warden.ClientConfig, opts ...grpc.DialOption) (DemoClient, error) {
client := warden.NewClient(cfg, opts...)
conn, err := client.Dial(context.Background(), target)
if err != nil {
return nil, err
}
// 注意替换这里:
// NewDemoClient方法是在"api"目录下代码生成的
// 对应proto文件内自定义的service名字,请使用正确方法名替换
return NewDemoClient(conn), nil
}
クライアントの直接呼び出し
以下のように変更dao.go。
demoClient、初期化democlientを行うnewDao内に直接DAOを追加し、のsayHelloインターフェイスを追加します。
package dao
import (
"context"
"time"
demoapi "call-server/api"
"call-server/internal/model"
"github.com/bilibili/kratos/pkg/cache/memcache"
"github.com/bilibili/kratos/pkg/cache/redis"
"github.com/bilibili/kratos/pkg/conf/paladin"
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/bilibili/kratos/pkg/net/rpc/warden"
"github.com/bilibili/kratos/pkg/sync/pipeline/fanout"
xtime "github.com/bilibili/kratos/pkg/time"
grpcempty "github.com/golang/protobuf/ptypes/empty"
"github.com/pkg/errors"
"github.com/google/wire"
)
var Provider = wire.NewSet(New, NewDB, NewRedis, NewMC)
//go:generate kratos tool genbts
// Dao dao interface
type Dao interface {
Close()
Ping(ctx context.Context) (err error)
// bts: -nullcache=&model.Article{ID:-1} -check_null_code=$!=nil&&$.ID==-1
Article(c context.Context, id int64) (*model.Article, error)
SayHello(c context.Context, req *demoapi.HelloReq) (resp *grpcempty.Empty, err error)
}
// dao dao.
type dao struct {
db *sql.DB
redis *redis.Redis
mc *memcache.Memcache
demoClient demoapi.DemoClient
cache *fanout.Fanout
demoExpire int32
}
// New new a dao and return.
func New(r *redis.Redis, mc *memcache.Memcache, db *sql.DB) (d Dao, cf func(), err error) {
return newDao(r, mc, db)
}
func newDao(r *redis.Redis, mc *memcache.Memcache, db *sql.DB) (d *dao, cf func(), err error) {
var cfg struct {
DemoExpire xtime.Duration
}
if err = paladin.Get("application.toml").UnmarshalTOML(&cfg); err != nil {
return
}
grpccfg := &warden.ClientConfig{}
paladin.Get("grpc.toml").UnmarshalTOML(grpccfg)
var grpcClient demoapi.DemoClient
if grpcClient, err = NewClient(grpccfg); err != nil {
return
}
d = &dao{
db: db,
redis: r,
mc: mc,
demoClient: grpcClient,
cache: fanout.New("cache"),
demoExpire: int32(time.Duration(cfg.DemoExpire) / time.Second),
}
cf = d.Close
return
}
// Close close the resource.
func (d *dao) Close() {
d.cache.Close()
}
// Ping ping the resource.
func (d *dao) Ping(ctx context.Context) (err error) {
return nil
}
// SayHello say hello.
func (d *dao) SayHello(c context.Context, req *demoapi.HelloReq) (resp *grpcempty.Empty, err error) {
if resp, err = d.demoClient.SayHello(c, req); err != nil {
err = errors.Wrapf(err, "%v", req.Name)
}
return
}
service.go
どのdao.SayHello()を呼び出します
// SayHello grpc demo func.
func (s *Service) SayHello(ctx context.Context, req *pb.HelloReq) (reply *empty.Empty, err error) {
reply = new(empty.Empty)
s.dao.SayHello(ctx, req)
fmt.Printf("hello %s", req.Name)
return
}
HTTPの最後の呼び出しのコール・サーバ・インタフェースのテスト:
私たちはコールを見ることができ、そこからGrpcサーバのログが成功し、このセクションの終わり(1'ᴗ`1)ILᵒᵛᵉᵧₒᵤ❤。