zoukankan      html  css  js  c++  java
  • 基于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/

  • 相关阅读:
    weblogic 扩展集群里受管节点
    docker搭建weblogic环境
    Docker 快速删除所有容器
    转载的mysql 相关
    mysql字符集修改步骤
    ORA-12705: Cannot access NLS data files or invalid environment
    Authentication for user weblogic denied
    ONS 禁用
    Java-并发-什么是CAS机制?
    862. 和至少为 K 的最短子数组-前缀和/数组/滑动窗口-困难
  • 原文地址:https://www.cnblogs.com/lyhero11/p/11713252.html
Copyright © 2011-2022 走看看