• 基于OpenResty与Consul实现服务网格ServiceMesh


    一、逻辑架构

     

    1、基于OpenResty开发智能代理;

       利用其动态可编程特性,动态化配置nginx服务路由;

    2、需要向OpenResty添加weibo开源的upsync服务发现模块;

    3、基于consul建设微服务注册中心集群;

    4、服务网格中的每个node包括至少一个智能代理(openresty+consul client)、若干个微服务。 各个node和注册中心以及控制平面一起,构成一整个服务网格;

    5、每个微服务启动时需向注册中心上报自身服务信息,包括ip,端口,服务名等;该工作也可由架构师通过操作控制平面来完成。

    6、openresty根据控制平面的配置和需求使用upsync从本机的consul client pull相应的动态服务列表信息,并在本地落地做兜底,防止注册中心不可用的情况;

    7、至此,对于每个微服务:

    (1)对外访问可通过要访问的服务名由本机的智能代理提供upstream动态负载均衡访问。

    (2)对外提供服务则只需在启动时调用rest API向本机的智能代理提供自身服务信息即可(或由架构师通过控制平面手工配置);

      即,站在每个微服务的视角,它的眼里只有本机上的那个proxy,对外的服务提供和服务调用都只需要跟这个proxy打交道就可以。

      微服务就从本地各种环境地址、服务对应的ip地址和端口配置里解脱出来了,取而代之的是只需要记住本地这台proxy的端口就可以了,而这个端口是可以统一约定的(比如约定127.0.0.1:8888即为proxy地址)。

      这样,整个服务集群就可以无耦合的分为两部分:由各个node上的proxy、控制平面、注册中心组成的基础服务网格,以及代表各个业务功能的微服务。

       而由于每个node上proxy的存在,微服务对整个服务网格是无感的、反过来说也即服务网格是对微服务来说是透明的。

    二、组件功能需求

    1、智能proxy

    (1)配置并存放服务注册中心URL、配置本node需要的外部服务list。

    (2)负责发送(转发)本node上各个service的服务注册请求到服务注册中心。

    (3)根据外部服务list到服务注册中心动态获取服务详细信息,通过py脚本动态生成本地配置location、 proxy_pass、upstream等,供本node节点的service调用。

    2、服务注册中心

    (1)存储各service服务信息

    (2)高可用、无单点故障问题

    (3)有统一的管理界面用于各个node和service的查看、健康监控等

    (4)提供rest API用于服务的注册、服务删除等

    三、服务治理平台(控制平面)

    1. 注册功能

    将服务(如spring boot)注册到service catalog存储上(kv存储也可以,优先service catelog)

    2. 下发脚本并执行

    通过访问consul http restful api接口(端口8500),获取服务列表,并调用控制平面脚本、根据conf文件模板生成nginx.conf文件,通过ansible下发到调用方nginx所在服务器上。

    3. 监控功能

    分为日常监控和部署后的结果监控。

    如在日常监控方面,可能要监控以下相关内容

    3.1 服务健康状况,包括openresty及spring boot服务,要能识别出服务hang住但进程仍然存在的情况。

    3.2 日志监控,包括openresty的access.log,error.log等,以及业务服务的日志

    3.3 流量异常,请求超时异常等等其他监控内容

    4. 持续发布

    进行jar包上传到目标服务器,停止原进程,启动新进程

    5. 高可用保证机制

    1. consul集群是否要持久化,其持久化机制是什么?  server节点为有状态持久化节点,client为无状态非持久化节点。

       consul集群中只有server节点参与选举,由raft算法决定leader。

    2. 下发脚本并执行需要每个虚拟机、每个虚拟机来执行,避免脚本全部失败导致所有服务不可用等等。

    3. 安全方面需有服务间、节点间访问控制机制。

    最终实现的效果

    每个虚拟机(node)上会配置一个openresty和一个consul client两者共同组成智能proxy(即sidecar设计模式中的边车),两者均启动在某个固定的port

    当我们新增加一个服务时,需要执行以下方法:

    1. 通过服务治理平台(控制平面)的持续发布功能,部署服务。

    2. 在部署完成之后,调用服务治理平台的注册功能,将其注册到本机的consul client中,由consul rpc协议与流言协议同步到整个consul集群;

       另外,将此虚拟机要访问的外部服务,及本地dump文件路径,按照控制平面本地的conf文件模板,生成对应的conf文件。

    3. 执行其对应的conf文件下发脚本,完成openresty reload。

    4. 在openresty启动完成后,执行监控功能,看openresty配置是否生效。

    实践:

          登录企鹅家cloud充值,然后先安装openresty:

    sudo yum install yum-utils

    sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

    sudo yum install openresty

    安装完了验证一下:

    #查看版本信息

    openresty -v

    ll /usr/local/

  • 相关阅读:
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    mysql备份及恢复
    mysql备份及恢复
    mysql备份及恢复
  • 原文地址:https://www.cnblogs.com/lyhero11/p/11713252.html
Copyright © 2020-2023  润新知