这是kratos官方挂出的框架设计出发点,比如 简单,高效,扩展性,容错性是十分契合go开发风格的。然而kratos这个框架,无疑将go的这些特性进行了放大。接下来,我会分享一些在使用过程中比较好用的组件与kratos框架结合使用示列。
分享组件之前,先根据官网的快速开始把示列跑起来 https://go-kratos.dev/docs/getting-started/start 跑起来之后 curl http://127.0.0.1:8000/helloworld/kratos
试试服务是否正常?我这里本地已经能正常访问了
mac@macdeMBP helloworld-kratos % curl 'http://127.0.0.1:8000/helloworld/kratos-xyt'
{"message":"Hello kratos-xyt"}%
mac@macdeMBP helloworld-kratos %
基本现在所有的服务都会有配置文件,配置文件的优点是把一些可变的参数或者配置放在配置文件里面,当变更时直接更新配置文件即可,不用修改代码。kratos推荐了config和apollo两种配置组件,这里咱们分享config的使用。
配置文件基本配置如下:
service:
name: config
version: v1.0.0
http:
server:
address: 0.0.0.0:8000
timeout: 1s
grpc:
server:
address: 0.0.0.0:9000
timeout: 1s
// 初始化一个config
c := config.New(
config.WithSource(
file.NewSource(flagconf),
),
)
if err := c.Load(); err != nil {
panic(err)
}
// 其中一种方式是定义config的结构体,将config的配置解析到结构v中
var v struct {
Service struct {
Name string `json:"name"`
Version string `json:"version"`
} `json:"service"`
}
if err := c.Scan(&v); err != nil {
panic(err)
}
log.Printf("config: %+v", v)
// 另一种方式是直接通过config的目录接口获取值
name, err := c.Value("service.name").String()
if err != nil {
panic(err)
}
log.Printf("service: %s", name)
kratos是一个微服务框架,微服务的重要组成部分之一就是注册中心,注册中心一般会提供服务注册和服务发现功能, kratos推荐了注册中心组件主要包括有etcd,nacos,consul,zookeeper等,咱们这里主要分享一个由go开发的注册中心组件etcd。
client端etcd使用示列如下:
//初始化client
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"},
})
//初始化etcd
r := etcd.New(cli)
//初始化grpc
connGRPC, err := grpc.DialInsecure(
context.Background(),
//配置服务端注册到etcd的servername
grpc.WithEndpoint("discovery:///helloworld"),
grpc.WithDiscovery(r),
)
server端etcd使用示列如下:
//初始化etcd client
client, err := etcdclient.New(etcdclient.Config{
Endpoints: []string{"127.0.0.1:2379"},
})
//初始化grpc服务端,配置端口9000
grpcSrv := grpc.NewServer(
grpc.Address(":9000"),
grpc.Middleware(
recovery.Recovery(),
),
)
//将服务注册到etcd里面,服务名为helloworld
r := etcd.New(client)
app := kratos.New(
kratos.Name("helloworld"),
kratos.Server(
grpcSrv,
),
kratos.Registrar(r),
)
http router路由组件常用比较多,比如go官方的路由标准库,gin路由框架,echo框架,mux框架,对于咱们微服务来说, 与大部分客户端通信一般都是通过http协议,所以选择一款合适http路由框架十分重要,不仅能使提升代码的阅读性,还能提高我们的开发效率。咱们这里就主要分享如何在kratos中集成使用gin来做http路由。
gin使用示列如下:
func main() {
//初始化一个默认路由实例
router := gin.Default()
// 使用kratos中间件
router.Use(kgin.Middlewares(recovery.Recovery(), customMiddleware))
//配置url及路由目的地方法
router.GET("/helloworld/:name", func(ctx *gin.Context) {
name := ctx.Param("name")
if name == "error" {
// 返回kratos error
kgin.Error(ctx, errors.Unauthorized("auth_error", "no authentication"))
} else {
ctx.JSON(200, map[string]string{"welcome": name})
}
})
//初始化一个http server 并监听端口8000
httpSrv := http.NewServer(http.Address(":8000"))
httpSrv.HandlePrefix("/", router)
//new一个kratos app
app := kratos.New(
kratos.Name("gin"),
kratos.Server(
httpSrv,
),
)
}
kratos微服务框架更像是微服务工具的集合,可以集成市面上比较主流的微服务组件,具有简洁,易扩展,易上手等特点。通过kratos提供的工具可以快速的搭建一套微服务系统,具体请参考官方文档:https://go-kratos.dev/docs/。
本文分享自 FreeSWITCH中文社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!