企业开发模式里,我们的项目模块可能非常多此时我们是不能将所有模块都拉取到本地的,主要原因如下:
我们很可能并没有全部工程代码的权限
微服务集群部署非常复杂,本地部署成本太高
微服务模块众多,本地计算机性能难以支持,无法做到水平复制
因此在开发中,我们往往是将需要自己负责开发的模块拉取到本地,不是自己负责的部分依旧远程运行,然后远程和本机配合运行 。
下面这张图,首先浏览器发送请求/wg/a ---> Nginx(反向代理将请求转发到网关) --> 网关(请求转发到Nacos拿到对应微服务地址) --> Nacos(地址返回给网关)-->网关(请求转发)-->对应的微服务
虚拟机中部署了我们开发过程中常用的软件
Git私服(gogs):代码全部提交带了自己的 Git 私服,模拟企业开发的代码管理,大家也需要自行到私服拉取代码
jenkins:持续集成,目前已经添加了所有部署脚本和 Git 钩子,代码推送会自动编译,可以根据需求手动部署
nacos:服务注册中心、统一配置管理,大多数共享的配置都已经交给 nacos 处理
seata:分布式事务管理
xxl-job:分布式任务系统
es:索引库
redis:缓存库
mysql:数据库
kibana:es控制台
在公司中我们一般都是通过域名访问,需要在本地配置 hosts文件位置:
C:\Windows\System32\drivers\etc\hosts
需要管理员权限!!(粘贴在文件中)
192.168.150.101 git.tianji.com
192.168.150.101 jenkins.tianji.com
192.168.150.101 mq.tianji.com
192.168.150.101 nacos.tianji.com
192.168.150.101 xxljob.tianji.com
192.168.150.101 es.tianji.com
192.168.150.101 api.tianji.com
192.168.150.101 www.tianji.com
192.168.150.101 manage.tianji.com
浏览器输入www.nacos.tianji.com浏览器会找到hosts文件,文件里有域名能对上,(拿到后面的本机地址)就到虚拟机里找到Nginx(http默认端口80,Nginx端口也是80),在Nginx.conf配置文件里面通过server_name对应名字-->proxy_pass 找到对应的软件
在Linux里找软件命令: find / -name nginx
Gogs:代码托管
Jenkins:编译和部署
项目基于Jenkins 实现了持续集成,每当我们 push 代码时,就会触发项目完成自动编译和打包。而需要运行某个微服务时,我们只需要经过两步:
1.访问 jenkins 控制台
2.点击对应微服务后面的运行按钮
此时访问 Nacos 控制台,可以看到微服务都成功注册了:
点击会到gogs拉取代码(tj-gateway),将代码做成镜像,将镜像运行成容器
对于需要开发功能的微服务,则需要在本地部署,不过首先我们要把代码拉取下来(git)
将代码克隆到 IDEA 工作空间中
注意切换分支!!!
master:主分支,对外发布版本
dev(lesson-init):开发分支, 所有程序员共用分支
feature-0627-bug:每个功能写一个
在默认情况下,微服务启用的是 dev 配置,如果要在本地运行,需要设置 profile 为 local:
可以在本地启动 TradeApplication
,然后我们去 Nacos 控制台查看 trade-service,可以看到有两个实例,分别是虚拟机 IP 和宿主机 IP:
请求过来负载均衡,就有可能分配到虚拟机的!!!
此时只需要将远程主机中的实例停止就可以了
进公司领导让看文档是考察你的第一步,一定要留痕,比如说把项目的流程看通了,直到请求是从浏览器转发的,到哪个网关,网关到哪个微服务,找一个功能看明白就可以比如说登录业务,写清楚,然后分析项目结构.
熟悉项目的第一步是熟悉项目的结构、用到的技术、编码的一些规范等。
项目结构
(1).当我们要创建新的微服务时,也必须以 tjxt
为父工程,创建一个子 module
. 例如交易微服务
(2).微服务 module
中如果有对外暴露的 Feign 接口,需要定义到 tj-api
模块中:
实体类规范
DTO:数据传输对象,在客户端与服务端间传递数据,例如微服务之间的请求参数和返回值、前端提交的表单
PO:持久层对象,与数据库表一一对应,作为查询数据库时的返回值
VO:视图对象,返回给前端用于封装页面展示的数据
QUERY:查询对象,一般是用于封装复杂查询条件
异常处理
在项目运行过程中,或者业务代码流程中,可能会出现各种类型异常,为了加以区分,我们定义了一些自定义异常对应不同场景
配置文件