Java常用工具

174 阅读9分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

引言

部署方式:

  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/…

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 System.currentTimeMillis() + String.valueOf(number);
    }
}

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 age;
}
  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 ServerEndpointExporter();
}

  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 IOException {
        this.session.getBasicRemote().sendText(JSONObject.toJSONString(string));
        //this.session.getAsyncRemote().sendText(message);
    }
 
   //广播
 
    public static <T> void sendMessageToAll(String str) throws IOException {
        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…

关注公众号:iOS逆向,找我获取资源:redis-desktop-manager-0.8.3-2550.dmg在这里插入图片描述

see also

服务发现:NetflixEureka 服务网关:NetflixZuul 断路器LNetflixHystrix 负载均衡:NetflixRibbon 分布式配置:Spring Cloud Config
消息总线:Spring Cloud Bus