本文内容:

通过cse mesher,用一个rest server,一个client,创建微服务,并实现服务发现和调用。

本文的参考意义:

mesher支持多语言,本文提供的server/client,读者可根据开发习惯,使用任何语言实现。只要满足以下要求,任何语言均可使用cse mesher:

1,server提供rest接口

2,client设置http代理,同时请求url格式为:http://{serviceName}/api


环境准备:

1,一个华为云账号,及该账号的ak/sk,请参考这里。

2,一个rest server,提供"/hello"接口。

Go示例:

package main

import (
	"log"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	msg := "Hello, Mesher!"
	log.Println(msg)
	w.WriteHeader(http.StatusOK)
	w.Write([]byte(msg + "\n"))
}
func main() {
	http.DefaultServeMux.HandleFunc("/hello", hello)
	err := http.ListenAndServe("127.0.0.1:80", http.DefaultServeMux)
	if err != nil {
		log.Fatal(err)
	}
}
复制代码

3,一个rest client。

Go示例:

package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
)

func main() {
	proxy, _ := url.Parse("http://127.0.0.1:30101") //将mesher设置为http代理
	c := http.Client{
		Transport: &http.Transport{
			Proxy: http.ProxyURL(proxy),
		},
	}
	u := "http://myServer/hello" //访问myServer,使用服务名进行访问
	req, err := http.NewRequest(http.MethodGet, u, nil)
	if err != nil {
		log.Fatal(err)
	}
	resp, err := c.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	r, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Get response: %s", string(r))
}

复制代码

Curl示例:

curl -x http://127.0.0.1:30101  http://myServer/hello  # -x用于指定http代理
复制代码

备注:

如何指定http代理,不同的语言,以及在不同的代码中,方法不同。部分语言的默认http client会自动识别环境变量http_proxyHTTP_PROXY作为http代理。若无法自动识别这两个环境变量,读者可自行在代码中设置,如本文client示例。

4,mesher软件包,从这里下载

mesher复制两份,分别给server/client使用:



网络拓扑:



操作步骤

1,启动server端

./server
复制代码

2,为server端绑定一个mesher

2.1 进入server端mesher目录:

cd myServer/mesher/
复制代码

2.2 在conf/microservice.yaml里配置server端服务名:

APPLICATION_ID: mesher
service_description:
  name: myServer #服务名
  version: 0.0.1
复制代码

2.3 在conf/auth.yaml里配置aksk:

cse:
  credentials:
    accessKey: ***
    secretKey: ***
    project:
复制代码

2.4 在conf/chassis.yaml里配置mesher监听地址:

cse:
  protocols:
    http:
      listenAddress: 192.168.1.22:30111 #监听地址,填外部ip
复制代码

2.5 为mesher设置环境变量SPECIFIC_ADDR

export SPECIFIC_ADDR=127.0.0.1:80 #用于设置mesher的后端服务地址,即我的go server监听地址
复制代码

2.6 启动mesher

./mesher
复制代码

2.7 确认mesher是否启动成功:



mesher成功为后端进行代理(注意:此处的请求是发送至mesher)

网络拓扑的右侧已经ok

2.8 登录华为云CSE服务治理界面,可以看到mesher已经为我们注册了一个微服务:



3,为client端绑定一个mesher

3.1 进入client端mesher目录

cd myClient/mesher/
复制代码

3.2 在conf/microservice.yaml里配置client端服务名:

APPLICATION_ID: mesher
service_description:
  name: myClient #服务名
  version: 0.0.1
复制代码

3.3 在conf/auth.yaml里配置aksk:

cse:
  credentials:
    accessKey: ***
    secretKey: ***
    project:
复制代码

3.4 在conf/chassis.yaml里配置mesher监听地址:

cse:
  protocols:
    http:
      listenAddress: 192.168.1.22:30101 #监听地址,填外部ip
复制代码

3.5 启动mesher

./mesher
复制代码

注意:

mesher启动后实际监听两个地址:


在设置http代理时,只能设置127.0.0.1:30101,不可以设置192.168.1.22:30101 即http proxy必须设置为: http://127.0.0.1:{meshPort}


3.6 登录华为云CSE服务治理界面,可以看到mesher已经为我们注册了两个微服务:



4,启动client端

curl client:



go client:



5,登录华为云CSE服务治理界面,可以看到两个微服务产生调用关系