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

1

基础配置

5376db46cb3842f9c3772f55f2c3dcf9.png

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

90abdd63fd22184dd9a18b34c8980434.gif

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

05f15a81dbe6555110793a612dd6a52c.gif

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

294fbba588536d2631c97f2bc9ef9cd6.gif

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

2

服务部署

8973fed0a92ce030a4a7976c431b2791.gif

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

e23b1fbce85d20cc3ea7c708aca71713.gif

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

ffc451f583c98307a1119746e57eba2e.gif

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

5710c6524c611489e3e6b2012398ffc3.gif

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

52ff5947c971987d5f853c164d8ef394.gif

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

efc746bc824dd35c575019801a792a22.gif

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

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

dadebfd388d1981469b89b916937a426.gif

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

744eca40e01642fe880fd94f0fdf5fa0.png

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

41dc2927636369c12b7a6cbffd24f6fd.gif

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

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

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

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

4784ae6ba98ffdd4952723d9ea9aa206.gif

之后,我们按照相同方式依次对各服务进行部署配置。注意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

外部访问

c09ae8d7659a52d8cc86328bdfb3b8ca.gif

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

04be4516c8a6b900341de14b6ea97eb2.gif

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

93045c45299fd5c2df168a1a9a493039.gif

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

cb4ac033ef6731ab51fd31f89d3790ec.gif

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

8494c02b2c292cef9f358e6da6208d04.gif

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

4

补充说明

97500a2e827a325a30e6d5834239f5d4.png

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

a1a8c58cc1c34902699f6acb4f49a743.png

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

6eca1b0e1ffe160b7a856c4547da7290.png

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

72b629ade5706285184cc02def36b69b.png

end

e7cca1acb45919a0531883414fe364f5.png

461966eb8437f28bae058f77fd300867.png

7b3d911ab56e1de83eeb5efe4f0e1cd8.png

更多精彩

关注我获得

222eb8a3d3429dd489a6dd8a286781b3.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode之Sqrt(x)

1、题目 Implement int sqrt(int x). Compute and return the square root of x. Subscribe to see which companies asked this question. 2、代码实现 public class Solution {public int mySqrt(int x) {if (x < 0)return -1;if (x 0)return 0; if (x 1) return 1;int …

offsetTop和scrollTop的差别

近期想写个组件&#xff0c;结果被这两个属性搞的有点晕&#xff0c;查了下文档和资料&#xff0c;对这两个属性总结例如以下&#xff1a; 一直以来对offsetLeft&#xff0c;offsetTop&#xff0c;scrollLeft&#xff0c;scrollTop这几个方法非常迷糊&#xff0c;花了一天的时间…

php post授权编写,php模拟post行为代码总结(POST方式不是绝对安全)

GET行为比较简单&#xff0c;POST比较复杂一些。这里提供两种方法供选择&#xff1a;第一&#xff1a;手写代码。第二&#xff1a;利用HttpClient php类库第一种方法&#xff1a;PHP代码$flag 0;//要post的数据$argv array(var1>abc,var2>你好吗);//构造要post的字符串…

走向思考

走向思考 最近因为工作的原因&#xff0c;好几天没有更新文章了...... 今天下午面试回来(以失败告终)&#xff0c;睡了一觉&#xff0c;夜里不困&#xff0c;于是就写了写说起工作(我指的是软件行业&#xff0c;其他专业也雷同)&#xff0c;怎么说呢&#xff1f;只有亲身体会才…

quartz (一) 基于 Quartz 开发企业级任务调度应用

本文转自&#xff1a;http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/ Quartz 基本概念及原理 Quartz Scheduler 开源框架 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目&#xff0c;完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购&…

C# 11 中的参数 null 检查

C# 11 中的参数 null 检查IntroC# 11 将引入一个新的操作符 !! 来简化我们代码中的对于参数的 null 检查&#xff0c;昨天发布的 .NET 7 Preview 1 已经支持了这一语法&#xff0c;感兴趣的不妨来试一下吧&#xff0c;下面我们就来看一下如何使用吧Prepare如果你想在本地代码中…

java之简单的Callback使用总结

1、什么是Callback,什么时候需要使用Callback callback是回调的意思&#xff0c;一般我们需要2个类需要相互掉用&#xff0c;一个类把数据动态传递给另外一个类的时候&#xff0c;可以用这种方式&#xff0c;比如Android里面的Launcher类和LauncherModel类&#xff0c;Launcher…

2017-03-10Git版本回退

1再次修改内容&#xff1a;Git is a distributed version control system. Git is free software distributed under the GPL. 2提交&#xff1a;$ git add readme.txt$ git commit -m "append GPL" [master 3628164] append GPL 1 file changed, 1 insertion(), 1 d…

cms的 php代码,KingCMS/PHP可执行代码

实例:Example :{king:title/}{king:content/}作者:{king:_author/}上面的代码没有什么特别的地方&#xff0c;但客户的要求有了变化&#xff0c;他想在详细页的内容开始前调用缩略图&#xff0c;没有则忽略。所以问题也来了&#xff0c;因为有的文章有缩略图&#xff0c;有的没…

Android之用命令uninstall卸载apk和用 -i 过滤日志忽略大小写

1、卸载apk adb uninstall package adb uninstall ***.apk 上面是正确的&#xff0c;记得是加包名&#xff0c;不是apk 2、过滤日志忽略大小写 adb logcat | grep -i launcher 记住是需要加上 -i

CentOS单机安装k8s并部署.NET 6程序

学习云原生&#xff0c;k8s 是一个基础&#xff0c;为了做一些实验&#xff0c;单机部署是最方便的&#xff0c;下面将介绍在 CentOS 中单机安装 k8s &#xff0c;并将一个 .NET 6 的程序发布到 k8s 中。环境宿主机&#xff1a;Mac 10.15.7CentOS版本&#xff1a;7.6内存&#…

Elementary OS 系统Java8环境的配置

Elementary OS刚安装完后中文包语言包有点不全&#xff0c;安装后去设置——语言里面更新下后注销就可以了1&#xff0c;官网下载完安装包后直接解压2&#xff0c;设置环境变量安装VIM的情况下直接sudo vi /etc/profile按I健进行编辑&#xff0c;ti添加以下内容&#xff1a;exp…

php session缓存,扫盲:php session缓存至memcached中的方法

memcached是一套分布式的快取系统&#xff0c;当初是DangaInteractive为了LiveJournal所发展的&#xff0c;但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件&#xff0c;以BSDlicens更改为&#xff1a;session.save_handler memcachesession.save_path"tcp://12…

《随笔记录》20170310

1 爱一个人&#xff0c;最低层次的是想通过对方实现某种上位&#xff0c;这是一种寄生的心理&#xff1b;可贵一些的&#xff0c;是把自己认为最好的理所当然地认为对方也会喜欢而强迫对方接纳&#xff0c;这是失了尊重之心&#xff1b;再好一点就是&#xff0c;只是单纯地对对…

MASA Framework - DDD设计(2)

Clean Architecture国内对于Clean Architecture的翻译很多&#xff0c;干净/整洁/清晰。但无论哪一种都说明了它简洁、清晰的特性。早期它长这样看到这张图的同学可能会对另外一张图有印象洋葱架构(Onion)现在长这样看起来好像是亲戚&#xff0c;它们的确也有着千丝万缕的关系分…

Android之什么时候调用onSaveInstance方法的时候(为什么按Home键盘会调用,按Back不调用)

1、函数介绍 1)、onCreate(Bundle savedInstanceState) 方法 Activity 创建时回调 : 该方法会自动传入一个 Bundle 对象, 该 Bundle 对象就是上次被系统销毁时在 onSaveInstanceState 或者 onRestoreInstanceState 中保存的数据 -- 注意 : 只有是系统自动回收的时候才会保存…

SublimeText2 快捷键一览表

Sublime Text比起Notepad&#xff0c;UltraEdit之类Code编辑器来说&#xff0c;其功能有过之而无不及&#xff0c;配合着各种插件使用&#xff0c;Sublime Text在实际的使用中变得非常的顺手——当然&#xff0c;如果你还不顺手&#xff0c;那就请顺手写个插件吧。而在众多功能…

SpringMVC核心分发器DispatcherServlet分析[附带源码分析]

目录 前言DispatcherServlet初始化过程DispatcherServlet处理请求过程总结参考资料前言 SpringMVC是目前主流的Web MVC框架之一。 如果有同学对它不熟悉&#xff0c;那么请参考它的入门blog&#xff1a;http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本…

proto2语法

proto文件 protobuf的定义是通过proto文件进行定义的&#xff0c;一个标准的类型如下&#xff1a; message SearchRequest {required string query 1;optional int32 page_number 2 [default 10];optional int32 result_per_page 3; } 其中message定义了类型名字&#xff0…

WPF 展示视频修改为WriteableBitmap

WPF开发者QQ群&#xff1a;340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇&#xff0c;进行WriteableBitmap性能优化修改后运行对比如下&#xff1a;前&#xff08;C…