[干货分享] 让.NET应用秒变微服务

本帖最后由 李白云 于 2018-4-28 09:25 编辑

随着近年来微服务的发展,许多团队开始将自己的单体应用改造为微服务。通常Java或Go的应用可以通过业界已有的微服务框架作为微服务开发和改造的底座,封装掉解决跨网络问题带来的复杂性。但以Chassis模式进行的微服务改造有两大问题:多语言框架支持问题和侵入式改造代码问题。
在这个基础上SideCar模式提供了另外一种接入分布式环境的方式,它使原有应用不与任何框架,平台或者服务绑定。对业务代码0侵入,因此不需要考虑SDK和应用如何结合,不存在较高的学习曲线和耗费较长的开发周期。这种作为基础设施层服务的存在,称为ServiceMesh。通过ServiceMesh,类似.NET或NodeJS等常见的Web应用不用考虑语言问题,寻找适合各自语言的为服务框架,也不需要侵入式修改代码就能快速接入微服务系统。
整体部署方案
从实现的角度看,CSE mesher是ServiceMesh模式的一种实现,它基于CSE GO-SDK开发,通常以SideCar的方式与业务服务部署在一起。它是一种网络代理的存在,业务服务并不感知,只需要配置其http_proxy为CSE mesher的地址即可。
下图是CSE微服务案例中在线袜子商店SockShop的一个示例。整个SockShop由七个微服务组成,其中user等服务作为服务提供者通过java-chassis或go-chassis注册到服务注册中心。另外front-end是NodeJS实现的前端服务应用,orders是实现订单服务的.NET应用,他们通过mesher接入服务注册中心和配置中心,具备了服务发现以及服务治理的基本能力。
1.png
                           在线袜子商店SockShop架构
.NET应用与mesher
订单orders服务是SockShop在线袜子商店的一个子服务,主要提供订单处理(查询订单、运费计算、创建订单),订单状态查询功能。对接mesher与orders服务,只需要配置完整的代理地址,不需要对orders服务代码做任何修改。此时orders作为服务消费者访问payment和shipping服务,将由mesher完成相关微服务的服务发现和负载均衡,并把请求转发到后端服务,整个过程orders服务本身并不感知。
  1. powershell export http_proxy=http://127.0.0.1:30101
复制代码
需要注意的是为了使请求通过代理,由mesher管理运行时,不支持使用Halkit框架的.NET服务。访问其他服务的代码可使用简单的WebRequest,示例如下。
  1. java var shipmentData = System.Text.Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(AShipment).ToString());
  2. WebRequest shipmentRequest =WebRequest.Create(AppSettings.ServiceEndpoints.ShippingServiceEndpoint);
复制代码
其中ShippingServiceEndpoint配置为http://shipping/shipping。该请求经过mesher时,shipping作为服务名在mesher中进行解析和负载均衡。
  1. json
  2. {
  3.   "ServiceEndpoints":{
  4.     "PaymentServiceEndpoint":"http://payment/paymentAuth",
  5.     "ShippingServiceEndpoint":"http://shipping/shipping"
  6.   },
  7.   "Data":{
  8.     "MongoConnection":{
  9.       "ConnectionString":"mongodb://127.0.0.1:27017/",
  10.       "Database":"data"
  11.     }
  12.   },
  13.   "Logging":{...}
  14. }
复制代码
配置和启动mesher
本例中mesher启动在本机的30101端口,.NET应用orders通过mesher与其他微服务通信。mesher本身也是通过go-chassis构建的服务,可以通过chassis.yaml配置文件配置监听地址以及对接的服务中心地址。默认的go-chassis会注册自己到本地30100端口启动的service-center。
  1. yaml
  2. protocols:
  3.   http:
  4.     listenAddress:x.x.x.x:30101 # listen addr of mesher
  5. service:
  6.   registry:
  7.     address:http://x.x.x.x:30100 # uri of service center
  8.     scope:full #set full to be able to discover other app´s service
  9.     watch:false # set if you want to watch instance change event
  10.     autoIPIndex:true # set to true if u want to resolve source IP to microservice
复制代码
为了使orders称为服务提供者需要给mesher配置环境变量SPECIFIC_ADDR为orders服务本身暴露的地址。
  1. powershell export SPECIFIC_ADDR=127.0.0.1:80
复制代码
通过mesher访问后端微服务
orders订单服务作为消费者调用payment与shipping这两个服务。这两个服务的注册通过microservice.yaml来配置自己注册的微服务名和版本,默认版本为0.01。另外可以通过配置chassis.yaml来指定应用ID,默认的应用ID为default。启动SDK接入的微服务后同样可以在service center中查询到。
yaml

微服务的私有属性
  1. service_description:
复制代码
微服务的公共属性
  1. APPLICATION_ID: sockshop
复制代码
设置http_proxy为mesher的监听地址后可以通过curl命令访问接入系统的其他服务。查看mesher日志可以看到mesher负责服务发现,解析出payment服务注册的advertise地址。
  1. powershell export http_proxy=http://127.0.0.1:30101 curl http://payment/health
复制代码
运行.NET应用
orders服务在创建订单过程包括对订单详细信息处理、调用payment服务的订单支付接口进行订单支付、调用shipping服务接口进行订单运送处理,最后将订单存入mongodb当中。换言之,Orders服务既作为订单服务的提供端,也作为支付和运送服务的消费端。在carts中添加袜子后点击[Proceed to checkout]即可在orders页面查看订单。
2.png
                       在线袜子商店SockShop主页



华为云微服务引擎 CSE ,截止到2018630 限时免费