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 ,如下图:

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

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

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

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

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

之后,我们按照相同方式依次对各服务进行部署配置。注意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网关对应的服务,点击右侧 按钮,选择“编辑外网访问”,在访问方式中选择NodePort并点击“确定”。Kubesphere会随机分配一个端口号,我们也可以在服务列表中点击“编辑配置文件”来指定端口号,端口号的范围必须在30000-32767之间。

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

4.补充说明

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

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

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

ABP vNext微服务架构详细教程——项目部署的更多相关文章

  1. 基于 abp vNext 微服务开发的敏捷应用构建平台 - 项目介绍

    缘起 目前使用ABP框架已经将近3年了,大大小小的项目也陆陆续续做了很多.由于现有信息系统的架构模式是在底层的技术平台上直接构建信息系统并采用技术主导,使用业务无关的编程工具来开发信息系统的缺陷使得系 ...

  2. [Abp vNext微服务实践] - 添加中文语言

    简介 abp vNext中提供了多语言功能,默认语言是英文,没有提供中文语言包.在业务开发中,定义权限后需要用中文的备注提供角色选择,本篇将介绍如何在abp vNext中加入中文语言. step1:添 ...

  3. [Abp vNext微服务实践] - 文章目录

    简介 ABP vNext是volosoft的新一代框架,ABP(vNext)完全使用.NET CORE和DDD(领域驱动)打造,目前GitHub已有6K+次提交,发布版本超过40次,Nuget包下载量 ...

  4. [Abp vNext微服务实践] - 服务通讯

    简介 服务通讯是微服务架构中必不可少的功能,服务通讯的效率决定了微服务架构的优略.常用的微服务通讯策略有两种,分别是rpc.http,其中rpc以gRpc框架为代表使用者最多.abp vNext微服务 ...

  5. [Abp vNext微服务实践] - 启动流程

    前几篇分别介绍了abp vNext微服务框架和微服务CI/CD环境搭建,本篇开始介绍vNext微服务框架的开发环境搭建. 环境准备 官方介绍的系统架构图如下: 上图中身份服务和网关服务已经集成在系统中 ...

  6. [Abp vNext微服务实践] - 业务开发

    前几篇分别介绍了abp vNext微服务框架.开发环境搭建和vue element admin前端框架接入,在vue element admin中实现用户角色管理基本功能后就可以开始进行业务开发了,本 ...

  7. [Abp vNext微服务实践] - 前后端分类

    一.前景 abp vNext是ABP 开源 Web应用程序框架,是abp的新一代开源web框架.框架完美的集成.net core.identity server4等开源框架,适用于构建web应用程序和 ...

  8. abp vNext微服务框架分析

    本文转载自:https://www.cnblogs.com/william-xu/p/11245738.html abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了 ...

  9. [Abp vNext微服务实践] - 框架分析

    一.简介 abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究.我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.n ...

  10. 基于 abp vNext 微服务开发的敏捷应用构建平台 - 文章目录

    系列文章: <基于 abp vNext 微服务开发的敏捷应用构建平台 - 设计构想> [点击查看] <基于 abp vNext 微服务开发的敏捷应用构建平台 - 文章目录> [ ...

随机推荐

  1. docker的使用以及常用命令

    查看docker镜像仓库中是否存在某个镜像,通常第一个或stars最多的就是我们要是使用的,以nginx为例 # 搜索一下是否存在该镜像文件 docker search nginx # 安装使用该镜像 ...

  2. linux 安装ssl 失败原因

    配置文件成功的情况下打不开:开放端口 设置端口 server { listen 443 default ssl; //需要加不然会显示404 default ssl server_name 域名; s ...

  3. Oracle 存储过程4:PL/SQL动态执行DDL语句

  4. node.js 新手快速入门

    我当初学的时候,是在大大们的指导下开始学习的,用了3天搞定大大们给的任务.下面我就把这个经历分享出来,让大家借鉴一下.欢迎吐槽~~ 任务如下: 根据Node js 开发入门教程第五章的一个使用node ...

  5. Dockerfile参考

    From openjdk:8u252-jdkENV MEMORY_SIZE {{ MEMORY_SIZE | default (1024) }}MENV PROJECT_NAME {{PROJECT_ ...

  6. xlsx 前端导出Excel

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 062_Apex使用Assert

    assert关键字用法简单,但是使用assert往往会让你陷入越来越深的陷阱中.应避免使用.总结了以下原因:   1.用assert代替if是陷阱之二.assert的判断和if语句差不多,但两者的作用 ...

  8. holiday06-英语语法-语序和五种基本句式

    第六天 英语五种基本句式: 基本句式一:S V (主+谓) 基本句式二:S V P (主+系+表) 基本句式三:S V O (主+谓+宾) 基本句式四:S V o O(主+谓+间宾+直宾) 基本句式五 ...

  9. eclipse中同步git代码报错checkout conflict with files

    1.Team--->Synchronize Workspace 2.在同步窗口找到冲突文件,把自己本地修改的复制出来 3.在文件上右键选择 Overwrite----->Yes , 4.再 ...

  10. Leetcode习题集-链表

    这里记录一些我刷题的思路方便之后进行复习重温,同时也方便进行添加 P141-环形链表 class Solution { public: bool hasCycle(ListNode *head) { ...