GoLang
本章节帮助文档致力使用 Java/GoLang 快速构建一个远程服务调用的过程。
GoLang 服务端
func TestServer(t *testing.T) {
	// 创建 服务端 和 连接 注册中心
	nacosServer := server.NewNettyServer("192.168.67.191:9527", "127.0.0.1:8848", serializer.JsonSerializerCode)
	// 发布 服务
	nacosServer.PublishService(&cn_fyupeng_service.HelloWorldServiceImpl{})
	// 启动服务 并 监听 客户端请求
	err := nacosServer.Start()
	if err != nil {
		log.Fatal("start nacosServer failed:", err)
	}
}
GoLang 客户端
在上一篇有所介绍,创建代理来调用服务,能够增强客户端调用的功能,获取代理对象时,搭配使用注解 @Reference ,能够轻松使用它的几个属性:
| # | 属性名 | 默认值 | 备注 | 支持 | 
|---|---|---|---|---|
| 1 | name | "" | 服务名,默认为全限定类名 | ✔ | 
| 2 | group | "" | 服务分组,默认为空字符串,Nacos 默认存储"DEFAULT_GROUP" | ✔ | 
| 3 | retries | 2 | 服务重试次数,客户端对同一个请求有容错重试的机会,直到重试达到阈值,在多节点分布式服务中使用更有优势。 | ✖ | 
| 4 | giveTime | 1 | 服务重试让出时间,服务在一次调用失败后,并不会立即重试,设计的初衷是让所有线程都有机会获得CPU使用权,在高并发场景下能避免服务失败链锁反应。 | ✖ | 
| 5 | timeout | 3000 | 服务超时时间, 服务超时是一种逻辑上的处理,它允许客户端等待接收服务返回结果的逻辑最大时间,并不会限制服务真正执行的时间,它与服务异步时间搭配时间会有很明显的优势。 | ✖ | 
| 6 | asyncTime | 0 | 服务异步时间,是相对于异步模式而言的,限制客户端等待服务返回结果的最大时间,阻塞模式下不限制等待最长时间。 | ✖ | 
GoLang 同样不直接使用 客户端来手动解析用户请求,往往由客户端代理帮助我们主动去创建。
func TestProxy(t *testing.T) {
	// 直连 方式(不使用 注册中心 和 负载均衡)
	//client := client.NewNettyClientDirect("192.168.67.191:9527", serializer.JsonSerializerCode)
	// 通过 注册中心负载获取
	client := client.NewNettyClient2Alone(load_balancer.NewRandLoadBalancer(), serializer.JsonSerializerCode, "127.0.0.1:8848")
	h := aop.NewClientProxy(client)
	h.AddAnnotation(&annotation.Annotation{
		GroupName:   "1.0.0",
		ServiceName: "cn.fyupeng.service.HelloWorldService",
	})
	h.Invoke(reflect.TypeOf((*cn_fyupeng_service.HelloWorldService)(nil)), "SayHello", []interface{}{"这是go代理端"})
}
从 Java 编写的客户端代码再来看 GoLang 的代码,你会发现,有一些瑕疵和别扭,而且生态圈也不如 Java 那般完善,这是事实,但不可否认的是,GoLang 的协程和性能已经内存方面就非常的优秀。
GoLang 服务接口
接口作为规范,服务端和客户端都必须实现,并且接口需要完成相同。
package cn_fyupeng_service
type HelloWorldService interface {
	SayHello(message string) string
}
GoLang 服务实现
| # | 属性名 | 默认值 | 备注 | 支持 | 
|---|---|---|---|---|
| 1 | name | "" | 服务名,需要在使用注册中心负载时生效,使用直连不生效。默认为全限定类名 | ✔ | 
| 2 | group | "" | 服务分组,需要在使用注册中心负载时生效,使用直连不生效。默认为空字符串,将从注册中心 `Nacos` 获取默认存储"DEFAULT_GROUP" | ✔ | 
提示
GoLang 没有 Java 提供的注解,它提供了标签的语法,可以用于序列化或用于其他功能。
这里规范了 annotation 这种 RNF 独有的标签,只有使用它并标记上标签值,才会对服务标记上对应的属性。
package cn_fyupeng_service
type HelloWorldServiceImpl struct {
	name  string `annotation:"cn.fyupeng.service.HelloWorldService"`
	group string `annotation:"1.0.0"`
}
func (helloService *HelloWorldServiceImpl) SayHello(message string) string {
	return "GoLang say: I have receive your message: " + message
}