1 安装

(1) docker拉取consul镜像

docker pull consul

(2) 运行consul容器

docker run -d —name=consul —restart=always -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600/udp consul:latest agent -dev -client=0.0.0.0

端口详解

  • 8500 : http 端口,用于 http 接口和 web ui访问;
  • 8300 : server rpc 端口,同一数据中心 consul server 之间通过该端口通信
  • 8301 : serf lan 端口,同一数据中心 consul client 通过该端口通信; 用于处理当前datacenter中LAN的gossip通信
  • 8302 : serf wan 端口,不同数据中心 consul server 通过该端口通信; agent Server使用,处理与其他datacenter的gossip通信;
  • 8600 : dns 端口,用于已注册的服务发现;

    2 访问后台

    http://192.168.1.103:8500/

    dig @192.168.1.103 -p 8600 consul.service.consul SRV

3 py服务注册

consul_api.py

  1. import requests
  2. headers = {
  3. "contentType": "application/json"
  4. }
  5. BASE_URL = "http://127.0.0.1:8500"
  6. def register_http(name, id, address, port, *tags):
  7. url = f"{BASE_URL}/v1/agent/service/register"
  8. rsp = requests.put(url=url, headers=headers, json={
  9. "Name": name,
  10. "ID": id,
  11. "Address": address,
  12. "Port": port,
  13. "Tags": tags,
  14. "Check": { # 健康检查
  15. "HTTP": f"http://{address}:{port}/health",
  16. "Timeout": "5s",
  17. "Interval": "5s",
  18. "DeregisterCriticalServiceAfter": "15s",
  19. }
  20. })
  21. if rsp.status_code == 200:
  22. print("注册成功")
  23. else:
  24. print(f"注册失败: {rsp.status_code}")
  25. def register_grpc(name, id, address, port, *tags):
  26. url = f"{BASE_URL}/v1/agent/service/register"
  27. rsp = requests.put(url=url, headers=headers, json={
  28. "Name": name,
  29. "ID": id,
  30. "Address": address,
  31. "Port": port,
  32. "Tags": tags,
  33. "Check": { # 健康检查
  34. "GRPC": f"{address}:{port}",
  35. "GRPCUseTLS": False,
  36. "Timeout": "5s",
  37. "Interval": "5s",
  38. "DeregisterCriticalServiceAfter": "15s",
  39. }
  40. })
  41. if rsp.status_code == 200:
  42. print("注册成功")
  43. else:
  44. print(f"注册失败: {rsp.status_code}")
  45. def deregister(id):
  46. url = f"{BASE_URL}/v1/agent/service/deregister/{id}"
  47. rsp = requests.put(url, headers=headers)
  48. if rsp.status_code == 200:
  49. print("注销成功")
  50. else:
  51. print(f"注销失败: {rsp.status_code}")
  52. def filter_service(name):
  53. url = f"{BASE_URL}/v1/agent/services"
  54. params = {
  55. "filter": f'Service == "{name}"'
  56. }
  57. rsp = requests.get(url, params=params).json()
  58. for key, value in rsp.items():
  59. print(key)
  60. print(rsp)
  61. if __name__ == '__main__':
  62. register_http("user_api", "user_api", "192.168.1.103", 8021)
  63. register_grpc("user_srv", "user_srv", "192.168.1.103", 50051)
  64. # deregister("mxshop_srv")
  65. # filter_service("mxshop_srv")

image.png

4 go服务注册

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/hashicorp/consul/api"
  5. )
  6. func RegisterHttp(name string, id string, address string, port int, tags []string) error {
  7. cfg := api.DefaultConfig()
  8. cfg.Address = fmt.Sprintf("%s:%d", address, 8500)
  9. client, err := api.NewClient(cfg)
  10. if err != nil {
  11. panic(err)
  12. }
  13. // 生成对应的检查对象
  14. check := &api.AgentServiceCheck{
  15. HTTP: fmt.Sprintf("http://%s:%d/health", address, port),
  16. Timeout: "5s",
  17. Interval: "5s",
  18. DeregisterCriticalServiceAfter: "10s",
  19. }
  20. // 生成注册对象
  21. registration := new(api.AgentServiceRegistration)
  22. registration.Name = name
  23. registration.ID = id
  24. registration.Port = port
  25. registration.Tags = tags
  26. registration.Check = check
  27. err = client.Agent().ServiceRegister(registration)
  28. if err != nil {
  29. fmt.Println(err.Error())
  30. panic(err)
  31. }
  32. return nil
  33. }
  34. func AllServices() {
  35. // 获取所有服务
  36. cfg := api.DefaultConfig()
  37. cfg.Address = "192.168.1.103:8500"
  38. client, err := api.NewClient(cfg)
  39. if err != nil {
  40. panic(err)
  41. }
  42. data, err := client.Agent().Services()
  43. if err != nil {
  44. panic(err)
  45. }
  46. for key, _ := range data {
  47. fmt.Println(key)
  48. }
  49. }
  50. func FilterService() {
  51. cfg := api.DefaultConfig()
  52. cfg.Address = "192.168.1.103:8500"
  53. client, err := api.NewClient(cfg)
  54. if err != nil {
  55. panic(err)
  56. }
  57. data, err := client.Agent().ServicesWithFilter(`Service == "user_srv"`)
  58. if err != nil {
  59. panic(err)
  60. }
  61. for key, _ := range data {
  62. fmt.Println(key)
  63. }
  64. }
  65. func main() {
  66. //_ = RegisterHttp("user_api2", "user_api2", "192.168.1.103", 8021, []string{"mxshop"})
  67. //AllServices()
  68. FilterService()
  69. }