1.4 对接微服务应用
1.4.5 Mesher 接入 CSE
1.4.5.1 Mesher 简介 什么是 Mesher
Mesher是Service Mesh的一个具体的实现,是一个轻量的代理服务以Sidecar的方式与 微服务一起运行。
Service Mesh是由William Morgan定义:
Service Mesh是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务 拓扑,Service Mesh保证请求可以在这些拓扑中可靠地传输。在实际应用当中,
Service Mesh通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一 起,但应用程序不需要知道它们的存在。
随着云原生应用的崛起,Service Mesh逐渐成为一个独立的基础设施层。在云原生模 型里,一个应用可以由数百个服务组成,每个服务可能有数千个实例,而每个实例可 能会持续地发生变化。服务间通信不仅异常复杂,而且也是运行时行为的基础。管理 好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
Service Mesh实际上就是处于TCP/IP之上的一个抽象层,假设底层的L3/L4网络能够点 对点地传输字节(同时,也假设网络环境是不可靠的,所以Service Mesh必须具备处 理网络故障的能力)。
从某种程度上说,Service Mesh有点类似TCP/IP。TCP对网络端点间传输字节的机制进 行了抽象,而Service Mesh则是对服务节点间请求的路由机制进行了抽象。Service
Mesh不关心消息体是什么,也不关心它们是如何编码的。应用程序的目标是“将某些 东西从A传送到B”,而Service Mesh所要做的就是实现这个目标,并处理传送过程中 可能出现的任何故障。
与TCP不同的是,Service Mesh有着更高的目标:为应用运行时提供统一的、应用层面 的可见性和可控性。Service Mesh将服务间通信从底层的基础设施中分离出来,让它 成为整个生态系统的一等公民——它因此可以被监控、托管和控制。
为什么要使用 Mesher
● 业务代码无须改造
● 支持老旧应用接入
● 普通应用快速成为云原生应用
● 业务代码零侵入
基本实现原理
Mesher是L7层协议代理,Mesher以Sidecar模式运行在应用所在的Pod内,与Pod共享 网络与存储:
1. Pod中的应用使用Mesher作为http代理,可以自动发现其他服务。
2. Mesher会代替Pod中的应用向注册中心注册应用相关信息,以便让其他应用发 现。
发起一次网络请求的过程中存在微服务消费者consumer和提供者provider,场景如 下:
● 场景一:仅consumer使用Mesher作为Sidecar。
provider需要自己实现服务注册发现,或者使用Java或Go Chassis开发框架,否则 通过Mesher接入的consumer无法发现provider。
应用间的网络请求如下:
consumer-> Mesher -> provider
● 场景二:consumer、provider均使用Mesher作为Sidecar。
此场景无需再使用微服务开发框架。
应用间的网络请求如下:
consumer -> Mesher -> Mesher ->provider
● 场景三:仅provider使用Mesher作为Sidecar consumer需要使用Java或者Go Chassis开发框架。
应用间的网络请求如下:
consumer-> Mesher -> provider
注意事项
应用上云后需要作出一定的配置变更。例如在Mesher所处环境外,consumer在访问 provider时使用http://IP:port/进行访问。在使用Mesher后,使用http://provider:port/
即可进行访问,接入说明将详细讲解。
1.4.5.2 接入说明
须知
不同于微服务开发框架,Mesher的能力是由ServiceStage平台提供的。您必须在 ServiceStage平台创建Mesher组件,才能使用Mesher。
本章节介绍http应用如何通过Mesher接入CSE。由于Mesher支持多语言,因此本章仅 描述通过Mesher接入CSE时的规范要求。具体的代码样例可以参考:
● .Net core接入服务网格
● PHP接入服务网格
前提条件
已开发好了一个http应用(支持多语言)。
操作步骤
步骤1 修改微服务调用的URL,将URL中的${IP:Port}修改为服务名。
例如调用一个名为“provider”的微服务,API为“/hello”,则调用URL通常为:
http://${IP:Port}/hello。例如:
http://127.0.0.1:80/hello
您需要将调用的URL修改为:
http://provider/hello
步骤2 为微服务调用请求设置http proxy,proxy的地址为:http://${IP:Port}。例如:
http://127.0.0.1:30101
若一个微服务被其他微服务调用,则该微服务的监听地址中必须包含127.0.0.1(监听 端口和其他监听地址不做限制)。
步骤3 在ServiceStage平台创建Mesher组件,请参考创建微服务组件。
须知
Mesher组件名称必须和微服务名称一致。
----结束
1.4.5.3 .Net core 接入服务网格
前提条件
通过ServiceStage部署,可以将.Net应用变为云原生应用,需要符合以下条件:
● 如果使用微服务引擎专业版,需要首先创建Mesher所需的配置,具体操作请参考 为Mesher框架微服务应用配置AK/SK。推荐使用微服务引擎专享版,无需配置。
● 待接入的程序必须支持标准http_proxy环境变量。
说明
本指南讲述的是.Net Core的接入方法,当前支持的.Net Core的版本为:2.0.9版本及以上,3.0 版本以下。
其他语言,如Python、PHP接入,仅需满足前置条件即可。
Demo 说明
用户可以使用dotnet demo示例,示例Demo包含如下两个组件:
● payment service:此组件的API为 /v1/payments,访问该服务会返回一串json。
● order service:此组件的API为 /v1/orders, 当调用/v1/payments接口时,会把 json透传回来。
ServiceStage 部署
部署应用组件前,需要:
● 已经参考创建应用创建应用。
● 已经参考创建环境创建环境,环境包含CCE集群、ELB及微服务引擎等资源。
步骤1 确保order配置文件中payment地址正确。
将payment service命名为“payment” 以代替本地127.0.0.1的寻址方式,端口需要保 留,输入以下命令。
vim order/src/appsettings.json
{ "ServiceEndpoints": {
"PaymentServiceEndpoint": "http://payment:8080"
}, ....
}
步骤2 打包payment和order的镜像。
首先选择上传到某个Region的SWR软件仓库,比如swr.cn-north-1.myhuaweicloud.com,在该Region的软件中心创建组织,比如demo,具体参 考创建组织。
打包镜像命令示例如下:
cd order/src/
sudo docker build . -t swr.cn-north-1.myhuaweicloud.com/demo/ordernet:1.0 cd payment/src/
sudo docker build . -t swr.cn-north-1.myhuaweicloud.com/demo/paymentnet:1.0
步骤3 上传镜像。
● 通过界面上传,请参考上传镜像。
● 通过命令push,示例如下:
docker push swr.cn-north-1.myhuaweicloud.com/demo/ordernet:1.0 docker push swr.cn-north-1.myhuaweicloud.com/demo/paymentnet:1.0
步骤4 创建payment应用组件,请参考创建微服务组件。
1. “选择运行时”:选择“Docker”。
2. “选择框架/服务网格”:选择“Mesher”。
3. “组件名称”:输入“payment”。
说明
应用组件名字要跟步骤1中order配置文件中的地址保持完全一致,所以名字为payment。
步骤5 部署payment组件,请参考部署组件。
1. “实例数量”:设置为1。
2. “镜像”:单击“选择镜像”,选择步骤3中上传的payment组件镜像。
3. 其他参数使用默认配置。
步骤6 创建order组件,请参考创建微服务组件。
1. “选择运行时”:选择“Docker”。
2. “选择框架/服务网格”:选择“Mesher”。
3. “组件名称”:输入“order”。
步骤7 部署order组件,请参考部署组件。
1. “实例数量”:设置为1。
2. “镜像”:单击“选择镜像”,选择步骤3中上传的order组件镜像。
3. “公网访问”:开启公网访问,“监听端口”设置为80。
4. 其他参数使用默认配置。
----结束
结果验证
等待2个组件全部部署完成 单击访问地址,如下图所示。
调用对应接口,返回json串,如下图所示。
查看微服务控制台(请参考维护微服务),会看到已经存在的服务,并且可以进行治 理,具体参考微服务治理。