Skip to content

Commit cab5b29

Browse files
authored
optimize: the registered address (#90)
* optimize: the registered address * add license
1 parent 66c5157 commit cab5b29

File tree

6 files changed

+741
-12
lines changed

6 files changed

+741
-12
lines changed

etcd/etcd_test.go

+154
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,15 @@ import (
1818
"context"
1919
"encoding/json"
2020
"fmt"
21+
"io/ioutil"
22+
"net/url"
23+
"os"
2124
"testing"
2225
"time"
2326

27+
"github.com/cloudwego/hertz/pkg/app/client/discovery"
28+
"github.com/stretchr/testify/require"
29+
2430
"github.com/cloudwego/hertz/pkg/app"
2531
"github.com/cloudwego/hertz/pkg/app/client"
2632
"github.com/cloudwego/hertz/pkg/app/middlewares/client/sd"
@@ -31,6 +37,7 @@ import (
3137
"github.com/cloudwego/hertz/pkg/protocol/consts"
3238
"github.com/stretchr/testify/assert"
3339
clientv3 "go.etcd.io/etcd/client/v3"
40+
"go.etcd.io/etcd/server/v3/embed"
3441
)
3542

3643
var (
@@ -267,3 +274,150 @@ func TestEtcdRegistryWithHertz(t *testing.T) {
267274
assert.Equal(t, 0, status1)
268275
assert.Equal(t, "", string(body1))
269276
}
277+
278+
func TestEtcdRegistryWithAddressBlank(t *testing.T) {
279+
s, endpoint := setupEmbedEtcd(t)
280+
rg, err := NewEtcdRegistry([]string{endpoint})
281+
require.Nil(t, err)
282+
rs, err := NewEtcdResolver([]string{endpoint})
283+
require.Nil(t, err)
284+
285+
infoList := []registry.Info{
286+
{
287+
ServiceName: "registry-etcd-test",
288+
Addr: utils.NewNetAddr("tcp", "[::]:8888"),
289+
Weight: 27,
290+
Tags: map[string]string{"hello": "world"},
291+
},
292+
{
293+
ServiceName: "registry-etcd-test-suffix",
294+
Addr: utils.NewNetAddr("tcp", "127.0.0.1:9999"),
295+
Weight: 27,
296+
Tags: map[string]string{"hello": "world"},
297+
},
298+
}
299+
300+
// test register service
301+
{
302+
for _, info := range infoList {
303+
err = rg.Register(&info)
304+
require.Nil(t, err)
305+
306+
desc := rs.Target(context.TODO(), &discovery.TargetInfo{
307+
Host: info.ServiceName,
308+
Tags: info.Tags,
309+
})
310+
result, err := rs.Resolve(context.TODO(), desc)
311+
require.Nil(t, err)
312+
address, err := rg.(*etcdRegistry).getAddressOfRegistration(&info)
313+
require.Nil(t, err)
314+
expected := discovery.Result{
315+
CacheKey: info.ServiceName,
316+
Instances: []discovery.Instance{
317+
discovery.NewInstance(info.Addr.Network(), address, info.Weight, info.Tags),
318+
},
319+
}
320+
require.Equal(t, expected, result)
321+
}
322+
}
323+
324+
// test deregister service
325+
{
326+
for _, info := range infoList {
327+
err = rg.Deregister(&info)
328+
assert.Nil(t, err)
329+
}
330+
}
331+
teardownEmbedEtcd(s)
332+
}
333+
334+
func TestEtcdRegistryWithEnvironmentVariable(t *testing.T) {
335+
s, endpoint := setupEmbedEtcd(t)
336+
err := os.Setenv(hertzPortToRegistry, "8899")
337+
if err != nil {
338+
return
339+
}
340+
err = os.Setenv(hertzIpToRegistry, "127.0.0.2")
341+
if err != nil {
342+
return
343+
}
344+
345+
rg, err := NewEtcdRegistry([]string{endpoint})
346+
require.Nil(t, err)
347+
rs, err := NewEtcdResolver([]string{endpoint})
348+
require.Nil(t, err)
349+
350+
infoList := []registry.Info{
351+
{
352+
ServiceName: "registry-etcd-test",
353+
Addr: utils.NewNetAddr("tcp", "[::]:8888"),
354+
Weight: 27,
355+
Tags: map[string]string{"hello": "world"},
356+
},
357+
{
358+
ServiceName: "registry-etcd-test-suffix",
359+
Addr: utils.NewNetAddr("tcp", "10.122.1.108:9999"),
360+
Weight: 27,
361+
Tags: map[string]string{"hello": "world"},
362+
},
363+
}
364+
365+
// test register service
366+
{
367+
for _, info := range infoList {
368+
err = rg.Register(&info)
369+
require.Nil(t, err)
370+
371+
desc := rs.Target(context.TODO(), &discovery.TargetInfo{
372+
Host: info.ServiceName,
373+
})
374+
result, err := rs.Resolve(context.TODO(), desc)
375+
require.Nil(t, err)
376+
address, err := rg.(*etcdRegistry).getAddressOfRegistration(&info)
377+
require.Nil(t, err)
378+
expected := discovery.Result{
379+
CacheKey: info.ServiceName,
380+
Instances: []discovery.Instance{
381+
discovery.NewInstance(info.Addr.Network(), address, info.Weight, info.Tags),
382+
},
383+
}
384+
require.Equal(t, expected, result)
385+
}
386+
}
387+
388+
// test deregister service
389+
{
390+
for _, info := range infoList {
391+
err = rg.Deregister(&info)
392+
require.Nil(t, err)
393+
}
394+
}
395+
os.Unsetenv(hertzPortToRegistry)
396+
os.Unsetenv(hertzIpToRegistry)
397+
teardownEmbedEtcd(s)
398+
}
399+
400+
func setupEmbedEtcd(t *testing.T) (*embed.Etcd, string) {
401+
endpoint := fmt.Sprintf("unix://localhost:%06d", os.Getpid())
402+
u, err := url.Parse(endpoint)
403+
require.Nil(t, err)
404+
dir, err := ioutil.TempDir("", "etcd_resolver_test")
405+
require.Nil(t, err)
406+
407+
cfg := embed.NewConfig()
408+
cfg.LCUrls = []url.URL{*u}
409+
// disable etcd log
410+
cfg.LogLevel = "panic"
411+
cfg.Dir = dir
412+
413+
s, err := embed.StartEtcd(cfg)
414+
require.Nil(t, err)
415+
416+
<-s.Server.ReadyNotify()
417+
return s, endpoint
418+
}
419+
420+
func teardownEmbedEtcd(s *embed.Etcd) {
421+
s.Close()
422+
_ = os.RemoveAll(s.Config().Dir)
423+
}

etcd/go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ require (
77
github.com/cloudwego/hertz v0.6.0
88
github.com/stretchr/testify v1.8.2
99
go.etcd.io/etcd/client/v3 v3.5.7
10+
go.etcd.io/etcd/server/v3 v3.5.7
1011
)

0 commit comments

Comments
 (0)