引言

部署方式:

  1. tomcat
  2. java -jar
  3. docker: 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker的应用场景:

  1. ​Web 应用的自动化打包和发布​​。
  2. 自动化测试和持续集成、发布。
  3. 在服务型环境中部署和调整数据库或其他的后台应用。
  4. 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Rancher是一个开源的企业级容器管理平台。

通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。

Rancher的基础设施服务包括网络, 存储, 负载均衡, DNS和安全模块。Rancher的基础设施服务也是通过容器部署的,所以同样Rancher的基础设施服务可以运行在任何Linux主机上。 ​​rancher.com/docs/ranche…​

I 手动部署

1.1 java -jar

打包:​​mvn clean package -Dmaven.testskip=true​​​ 拷贝​​​scp target/xx.jar root@192.168.30.13:/opt/javaapps​​​ 启动:​​​java -jar -Dserver.port=8099 xx.jar​

打包的执行顺序:

  1. 使用清理插件:maven-clean-plugin:2.5执行清理删除已有target目录(版本2.5);
  2. 使用资源插件:maven-resources-plugin:2.6执行资源文件的处理(版本2.6);
  3. 使用编译插件:maven-compiler-plugin:3.1编译所有源文件生成class文件至target\classes目录下(版本3.1);
  4. 使用资源插件:maven-resources-plugin:2.6执行测试资源文件的处理(版本2.6);
  5. 使用编译插件:maven-compiler-plugin:3.1编译测试目录下的所有源代码(版本3.1);
  6. 使用插件:maven-surefire-plugin:2.12运行测试用例(版本2.12);
  7. 使用插件:maven-jar-plugin:2.4对编译后生成的文件进行打包,包名称默认为:artifactId-version,

比如本例生成的jar文件:rtp-front-1.0-SNAPSHOT,包文件保存在target目录下(这个生成的包不能在命令行中直接执行,因为我们还没有入口类配置到Manifest资源配置文件中去)。

filename 可以在pom.xml中指定。

1.2 多环境配置

通过spring.profiles.active来具体激活一个或者多个配置文件


//开发环境

java -jar app.jar --spring.profiles.active=dev--server.port=8060

//测试环境

java -jar app.jar --spring.profiles.active=qa --server.port=8060

//生产环境

java -jar app.jar -Dspring.profiles.active=prod --server.port=8060

1.3 后台启动

​nohup Command [ Arg … ] [ & ]​

Command:要执行的命令。

Arg:一些参数,可以指定输出文件。

&:让命令在后台执行,终端退出后命令仍旧执行。

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

后台启动web项目

nohup java -jar sell.jar > /dev/null 2>&1 &

Mac 后台启动新的微信客户端进程

nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null &

1.4 添加开机启动项:systemd服务

使用 nohup 和 & 这种方式启动jar包的话,只会放在后台里面执行,如果某天,人为或机器故障等原因,触发机器重启了,那样程序就会关闭。 所以推荐使用Centos7系统自带的systemctl管理实现一个开启自动管理。

Systemd Service 是一种替代/etc/init.d/下脚本的更好方式,它可以灵活的控制你什么时候要启动服务,一般情况下也不会造成系统无法启动进入紧急模式。所以如果想设置一些开机启动的东西,可以试着写 Systemd Service。

使用systemctl start xxx启动服务,开机启动​​systemctl enable xxx启动服务​​。

systemctl 新增服务: 进入system目录​​ cd /usr/lib/systemd/system​​创建service启动文件

[Unit]
Description=xxx
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/bin/java-jar/opt/javaapps/sell.jar
ExecStop=/bin/kill-15 $MAINPID
User=root Group=root
[Install]
WantedBy=multi-user.target

ExecStart:在输入的命令是start时候执行的命令,这里的命令启动的程序必须使用绝对路径,比如你必须用/sbin/arp而不能简单的以环境变量直接使用arp。 ExecStop:在输入的命令是stop时候执行的命令,要求同上。 ExecReload:这个不是必需,如果不写则你的service就不支持restart命令。ExecStart和ExecStop是必须要有的。

Type:服务的类型,各种类型的区别如下所示

  1. simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
  2. forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。
  3. oneshot:适用于那些被一次性执行的任务或者命令,它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹,我们经常会需要使用 RemainAfterExit=yes。意思是说,即使没有进程存在,Systemd 也认为该服务启动成功了。同时只有这种类型支持多条命令,命令之间用;分割,如需换行可以用\。
  4. dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。

使用Systemd运行Java Jar应用程序:

[Unit]
Description=service for description
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/java-service/shell/xxx-start
ExecStop=/java-service/shell/xxx-stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

tomcat

[Unit]
Description=tomcatapi
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/apache-tomcat-8.5.29/bin/startup.sh
ExecReload=
ExecStop=/usr/local/apache-tomcat-8.5.29/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

II 常用工具

2.1 用压测模拟并发

Apache ab,模拟并发性,简单,要求低,不会占用很多的cpu,也不会占用很多内存。

ab -n 100 -c 100 接口地址(-n 表示发出100个请求 ,-c 表示100个并发)

ab -t 60-c 100 接口地址 (-t 表示连续60秒内不停发请求,-c 表示100个并发)

————————————————

版权声明:本文为CSDN博主「iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:[​​blog.csdn.net/z929118967/…​​​​blog.csdn.net/z929118967/…​

)

2.2 Swagger RESTful 风格的 Web 服务框架

2.3 Tyk

Tyk 是一个开源的、轻量级的、快速可伸缩的 API 网关,支持配额和速度限制,支持认证和数据分析,支持多用户多组织,提供全 RESTful API。

2.4 生成唯一的主键

public class KeyUtil{
/**
* 生成唯一的主键
* 格式: 时间+随机数
* synchronized 在高并发也能保证不会重复
* @return
public static synchronized String genUniqueKey(){
Random random = new Random();
Integer number = random.nextInt(900000) + 100000;
return

III jpa & mybatis

  1. 使用SQL建表
  2. 表和表之间的关系推荐使用代码逻辑去控制,方便进行扩展(分表),不推荐使用注解。

注解

含义

@ManyToOne

定义了连接表之间的多对一的关系。

@OneToMany

定义了连接表之间存在一个一对多的关系。

3.1 jpa

  1. 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  1. 在application.yml文件中添加数据库配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mytest
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver //驱动
jpa:
hibernate:
ddl-auto: update //自动更新
show-sql: true //日志中显示sql语句
  1. 创建实体
@Entity
@Getter
@Setter
public class Person{

@Id
@GeneratedValue
private Long id;

@Column(name = "name", nullable = true, length = 20)
private String name;

@Column(name = "agee", nullable = true, length = 4)
private int
  1. ​PersonRepository.java​​接口继承JpaRepository接口
public interface PersonRepository extends JpaRepository<Person, Long> {
}
  1. 使用personRepository
@Autowired
private PersonRepository personRepository;

@PostMapping(path = "addPerson")
public void addPerson(Person person){
personRepository.save(person);
}

注解

解释

@Entity

声明类为实体或表。

@Table

声明表名。

@Basic

指定非约束明确的各个字段。

@Embedded

指定类或它的值是一个可嵌入的类的实例的实体的属性。

@Id

指定的类的属性,用于识别(一个表中的主键)。

@GeneratedValue

指定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值。

@Transient

指定的属性,它是不持久的,即:该值永远不会存储在数据库中。

@Column

指定持久属性栏属性。

@SequenceGenerator

指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。

@TableGenerator

指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。

@AccessType

这种类型的注释用于设置访问类型。如果设置@AccessType(FIELD),则可以直接访问变量并且不需要getter和setter,但必须为public。如果设置@AccessType(PROPERTY),通过getter和setter方法访问Entity的变量。

@JoinColumn

指定一个实体组织或实体的集合。这是用在多对一和一对多关联。

@UniqueConstraint

指定的字段和用于主要或辅助表的唯一约束。

@ColumnResult

参考使用select子句的SQL查询中的列名。

@ManyToMany

定义了连接表之间的多对多一对多的关系。

@ManyToOne

定义了连接表之间的多对一的关系。

@OneToMany

定义了连接表之间存在一个一对多的关系。

@OneToOne

定义了连接表之间有一个一对一的关系。

@NamedQueries

指定命名查询的列表。

@NamedQuery

指定使用静态名称的查询。

3.2 mybatis

<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>

IV 常用第三方Java SDK

4.1 FreeMarker

FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 FreeMarker 是 免费的, 基于Apache许可证2.0版本发布。


修改模版之后,只要编译工程就可以生效,对应的idea的快捷键是command+F9。

4.2 微信相关

​官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7​

  1. 微信授权、微信模版消息、微信开发平台

微信开发 Java SDK ,支持包括微信支付,开放平台,小程序,企业微信,公众号等的后端开发 ​​github.com/Wechat-Grou…​

  1. 微信支付:

要求JDK8+ ​​github.com/Pay-Group/b…​​ IDE 需安装 lombok 插件

4.3 webscoket

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

使用 @ServerEndpoint 注解方式

  1. 添加 ServerEndpointExporter 到 IOC 容器中
@bean
ServerEndpointExporter serverEndpointExporter(){
return new
  1. 使用@ServerEndpoint
@Component
@Slf4j
@ServerEndpoint(value = "/socket")
public class SocketHandler{
//存储SocketHandler的set
private static CopyOnWriteArraySet<SocketHandler> webSocketSet
= new CopyOnWriteArraySet<SocketHandler>();

private Session session;

@OnClose
public void onClose(){
webSocketSet.remove(this); //从set中删除
}


@OnOpen
public void onOpen(Session session){
this.session = session;
webSocketSet.add(this); //加入set中
log.info("欢迎id={}你的加入成功" , session.getId());
}
// 发生消息
public void sendMessage(String string) throws{
this.session.getBasicRemote().sendText(JSONObject.toJSONString(string));
//this.session.getAsyncRemote().sendText(message);
}

//广播

public static <T> void sendMessageToAll(String str) throws{
for (SocketHandler item : webSocketSet) {
try {
item.sendMessage(str);
} catch (IOException e) {
continue;
}
}
}
}

4.4 Spring Data Redis

Spring Data Redis是较大的Spring数据家族的一部分,它提供了​​从Spring应用程序轻松配置和访问redis的功能​​。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Redis可视化工具 ​​Redis Desktop Manager​​:

官网下载:​​redisdesktop.com/download​

mac:​​apps.apple.com/us/app/redi…​