.Net微服务实战之CI/CD(一)

简介: .Net微服务实战之CI/CD(一)

系列文章



相关源码:https://github.com/SkyChenSky/Sikiro


地基

  

在软件工程不少的思想、概念来源于建筑工程,大家也喜欢把开发软件比喻成建房子。那么如果说运维是软件的地基,那么框架就是承重墙。起房子就是先打地基,再建承重墙。地基打得越稳,房子才能起得更高。也等同于运维技术越扎实,系统才能更加健壮。

  

特别在微服务兴起得时代,运维越发的现得尤为得重要,DevOps也风靡全球。只要聊起DevOps与微服务,CI/CD总是不能避免的。CI/CD不一定限制于微服务,我认为无论在什么样风格的架构和怎么样组织架构的团队,自动化技术越早使用收效越高。

  

我认为IT人员更多是脑力大于体力的劳动者,一些重复的、错误率高的、无法对自己有增长的工作应该尽早交给自动化技术处理,节省了不需要浪费的时间与精力,这样才能更好的去完成有价值、有意义的工作。

  

2020-12-1更新,下文之前做的时候是使用了Docker部署Jenkins,在默认情况Jenkins容器是无法与宿主的Docker命令公用的,因此我使用了SSH从Jenkins容器调用宿主的方式解决。后来经过和同行沟通,使用了挂载docker.sock目录的方式,让Jenkinis容器调用宿主Docker指令的方式进行构建。为了保持原来文章的整体性,我打算在文章末尾额外加上新的方案。


部署图

image.png

  

以上是我在虚拟机环境的部署图:

  

一共三台服务器,每台服务器都装了Docker,Server B是docker swarm的Manger角色,A和C是worker。

  

在Server B装了Jenkins、Docker Registry、dotnet sdk,Server A装了Gitlab,Server C装了私有Nuget。

  

那么工作流程是:

  1. 迁入代码push到Gitlab
  2. Gitlab触发webhook的push触发事件并主动通知Jenkins构建
  3. Jenkins在Gitlab获取源码并通过配置好的规则与shell脚本进行构建


  • 如果是工具库则dotnet push到192.168.88.139:8081的私有Nuget
  • 如果是Web应用则通过dockerfile构建docker镜像并push到192.168.88.141:6000的Docker Registry,然后由docker swarm create多节点


安装Docker


安装最新版本Docker,并在所有需要使用docker的服务器节点根据以下步骤安装

升级yum并安装基础组件

yum upgrade -y

sudoyuminstall -y yum-utils device-mapper-persistent-data lvm2


添加安装源信息

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


安装docker-ce

yum makecache fast

yuminstall docker-ce -y

 

修改镜像源

vim /etc/docker/daemon.json


{
  "registry-mirrors" : [
    "http://ovfftd6p.mirror.aliyuncs.com",
    "http://registry.docker-cn.com",
    "http://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug" : true,
  "experimental" : true
}

   


启动docker

systemctl daemon-reload

systemctl enable docker

systemctl start docker


image.png


安装 Docker Registry(私有仓储)


选取一个服务器-Server B使用docker安装Registry

docker run -d -p 6000:5000 -v /root/docker_registry:/var/lib/registry --name private_registry registry


开放6000端口

firewall-cmd --permanent --add-port=6000/tcp

firewall-cmd --reload


以上就Registry安装完成了,但为了正常使用还需要做点配置修改


编辑所有需要docker registry使用的节点的daemon.json文件,确保能正常访问

vim /etc/docker/daemon.json


{
"insecure-registries":["192.168.88.141:6000"]
}
重启docker
systemctl daemon-reload
service docker restart
如果需要推送镜像到私库确保标签(tag)前缀带有私库地址
docker push 192.168.88.141:6000/testdockerswarm


image.png


docker swarm的初始化


把相关涉及到docker swarm的节点端口开启


firewall-cmd --permanent --zone=public --add-port=2377/tcp


firewall-cmd --permanent --zone=public --add-port=4789/udp


firewall-cmd --permanent --zone=public --add-port=7946/udp


firewall-cmd --reload


选取Server B作为Manager节点,执行下面的指令后会出现docker swarm join的指令文本,复制保存下来


docker swarm init --advertise-addr 192.168.88.141


Server A和Server C为Worker节点,执行刚刚保存下来指令


docker swarm join --token SWMTKN-1-0odogegq3bwui4o76aq5v05doqqvuycb5jmuckjmvzy4bfmm59-ewht2cz6fo0r39ky44uv00aq5 192.168.88.141:2377


查看节点信息

docker node ls

image.png


私有Nuget的安装


选择Server C基于docker的Nuget安装
docker run -d \
           -p 8081:80 \
           --env NUGET_API_KEY=chengong \
           -v /root/nuget/database:/var/www/db \
           -v /root/nuget/packages:/var/www/packagefiles \
           --name nuget-server \
           sunside/simple-nuget-server
开放相关8081端口
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
上传包指令,注意包名有中文会导致上传出现bad request
dotnet nuget push --source http://192.168.88.139:8081/ -k chengong TestPackage.1.0.0.nupkg
删除包指令
dotnet nuget delete --source http://192.168.88.139:8081/ -k chengong  TestPackage 1.0.0
如果在Windowsx系统可以通过工具上传
https://github.com/NuGetPackageExplorer/NuGetPackageExplorer


image.png


Gitlab的安装


在Server A服务器上基于docker安装

sudo docker run -d \

 --hostname192.168.88.138 \

 -p 443:443 -p 8080:80 -p 2222:22 \

 --name gitlab \

 --restart always \

 -v /root/gitlab/config:/etc/gitlab:Z \

 -v /root/gitlab/logs:/var/log/gitlab:Z \

 -v /root/gitlab/data:/var/opt/gitlab:Z \

 gitlab/gitlab-ce


开放端口

firewall-cmd --permanent --add-port=8080/tcp

firewall-cmd --reload



相关文章
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1638 3
|
存储 NoSQL API
微服务——MongoDB实战演练——需求分析
本文档《5-MongoDB实战演练》聚焦于某头条文章评论业务的需求分析与功能实现。基于MongoDB,需完成以下功能:1)提供基本的增删改查API;2)支持通过文章ID查询相关评论;3)实现评论点赞功能。结合实际业务场景,演示MongoDB在数据存储与操作中的应用,附带示意图帮助理解业务结构。
314 2
微服务——MongoDB实战演练——需求分析
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
672 102
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章评论的基本增删改查
本节介绍了文章评论的基本增删改查功能实现。首先,在`cn.itcast.article.dao`包下创建数据访问接口`CommentRepository`,继承`MongoRepository`以支持MongoDB操作。接着,在`cn.itcast.article.service`包下创建业务逻辑类`CommentService`,通过注入`CommentRepository`实现保存、更新、删除及查询评论的功能。最后,新建Junit测试类`CommentServiceTest`,对保存和查询功能进行测试,并展示测试结果截图,验证功能的正确性。
385 2
|
NoSQL Java MongoDB
微服务——MongoDB实战演练——文章评论实体类的编写
本节主要介绍文章评论实体类的编写,创建了包`cn.itcast.article.po`用于存放实体类。具体实现中,`Comment`类通过`@Document`注解映射到MongoDB的`comment`集合,包含主键、内容、发布时间、用户ID、昵称等属性,并通过`@Indexed`和`@CompoundIndex`注解添加单字段及复合索引,以提升查询效率。同时提供了Mongo命令示例,便于理解和操作。
324 2
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
1072 4
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
1586 2
Spring Boot 3.x 微服务架构实战指南
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc("likenum")`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
360 0
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
328 0
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章微服务模块搭建
本节介绍文章微服务模块的搭建过程,主要包括以下步骤:(1)创建项目工程 *article*,并在 *pom.xml* 中引入依赖;(2)配置 *application.yml* 文件;(3)创建启动类 *cn.itcast.article.ArticleApplication*;(4)启动项目,确保控制台无错误提示。通过以上步骤,完成文章微服务模块的基础构建与验证。
272 0