ZB-050-01java程序的部署

分布式概念

  • 中国最大的网游:淘宝每天晚上有8千万用户

当用户访问过怎么办?

垂直扩展

  • 90年代通用方法:买更好的机器

水平扩展

  • 加机器
    • 能加机器解决的问题都不是问题

水平扩张的方式

  • 负载均衡
  • 容灾(单点故障)

如何保证数据的唯一性?

  • 单一数据源
    • 统一连接一个数据库
    • 数据库挂了怎么办?
      • 分库分表
      • 基本大部分公司每有达到这个量级就死掉了
      • 达到了,再去请专门的DBA也来得及

一台机器的时候

把开发好的程序,部署到服务器上

发布和部署Java程序

  • 使之在生产环境下可以运行
  • 需要解决的问题
    • 你自己编写的代码怎么放到服务器上
    • 你所依赖的第三方库
    • 你所依赖的特殊环境配置(数据库/缓存等)
    • 稳定性(挂了怎么办)
    • 升级和回滚

实战:使用 Maven exec plugin

  • 自动将所有的传递性依赖假如
  • 优点
    • 简单
  • 缺点
    • 不适用于自动化的场景

001MyDemo.java

1
2
3
4
5
6
7
8
9
public class MyDemo {

public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 1000; i++) {
Thread.sleep(100);
System.out.println(i);
}
}
}

002点击绿色运行按钮后,首行会显示这样一堆命令

1
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=53152:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/tools.jar:/Users/admin/Desktop/bsdemo01/target/classes com.bs.demo.MyDemo

003安装 maven exec插件在 pom.xml里

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<executable>java</executable>
<arguments>
<argument>com.bs.demo.MyDemo</argument>
</arguments>
</configuration>
</plugin>

004运行mvn exec:exec

结果出错了 说找不到 xxx

运行 mvn exec:exec -X 可以看详细信息

而你在命令行运行 java com.bs.demo.MyDemo 也会报错

那是因为你没有告诉他 classpath

005 修改mvn exec 参数

  • 添加 -classpath 参数来让maven自动把 classpath包含进来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<!-- automatically creates the classpath using all project dependencies,
also adding the project build directory -->
<classpath/>
<argument>com.bs.demo.MyDemo</argument>
</arguments>
</configuration>
</plugin>

006此时 你可以直接mvn exec:exec 来运行你的程序

mvn exec:exec的缺陷

  • 你把 target目录删了在运行就报错了,因为它不会帮你编译
  • 你不可能把源代码搞到服务器上去 然后编译 然后在 mvn exec:exec

jar包方式部署

实际就是编译后的代码资源打包 mvn package

什么样的jar包可以直接运行

  • jar包 和 Manifest(清单文件,最重要的就是一个 main class,入口文件)

优点

  • 简单可靠
    • java -jar 你的jar包

缺点

  • 依赖于JVM环境
    • 你本地和线上的jvm版本不一致
jar包和 war包区别

jar包

  • 内嵌tomcat
  • 可以直接运行

war包

  • 包含了所有的依赖
  • 不能直接运行,没有 tomcat
  • 需要放在Servlet容器里运行

jar包 = war包 + tomcat