Nacos服务注册和发现以及配置管理技术分享,Go中接入非常简单极易上手

picture.image

Nacos服务发现注册和配置管理分享
  1. 为什么使用Nacos

“ 因为现在主流公司已经开始推荐使用nacos了,nacos的两大主要作用:一个是服务注册发现,一个是配置管理。

  1. Nacos是什么?

picture.image

  1. Nacos的结构和组件

picture.image

picture.image

picture.image

  1. 了解几个Nacos概念

picture.image

  1. Nacos角色

picture.image

  1. 安装部署

安装和部署特别简单,支持单机部署和集群部署,详情可参考nacos的官网。部署完成之后页面长这个样子:picture.image

picture.image

对上面几个名词做下解释:picture.image

picture.image

picture.image

picture.image

  1. 配置管理

picture.image

如果有多个配置文件,我们可以使用扩展配置的方式,添加多个配置文件:picture.image

我们简单看下在spring cloud中如何配置:

  • 第一个配置,只有一个data-id,没有group,采用默认的DEFAULT_GROUP。
  • 第二个扩展配置,定义了一个GLOBAL_GROUP,全局配置。
  • 第三个扩展配置: 定义为一个自动刷新的GROUP,并设置自动刷新属性为true。

picture.image

  1. 服务发现原理

A如何调用B呢?picture.image有两个微服务A和B,A调用B,那么A是如何调用B的呢?我们可以通过http请求,进行调用,也可以使用rpc进行调用。

不管使用什么方式,A需要知道B的地址和端口号。那么A是如何知道B的地址和端口号的呢? 如上图:

  1. B服务启动的时候,会注册到服务发现中心,告诉他我的ip和端口号是什么?这里应该也是接口调用,通知服务发现中心的。

  2. A服务启动的时候,也会注册的服务发现中心,告诉他我的ip和端口号是什么? 同时服务发现中心会告诉我,当前已注册的服务的ip和端口号。这里通过一个接口请求和参数返回就可以实现。

  3. 拿到了B服务的ip和port,接下来就可以调用服务B了。

  4. Go中实践


注册:

picture.image

newNacos获取Nacos配置,然后通过client客户端将本项目所配置的自己的ip和port以及service name注册到nacos,这样nacos配置列表就会有一条记录:picture.image

gRPC发现:

  
type req struct {  
 GrpcConn *grpc.ClientConn  
}  
  
var (  
 once = sync.Once{}  
 ins  *req  
)  
  
//创建一个gRPC 客户端 ,业务代码中直接调用它就行  
func NewRequest() *req {  
 once.Do(func() {  
  confPath := "nacos.naming.test"  
  ins = &req{GrpcConn: request.NewGrpcClient(confPath)}  
 })  
 return ins  
}  
  
  
//创建一个gRPC客户端  
func NewGrpcClient(serviceConf string) *grpc.ClientConn {  
  // 获取nacos集群配置  
 nacosConf := newNacos()  
    
  // 获取注册列表  
 r, serviceName, err := naming(nacosConf, serviceConf)  
 if err != nil {  
  return nil  
 }  
    
  // 创建gRPC 客户端  
 grpcC, err := newGrpcClient(r, serviceName)  
 if err != nil {  
  return nil  
 }  
    
  //返回  
 grpcConn := grpcC.ClientConn  
 return grpcConn  
}  
  
//获取nacos集群配置  
func newNacos() *nacos.Option {  
 nacosConf := nacos.NewOption()  
 nacosConf.ClientConfig.NamespaceID = config.GetString("nacos.clientconfig.namespaceid")  
 nacosConf.ServerConfig = append(nacosConf.ServerConfig, knacos.ServerConfig{  
  IPAddr: config.GetString("nacos.serverconfig.paddr"),  
  Port:   uint64(config.GetInt64("nacos.serverconfig.port")),  
 })  
 return nacosConf  
}  
  
//通过nacos进行服务发现  
func naming(nacosConf *nacos.Option, serviceConf string) (GrpcSolverBuilder, string, error) {  
 cli, err := nacos.NewNamingClient(nacosConf)  
 if err != nil {  
  log.Panic(err)  
 }  
 r := resolver.New(cli.Client, &resolver.Option{  
  //Clusters: []string{  
  // config.GetString(serviceConf + ".clustername"),  
  //},  
  //GroupName: config.GetString(serviceConf + ".groupname"),  
 })  
 return r, config.GetString(serviceConf + ".servicename"), nil  
}  

小结

Nacos的使用非常简单,部署也非常简单,极易上手,因此在这里推荐大家使用它,原理也比较简单,希望之后能出一篇更加可操作的实战篇分享给大家。如果你觉得这篇文章对你有帮助,欢迎关注点赞分享转发。

picture.image

0
0
0
0
评论
未登录
暂无评论