ABP vNext微服务架构详细教程——项目部署

1 基础配置

在之前的文章中,我们已经配置了Kubernetes集群并安装了管理工具Kubesphere,文章地址为:https://mp.weixin.qq.com/s/MgpdMv5A-fYxN7XY8N9Djw

登录Kubesphere页面,打开工作台,在平台资源选项卡中点击“企业空间”,进入企业空间管理页面,点击“创建”按钮,创建我们自己的企业空间。

点击进入刚刚创建的企业空间,在左侧菜单点击“项目”,打开项目面板,并点击“创建”按钮,创建一个新的项目,这里我们名称为“demoproject”。.

点击进入该项目,在菜单中找到应用负载→应用,选择自制应用,点击创建按钮,填入应用名称,暂时忽略其他步骤一直点击“下一步”到创建完成。

2 服务部署

在demoproject项目菜单中找到配置→保密字典,点击“创建”,名称输入aliyungit,用于配置阿里云镜像仓库用户名密码,输入名称后点击下一步,类型选择“镜像仓库信息”。仓库地址选择“https://”,后面输入框中输入镜像仓库公网地址以‘/’分割的第一段文字,例如镜像公网地址为 registry.cn-beijing.aliyuncs.com/zklight/productmanager ,则我们在输入框中输入 registry.cn-beijing.aliyuncs.com 。后面我们输入镜像仓库的用户名、密码,点击验证通过后点击“创建”完成该项配置。

在应用负载→应用→自制应用中找到第一章节中我们创建的应用并进入该应用管理页面,点击更多操作→添加服务,选择无状态服务。输入名称并点击“下一步”,在容器组设置中点击“添加容器”,在镜像一栏下拉选框选择刚才创建的阿里云镜像仓库地址,输入框中输入【镜像仓库命名空间】/【镜像仓库名称】,例如 zklight/productmanager ,点击回车,即可出现我们之前上传的镜像,在“端口设置”选项卡中的名称、容器端口、服务端口中分别填入该服务的端口号,例如产品管理服务的端口号为5010,则名称为“http-5010”,容器端口和服务端口均为5010。容器其他配置如果需要可依据实际情况进行配置,点击“√”并一直点击“下一步”完成服务创建。

创建完成后,在项目面板,应用负载→工作负载中可找到工作负载“productmanager-v1”,在应用负载→服务中可找到服务“productmanager”。由于生产环境和开发环境配置文件内容应该不同,所以工作负载暂时无法运行。

在项目面板左侧菜单中找到配置→配置字典,点击“创建”,输入名称“productmanagerconfig”,并点击下一步。在数据设置中点击添加数据,键我们输入 appsettings ,值我们将产品管理服务的配置文件appsettings.json的所有内容复制过来,并依据我们实际生产环境的配置修改各配置项,修改完成后点击“创建”完成配置项创建。

这里,如果我们出现服务间相互调用,则使用前面自制应用中添加服务后产生的服务名称,即应用负载→服务中的服务名称代替原IP地址或localhost,其他内容不变,Kubernetes会自动完成被调用服务的反向代理。

例如身份管理服务、订单服务、产品服务名称分别为identitymanager、ordermanager、productmanager,则在商城服务中RemoteServices配置如下:

"RemoteServices": {    "Default": {        "BaseUrl": "http://identitymanager:5000/"    },    "ProductManager": {        "BaseUrl": "http://productmanager:5010/"    },    "OrderManager": {        "BaseUrl": "http://ordermanager:5011/"    }}

 在项目面板应用负载→工作负载中找到之前创建的工作负载productmanager-v1并点击进入,点击更多操作→编辑配置。找到存储卷选项卡,点击“挂载配置字典或密保字典”,在配置字典选项卡点击“选择配置字典”,选择刚才创建的productmanagerconfig。选择“只读”,并输入 /app/appsettings.json 。勾选“选择特定键值”,键选择appsettings(如果一个配置项设置多个Key/Value也是再次区分,建议每个项目一个配置项,每个配置文件一个Key/Value),值输入 appsettings.json ,如下图:

ABP vNext微服务架构详细教程——项目部署

点击“√”并点击“确认”。

点击更多操作→编辑YAML,编辑工作负载配置文件如下:

1. 在containers选项中找到imagePullPolicy,值设置为Always,标识每次构建重新拉去镜像。

2.在containers选项中找到volumeMounts,在其中 mountPath: /app/appsettings.json 这一行下面添加同级内容 subPath: appsettings.json 。

3.点击“确定”,工作负载可运行成功则表示配置无误。

之后,我们按照相同方式依次对各服务进行部署配置。注意API网关中只配置聚合服务层和身份认证服务登录、刷新Token接口的映射。其将Routes中DownstreamHostAndPorts的Host改为对应服务在Kubernetes的service名称。具体如下:

{  "Routes": [    {      "DownstreamPathTemplate": "/api/{url}",      "DownstreamScheme": "http",      "DownstreamHostAndPorts": [        {          "Host": "identityserver",          "Port": 4100        }      ],      "UpstreamPathTemplate": "/ids/{url}",      "UpstreamHttpMethod": [ "Get","Post","Put","Delete" ]    },    {      "DownstreamPathTemplate": "/api/{url}",      "DownstreamScheme": "http",      "DownstreamHostAndPorts": [        {          "Host": "admin",          "Port": 6001        }      ],      "UpstreamPathTemplate": "/admin/{url}",      "UpstreamHttpMethod": [ "Get","Post","Put","Delete" ],      "AuthenticationOptions": {        "AuthenticationProviderKey": "DemoAuth",        "AllowedScopes": []      }    },    {      "DownstreamPathTemplate": "/api/{url}",      "DownstreamScheme": "http",      "DownstreamHostAndPorts": [        {          "Host": "store",          "Port": 6002        }      ],      "UpstreamPathTemplate": "/store/{url}",      "UpstreamHttpMethod": [ "Get","Post","Put","Delete" ],      "AuthenticationOptions": {        "AuthenticationProviderKey": "DemoAuth",        "AllowedScopes": []      }    }  ],  "GlobalConfiguration": {    "BaseUrl": "https://localhost:4000"  }}

3 外部访问

Kubesphere提供了两种Kubernetes集群对外提供服务的方式,分别是NodePort和LoadBalancer,详细介绍请参照官方文档:https://kubesphere.com.cn/docs/project-administration/project-gateway/

LoadBalancer方式需要配置负载均衡器,通常使用云服务商提供的负载均衡器实现。所以我这里只简单介绍NodePort方式,如果需要使用LoadBalancer方式可按文档自行配置。

这里我们只需要为API网关项目配置外部访问,集群外部所有访问必须通过API网关,不能直接访问其他服务。

在之前配置的demo项目中,找到应用负载→服务,在列表中找到API网关对应的服务,点击右侧ABP vNext微服务架构详细教程——项目部署 按钮,选择“编辑外网访问”,在访问方式中选择NodePort并点击“确定”。Kubesphere会随机分配一个端口号,我们也可以在服务列表中点击“编辑配置文件”来指定端口号,端口号的范围必须在30000-32767之间。

之后,我们可以通过IP地址端口号来访问我们的服务集群,IP地址可以为集群中任意一台服务器的IP地址,或者我们配置的弹性EIP的地址,端口号即为上一步分配的端口号。

4 补充说明

作为微服务架构系统,我们通常希望每一个服务都可以部署多个节点,并实现弹性伸缩。Kubesphere为我们提供了非常简单方便的配置方式,只需要在应用负载→工作负载,点击进入对应的工作负载,并点击更多操作→弹性伸缩,并按需求配置我们的副本数和伸缩规则即可。

身份认证服务如果想实现多个服务之间Token互认,也就是说A服务签发的Token在B服务也可以认证通过,一方面需要所有服务具有统一的接入地址,另一方面需要私钥文件一致。这里我们使用Kubernetes的Service作为反向代理,保证了入口统一。而ABP vNext框架生成的身份认证服务已经将私钥文件单独存放出来(tempkey.rsa),默认情况下部署时不需要做任何额外处理。

这里我们只使用了Kubernetes很少的一部分功能,无论是Kubernetes或是Kubesphere,都为我们提供了非常丰富的功能和扩展空间,可依据自己的项目需求进行选择。具体请参考它们各自官方文档。