首页 文章 精选 留言 我的

精选列表

搜索[分布式锁],共10000篇文章
优秀的个人博客,低调大师

打包微服务前后端分离项目并部署到服务器 --- 分布式 Spring Cloud + 页面渲染 Nu

前言 Spring Cloud项目属于微服务项目,也就是含有多个Sping Boot模块集合而成的项目 Nuxt.js项目属于前端基于Vue的服务端渲染项目 最近在服务器部署上线了一个基于Spring Cloud + 服务端渲染技术Nuxt.js的项目,在这里记录一下 一、部署后端 1、打包 步骤: 在pom.xml中加入打包依赖 在IDEA中点击clean、选择install打包成jar包 在target文件夹中可以看到打包的jar包 注意:如果target文件夹中出现多个jar包,.jar.original 是普通jar包,不包含依赖,.jar 是可执行jar包,包含了pom.xml中的所有依赖,可以直接用java -jar 命令执行。 打包Spring Cloud项目中的每个模块加入打包依赖 比如在gateway模块 在pom.xml加入以下代码 <build> <finalName>service-gateway</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> 然后再IDEA中maven插件中点击 相互依赖的模块怎么打包? 比如A模块依赖B模块,就需要在A模块引用B模块的依赖中加入<scope>compile</scope>,否则打包的时候会显示报错 A模块中的pom.xml文件 <dependency> <groupId>com.zfz</groupId> <artifactId>common-util</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> 再点击IDEA中的clean和install打包jar包 2、上传jar包到服务器 保证需要的jar包和Dockerfile、docker-compose.yml文件在同一目录 3、构建镜像 创建Dockerfile文件,举例gateway模块 FROM java:8 MAINTAINER ADD service-gateway.jar app.jar EXPOSE 80 ENTRYPOINT ["java","-jar","app.jar"] 在XShell命令行工具中输入以下命令,构建镜像 docker build -t service-gateway . 以此类推,把所有想要构建的镜像都用以上命令构建出来 最后输入docker images查看构建镜像 4、运行容器 创建docker-compose.yml文件 version: '3.1' services: service-gateway: image: service-gateway ports: - "80:80" restart: "always" container_name: service-gateway volumes: - /root/service-gateway.jar:/root/cloud/service-gateway.jar entrypoint: java -jar /root/cloud/service-gateway.jar 服务名: image: 已存在的镜像名称 ports: - 映射端口 restart: "always" container_name: 容器名称 volumes: - 挂载路径 entrypoint: 构建容器后,运行命令 ...... 在XShell命令行工具中输入以下命令,一键部署jar包 docker-compose up -d 如果不识别这个命令,可能原因就是没有安装docker-compose 安装教程: # 安装 curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予管理员权限 chmod +x /usr/local/bin/docker-compose # 重启docker service docker restart # 查看版本信息 docker-compose --version 最后输入docker ps查看运行中的jar包 二、部署前端 1、上传前端文件到服务器 2、构建镜像 创建Dockerfile文件 # 指定node环境 FROM node:14.16.0 # 作者 MAINTAINER # node环境为生产环境 ENV NODE_ENV=production # 允许所有ip访问 ENV HOST 0.0.0.0 RUN mkdir -p /app COPY . /app WORKDIR /app # 暴露端口 EXPOSE 3000 # 使用淘宝镜像 RUN npm config set registry https://registry.npm.taobao.org # 下载依赖 RUN npm install RUN npm run build CMD ["npm", "start"] 在XShell命令行中进入到/root/app目录中,输入以下命令,构建镜像,等待如图结果,表示成功 docker build -t nuxt . 最后再输入命令docker images查看构建镜像 3、运行容器 创建容器,并且运行 docker run -d --restart=always --name nuxt -p 3000:3000 nuxt 最后再输入命令docker ps查看正在运行的容器 弄完之后,记得在阿里云安全组中,开启3000端口,运行访问 公网访问nuxt项目,http://域名:3000/

优秀的个人博客,低调大师

分布式技术专题-中间件容器的实现原理(1)Tomcat的原理之架构设计模式

Tomcat的设计模式分析 Tomcat 中运用的许多经典设计模式,如模版模式、工厂模式和单例模式等。通过学习它们的实践运用能给我们以后的软件设计起到一定的借鉴作用。 门面设计模式 门面设计模式在 Tomcat中有多处使用,在 Request 和 Response 对象封装中Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到了这种设计模式 门面设计模式的原理 顾名思义,就是将一个东西封装成一个门面好与人家更容易进行交流,就像一个国家的外交部一样。 这种设计模式主要用在一个大的系统中有多个子系统组成时,多个子系统肯定要涉及到相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其它系统,不然就没有必要划分子系统了。 每个子系统都会设计一个门面,把别的系统感兴趣的数据封装起来,通过这个门面来进行访问。这就是门面设计模式存在的意义。 门面设计模式示意图如下: Client 只能访问到 Façade 中提供的数据是门面设计模式的关键,至于Client 如何访问 Façade 和 Subsystem 如何提供 Façade 门面设计模式并没有规定死。 Tomcat 的门面设计模式示例 Tomcat 中门面设计模式使用的很多,因为 Tomcat 中有很多不同组件,每个组件要相互交互数据,用门面模式隔离数据是个很好的方法。 下面是 Request 上使用的门面设计模式 从图中可以看出 HttpRequestFacade 类封装了 HttpRequest 接口能够提供数据,通过 HttpRequestFacade 访问到的数据都被代理到HttpRequest 中,通常被封装的对象都被设为 Private 或者Protected 访问修饰,以防止在 Façade 中被直接访问。 观察者设计模式 设计模式也是常用的设计方法通常也叫发布 - 订阅模式,也就是事件监听机制,通常在某个事件发生的前后会触发一些操作。 观察者模式的原理 观察者模式原理也很简单,就是你在做事的时候旁边总有一个人在盯着你,当你做的事情是它感兴趣的时候,它就会跟着做另外一些事情。但是盯着你的人必须要到你那去登记,否则你不会允许它盯着你或者监视着你的。 观察者模式通常包含下面这几个角色: Subject 就是抽象主题:它负责管理所有观察者的引用,同时定义主要的事件操作。 ConcreteSubject 具体主题:它实现了抽象主题的所有定义的接口,当自己发生变 化时,会通知所有观察者。 Observer 观察者:监听主题发生变化相应的操作接口。 Tomcat 的观察者模式示例 Tomcat 中观察者模式也有多处使用,前面讲的控制组件生命周期的 Lifecycle 就是这种模式的体现,还有对 Servlet 实例的创建、Session 的管理、Container 等都是同样的原理。下面主要看一下Lifecycle 的具体实现。 Lifecycle 的观察者模式结构图: 上面的结构图中,LifecycleListener 代表的是抽象观察者,它定义一个 lifecycleEvent 方法,这个方法就是当主题变化时要执行的方法。 ServerLifecycleListener 代表的是具体的观察者,它实现了LifecycleListener 接口的方法,就是这个具体的观察者具体的实现方式。 Lifecycle 接口代表的是抽象主题,它定义了管理观察者的方法和它要所做的其它方法。而 StandardServer 代表的是具体主题,它实现了抽象主题的所有方法。这里 Tomcat 对观察者做了扩展,增加了另外两个类:LifecycleSupport、LifecycleEvent,它们作为辅助类扩展了观察者的功能。 LifecycleEvent使得可以定义事件类别,不同的事件可区别处理,更加灵活。 LifecycleSupport 类代理了主题对多观察者的管理,将这个管理抽出来统一实现,以后如果修改只要修改 LifecycleSupport 类就可以了,不需要去修改所有具体主题, 因为所有具体主题的对观察者的操作都被代理给 LifecycleSupport类了。这可以认为是观察者模式的改进版。实际执行者就是LifecyleSupport去执行 LifecycleSupport 调用观察者的方法代码如下: 清单 1. LifecycleSupport 中的 fireLifecycleEvent 方 public void fireLifecycleEvent(String type, Object data) { LifecycleEvent event = new LifecycleEvent(lifecycle, type, data); LifecycleListener interested[] = null; synchronized (listeners) { interested = (LifecycleListener[]) listeners.clone(); } for (int i = 0; i < interested.length; i++) interested[i].lifecycleEvent(event); } } 主题是怎么通知观察者呢?看下面代码: 清单 2. 容器中的 start 方法 public void start() throws LifecycleException { lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null); lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; synchronized (services) { for (int i = 0; i < services.length; i++) { if (services[i] instanceof Lifecycle) ((Lifecycle) services[i]).start(); } } lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null); } 命令设计模式 Tomcat 中两个核心组件 Connector 和 Container,比作一对夫妻。男的将接受过来的请求以命令的方式交给女主人。对应到 Connector 和 Container,Connector 也是通过命令模式调用Container 的。 命令模式的原理 下面是命令模式通常包含下面几个角色: Client:创建一个命令,并决定接受者 Command 命令:命令接口定义一个抽象方法 ConcreteCommand:具体命令,负责调用接受者的相应操作 Invoker 请求者:负责调用命令对象执行请求 Receiver 接受者:负责具体实施和执行一次请求 Tomcat 中的命令模式的示例 Tomcat 中命令模式在 Connector 和 Container 组件之间有体现,Tomcat 作为应用服务器,无疑会接受到很多请求,如何分配和执行这些请求是必须的功能。 下面看一下 Tomcat 是如何实现命令模式的结构图 Connector 作为抽象请求者,HttpConnector 作为具体请求者。 HttpProcessor 作为命令。 Container 作为命令的抽象接受者,ContainerBase 作为具体的接受者。 客户端就是应用服务器 Server组件了。 Server 首先创建命令请求者 HttpConnector 对象,创建命令 HttpProcessor 命令对象,把请求者封装到命令对象里面。 再把命令对象交给命令接受者ContainerBase 容器来处理命令。命令的最终是被 Tomcat 的Container 执行的。 命令可以以队列的方式进来,Container可以以不同的方式来处理请求,如HTTP1.0 协议和 HTTP1.1 的处理方式就会不同。 责任链模式 Tomcat 中一个最容易发现的设计模式就是责任链模式,这个设计模式也是 Tomcat 中 Container 设计的基础,整个容器的就是通过一个链连接在一起,这个链一直将请求正确的传递给最终处理请求的那个 Servlet。 责任链模式的原理 责任链模式,就是很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上的某个对象处理此请求,或者每个对象都可以处理请求,并传给下一家,直到最终链上每个对象都处理完。这样可以不影响客户端而能够在链上增加任意的处理节点。 通常责任链模式包含下面几个角色: Handler(抽象处理者):定义一个处理请求的接口 ConcreteHandler(具体处理者):处理请求的具体类,或者传给下家 Tomcat中责任链模式示例 在 tomcat 中这种设计模式几乎被完整的使用,tomcat 的容器设置就是责任链模式,从 Engine 到 Host 再到 Context 一直到Wrapper 都是通过一个链传递请求。 Tomcat 中责任链模式的类结构图如下: 上图基本描述了四个子容器使用责任链模式的类结构图,对应的责任链模式的角色,Container 扮演抽象处理者角色,具体处理者由StandardEngine 等子容器扮演。与标准的责任链不同的是,这里引入了 Pipeline 和 Valve 接口。他们有什么作用呢? 实际上 Pipeline 和 Valve 是扩展了这个链的功能,使得在链往下传递过程中,能够接受外界的干预。Pipeline 就是连接每个子容器的管子,里面传递的 Request 和 Response 对象好比管子里流的水,而 Valve 就是这个管子上开的一个个小口子,让你有机会能够接触到里面的水,做一些额外的事情。 为了防止水被引出来而不能流到下一个容器中,每一段管子最后总有一个节点保证它一定能流到下一个子容器,所以每个容器都有一个 StandardXXXValve。只要涉及到这种有链式是处理流程这是一个非常值得借鉴的模式。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册