consul安装和配置

  • 网址传送门 consul官网

  • 使用docker部署 ```bash docker run -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600/udp consul consul agent -dev -client=0.0.0.0

docker container update —restart=always 容器名字

  1. consul提供web界面,可以访问ip:8500进行访问(前提 防火墙已配置)
  2. - web展示
  3. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/280095/1607615636834-e72c52b5-b615-4553-88f9-54c3f6296b15.png#align=left&display=inline&height=164&margin=%5Bobject%20Object%5D&name=image.png&originHeight=328&originWidth=1894&size=33018&status=done&style=none&width=947)<br />看到如上图说是 表示已成功部署,默认已注册一个服务
  4. <a name="FYoMW"></a>
  5. # consul API接口
  6. <a name="YmJow"></a>
  7. ## go
  8. ```go
  9. package main
  10. import (
  11. "fmt"
  12. "github.com/hashicorp/consul/api"
  13. )
  14. func Register(address string, port int, name string, tags []string, id string) error {
  15. cfg := api.DefaultConfig()
  16. // consul 服务地址
  17. cfg.Address = "127.0.0.1:8500"
  18. client, err := api.NewClient(cfg)
  19. if err != nil {
  20. panic(err)
  21. }
  22. //生成对应的检查对象
  23. check := &api.AgentServiceCheck{
  24. // 健康检查 API
  25. HTTP: "http://127.0.0.1:port/health", // 健康检查接口
  26. Timeout: "60s",
  27. Interval: "60s",
  28. DeregisterCriticalServiceAfter: "10s",
  29. }
  30. //生成注册对象
  31. registration := new(api.AgentServiceRegistration)
  32. registration.Name = name
  33. registration.ID = id
  34. registration.Port = port
  35. registration.Tags = tags
  36. registration.Address = address
  37. registration.Check = check
  38. err = client.Agent().ServiceRegister(registration)
  39. if err != nil {
  40. panic(err)
  41. }
  42. return nil
  43. }
  44. func AllServices() {
  45. cfg := api.DefaultConfig()
  46. // 当然是consul的地址了
  47. cfg.Address = "127.0.0.1:8500"
  48. client, err := api.NewClient(cfg)
  49. if err != nil {
  50. panic(err)
  51. }
  52. data, err := client.Agent().Services()
  53. if err != nil {
  54. panic(err)
  55. }
  56. for key := range data {
  57. fmt.Println(key)
  58. }
  59. }
  60. func FilterSerivice() {
  61. cfg := api.DefaultConfig()
  62. // 当然是consul的地址了
  63. cfg.Address = "127.0.0.1:8500"
  64. client, err := api.NewClient(cfg)
  65. if err != nil {
  66. panic(err)
  67. }
  68. data, err := client.Agent().ServicesWithFilter(`Service == "user-web"`)
  69. if err != nil {
  70. panic(err)
  71. }
  72. for key := range data {
  73. fmt.Println(key)
  74. }
  75. }
  76. func main() {
  77. // 这是服务的地址
  78. _ = Register("62.234.113.102", 8082, "user-web", []string{"shop", "shinxb"}, "user-web")
  79. //AllServices()
  80. //FilterSerivice()
  81. }

Py

  • base.py ```python import abc

class Register(metaclass=abc.ABCMeta): @abc.abstractmethod def register(self, name, service_id, address, port, tags: list,check): pass

@abc.abstractmethod
def deregister(self, service_id):
    pass

@abc.abstractmethod
def get_all_service(self, service_id):
    pass

@abc.abstractmethod
def filter_service(self, filter):
    pass

- consul.py
```python
import requests
from loguru import logger
from common.register.base import Register


class ConsulRegister(Register):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.headers = {
            "contentType": "application/json"
        }

    def register(self, name, service_id, address, port, tags: list,check=None):
        url = f"http://{self.host}:{self.port}/v1/agent/service/register"
        if check is None:
            check = {
                "GRPC": f'{address}:{port}',
                "GRPCUseTLS": False,
                "Timeout": "5s",
                "Interval": "5s",
                "DeregisterCriticalServiceAfter": "5s",
            }
        rsp = requests.put(url, headers=self.headers, json={
            "Name": name,
            "ID": service_id,
            "Tags": tags,
            "Address": address,
            "Port": port,
            "Check":check,
        })
        if rsp.status_code == 200:
            logger.info("注册成功")
        else:
            logger.info(f"注册失败:{rsp.status_code}")

    def deregister(self, service_id):
        url = f"http://{self.host}:{self.port}/v1/agent/service/deregister/{service_id}"
        rsp = requests.put(url, headers=self.headers)
        if rsp.status_code == 200:
            print("注销成功")
        else:
            print(f"注销失败:{rsp.status_code}")

    def get_all_service(self, service_id):
        url = f"http://{self.host}:{self.port}/v1/agent/service"
        rsp = requests.get(url, headers=self.headers)
        if rsp.status_code == 200:
            print("获取服务列表成功")
        else:
            print(f"获取服务成功列表失败:{rsp.status_code}")

    def filter_service(self, filter):
        url = f"http://{self.host}:{self.port}/v1/agent/services"
        params = {
            "filter": filter
        }
        rsp = requests.get(url, params=params).json()
        for key, value in rsp.items():
            print(key)