一、逻辑架构

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/

基于OpenResty与Consul实现服务网格ServiceMesh的更多相关文章

  1. 基于 OpenResty 的动态服务路由方案

    2019 年 5 月 11 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙武汉站,又拍云首席布道师在活动上做了< 基于 OpenResty ...

  2. 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片

    目录 第一部分:Consul 基础 1,Consul 介绍 2,安装 Consul Ubuntu/Debian 系统 Centos/RHEL 系统 检查安装 3,运行 Consul Agent 启动 ...

  3. 简单RPC框架-基于Consul的服务注册与发现

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  4. .NET Core微服务之基于Consul实现服务治理

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...

  5. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

  6. 基于OpenResty和Node.js的微服务架构实践

    什么是微服务? 传统的单体服务架构是单独服务包,共享代码与数据,开发成本较高,可维护性.伸缩性较差,技术转型.跨语言配合相对困难.而微服务架构强调一个服务负责一项业务,服务可以单独部署,独立进行技术选 ...

  7. 基于 orange(nginx+openresty) + docker 实现微服务 网关功能

    摘要 基于 orange(nginx+openresty) + docker 实现微服务 网关功能 ;以实现 docker 独立容器 来跑 独立语言独立环境 在 同一个授权下 运行相关组合程序..年初 ...

  8. 基于Docker的Consul服务发现集群搭建

    在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架 ...

  9. 基于Docker的Consul集群实现服务发现

    服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的. ...

随机推荐

  1. 把我坑惨的一个MySQL双引号!

    来源:For DBA www.fordba.com/mysql-double-quotation-marks-accident.html 一.前言 最近经常碰到开发误删除误更新数据,这不,他们又给我找 ...

  2. 可重入锁:ReentrantLock理解使用

    (一)可重入性 可重入性描述这样的一个问题:一个线程在持有一个锁的时候,它内部能否再次(多次)申请该锁.如果一个线程已经获得了锁,其内部还可以多次申请该锁成功.那么我们就称该锁为可重入锁.通过以下伪代 ...

  3. 是否有任何python库可以从自然语言中解析日期和时间?

    我正在寻找的是可以将“明天早上6点”或“中午的下一个模拟”转换为适当的日期时间对象. 解决方案 parsedatetime - 能够解析“人类可读”日期/时间表达式的Python模块. #!/usr/ ...

  4. qs.parse()、qs.stringify()使用方法, 以及在axios 中怎么用?

    最近一直被纠结于传输格式,就在这里整理一下吧. qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装.   (axios 自带qs , // import qs from ' ...

  5. v-distpicker 一个好用的三级联动的插件

    // 引入插件npm install v-distpicker --save import VDistpicker from 'v-distpicker' Vue.component('v-distp ...

  6. Python之lambda && reduce

    lambda类似于C里面的#define或者C++里面的内联函数(inline),一般都小巧精悍 >>> g=lambda x,y:x*y >>> g(3,7) 2 ...

  7. 使用TPL取回Task中的运行结果的三种方式

    概念:TPL( Task Parallel Library) 任务并行库 使用Task类执行多线程操作要比直接使用自己手工创建Thread效率高很多. 默认情况下,TPL使用线程池中的线程执行Task ...

  8. linux 7 安装KVM

    首先,在安装GUI的linux 7系统下,安装KVM 执行命令 #yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-insta ...

  9. Python爬虫实战——反爬机制的解决策略【阿里】

    这一次呢,让我们来试一下"CSDN热门文章的抓取". 话不多说,让我们直接进入CSND官网. (其实是因为我被阿里的反爬磨到没脾气,不想说话--) 一.URL分析 输入" ...

  10. windows线程函数必须为全局函数或者静态函数(转)

    调用CreateThread(...)创建线程时要指定所创建线程的入口函数,此入口函数只能是全局函数或者类的静态成员函数. 全局函数很容易理解,但如果是类的成员函数则必须是静态成员函数,为何, 因为类 ...