Hexo Blog

fsh的博客


  • 首页

  • 归档

枚举类型的使用

发表于 2019-04-29 更新于 2019-05-03

枚举

枚举是final,意味着它不能被继承,他的作用是用来限制输入的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public enum MaterialType{

UNDEFINED("Undefined", 0,"object"),

/** 枚举值码 */
private final String commandType;

/** 枚举描述 */
private final String desc;

/**
* 实现类
*/
private final String clazz ;


public static MaterialType find(int index) {
for (MaterialType c : MaterialType.values()) {
if (c.getIndex() == index) {
return c;
}
}
return null;
}
}

Spring-Boot全局异常处理

发表于 2019-04-18 更新于 2019-08-01

SpringBoot自带的异常处理

SpringBoot有一个默认的视图“/error”来处理所有的异常,并且该视图注册成全局的错误页面在服务中,在客户端中他返回带有状态和错误码的json类型的响应。

取代默认的视图来处理

To replace the default behavior completely, you can implement ErrorController and register a bean definition of that type or add a bean of type ErrorAttributes to use the existing mechanism but replace the contents.

自定义带注解的类处理

You can also define a class annotated with @ControllerAdvice to customize the JSON document to return for a particular controller and/or exception type

自定义错误处理类来返回json格式的响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {

@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
}

private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}

}
  1. basePackageClasses: 标识限定控制器,可以去掉,以对所有控制器生效,会产生性能影响
  2. ExceptionHandler: 拦截自定义错误,可以去掉拦截所有错误类型
  3. handleControllerException: 在此方法中返回自定义的ResponseBody

参考

MySQL with Docker

发表于 2019-03-28 更新于 2019-04-30

拉取Mysql镜像

1
$ docker pull mysql:5.7.25

实例化容器

1
docker run --name some-mysql -v /srv/mysql/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7.25

docker run –name mysql-data -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=”woyaoxuehuilinux” -d mysql:5.6

Spring-Boot with Docker

发表于 2019-03-27 更新于 2019-03-29

Dockerfile文件制作

1
2
3
4
5
6
7
8
9
10
#
FROM openjdk:8-jdk-alpine
#挂载匿名卷 防止容器存储层写入大量数据
VOLUME /tmp
#Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

docker build -t demo:1 .

The JAR_FILE could be passed in as part of the docker command E.g. for Maven:
JAR_FILE可以作为docker命令的一部分传入,就是target/*.jar

1
$ docker build --build-args=target/*.jar -t myorg/myapp .

如果你已经有了jar包则可以直接指定位置,来制作镜像

1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

现在我们可以简单的构建镜像

1
$ docker build -t myorg/myapp .

然后运行

1
$ docker run -p 80:8080 myorg/app

如果你像进入镜像查看可以输入

1
2
3
4
5
$ docker run -ti --entrypoint /bin/sh myorg/myapp
/ # ls
app.jar dev home media proc run srv tmp var
bin etc lib mnt root sbin sys usr
/ #

目前docker的配置非常简单,但是效率不高。docker镜像有一个简单文件系统分层放置jar包,每一次
对程序的改动都会影响到该层,肯能是10M或者更多。我们应该将jar分到其他层来改善这种情况。

精简图像

上述构建镜像的基础镜像是:openjdk:8-jdk-alpine,这是一个比标准更为精简的镜像。然后你还可以使用“jre”而非
“jdk”来作为基础镜像可以省下20MB的空间,并不是说图像越小越好,小只是代表下载方便,前提是,他们的没有中间层被缓存

解压缩文件到target/depency目录,并构建docker镜像

1
2
3
$ mkdir target/dependency
$ (cd target/dependency; jar -xf ../*.jar)
$ docker build -t myorg/myapp .

构建镜像dockerFile

1
2
3
4
5
6
7
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

多阶段构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM openjdk:8-jdk-alpine as build
WORKDIR /workspace/app

COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src

RUN ./mvnw install -DskipTests
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=/workspace/app/target/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

docker-compose的max-size选项来实现控制容器日志大小

Git 指令

发表于 2019-03-25 更新于 2019-05-06

初始化本地仓库

本地intit

1
2
3
4
$ git init
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

远程拷贝

git clonelink
1
2
3
4

# 资源获取

## 设置远程资源

查看

$ git remote

添加

$ git remote add origin ssh://git@192.168.4.216:2222/FuShengHao/cmac-enterprise-server.git

改名

$ git remote rename

改地址

$ git remote set-url

移除

$ git remote remove
`

拉取并合并到当前主干

$ git pull master

回退到某一次提交

$ git reset –hard 945060fd5a5c300075b5ad4ae045766ad46e0f4c

放弃本次为add的修改

$ git checkout .

Gitlab项目管理

发表于 2019-03-22 更新于 2019-07-31

SSH协议 SSH密钥

md .ssh
兼容问题

ssh-keygen -t ed25519 -C “email@example.com“
ssh-keygen -o -t rsa -b 4096 -C “email@example.com“

1
2
3
4
5
6
7
8
cat ~/.ssh/id_ed25519.pub | clip

git config --list
git config --global --unset user.name
git config --global --unset user.email
#如要在repo中使用 user1 进行操作,进入repo目录后,先设置username 和 email,再进行其他操作
git config user.name "user1"
git config user.email "user1@xx.mail"

添加密钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
eval "$(ssh-agent -s)"

$ ssh-add ~/.ssh/id_rsa
$ ssh-add -l
$ ssh-add -d
$ ssh-add -D

## 配置地址信息
Host GitLab
HostName 127.0.0.1
Port 2222
Preferredauthentications publickey
IdentityFile ~/.ssh/fsh_rsa

Host github
HostName github.com
Preferredauthentications publickey
IdentityFile ~/.ssh/id_rsa

#如果是在本地ip而且不是默认端口22 则需要带端口号
ssh -T git@gitlab.com

Docker使用容器运行Gitlab

发表于 2019-03-21 更新于 2019-08-06

安装

Gitlab 镜像

1
2
# https://hub.docker.com/r/gitlab/gitlab-ce
docker pull gitlab/gitlab-ce

生成容器并运行

1
2
3
4
5
6
7
8
9
sudo docker run --detach \
--hostname 192.168.4.216 \
--publish 443:443 --publish 8880:80 --publish 2222:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab:Z \
--volume /srv/gitlab/logs:/var/log/gitlab:Z \
--volume /srv/gitlab/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce:latest

配置

端口配置

这里80端口被禁用,选择使用https默认端口访问
打开端口443以允许入站HTTPS流量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# UFW example (Debian, Ubuntu)
sudo ufw allow https

# lokkit example (RedHat, CentOS 6)
sudo lokkit -s https

# firewall-cmd (RedHat, Centos 7)
sudo firewall-cmd --permanent --add-service=https

sudo systemctl reload firewalld

#进入容器内部
$ docker exec -it gitlab bin/bash
#编辑配置

$ vi /etc/gitlab/gitlab.rb

#gitlab.rb 内添加内容
#external_url "https://192.168.4.216"
#带端口的试了下不成功443


将所有http转成https
nginx['redirect_http_to_https'] = true

配置邮箱服务

这里用的是腾讯企业邮箱
官方配置文档

1
2
3
4
5
6
7
8
9
10
11
12
#gitlab.rb 内添加内容

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxx@xx.com"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'xxxx@xx.com'
gitlab_rails['smtp_domain'] = "exmail.qq.com"

配置shell端口

gitlab_rails[‘gitlab_shell_ssh_port’] = 2222

重启配置

1
2
#时间较长
gitlab-ctl reconfigure

测试

1
2
#时间较长
gitlab-rails console

Notify.test_email(‘邮箱地址’, ‘主题’, ‘摘要’).deliver_now

离开

1
exit

阿里云使用Docker部署前端服务

发表于 2019-03-15 更新于 2019-04-08

镜像制作

使用Dockerfile 定制镜像

新建文件夹

新建一个Dockerfile文件夹将资源全部转移到其中
新建Dockerfile文件,Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式

使用vi编辑Dockerfile

1
2
3
4
#在nginx镜像的基础上新建镜像
FROM nginx
#拷贝本地的web静态资源到nginx目录
COPY html /usr/share/nginx/html

在Dockerfile文件下运行

1
2
3
4
5
6
#制作镜像
$ docker build -t my-nginx-image/myapp .
#生成实例
$ docker run --name my-nginx-container -p 80:80 -d my-nginx-image/myapp
#以日志形式运行
$ docker run --name my-nginx-container -p 80:80 -v /web/nginxImage/nginx.conf:/etc/nginx/nginx.conf:ro -d my-nginx-image/myapp nginx-debug -g 'daemon off;'

docker run –name my-nginx-container -p 80:80 \
–volume /srv/nginx/nginx.conf:/etc/nginx/nginx.conf \
–volume /srv/nginx/html:/usr/share/nginx/html \
–volume /srv/nginx/log:/var/log/nginx \
-d nginx

Docker

发表于 2019-03-04 更新于 2019-08-07

Docker是什么

Docker是一个容器平台,负责创建容器

使用Ubuntu安装Docker

系统要求

Docker CE 支持以下版本的 Ubuntu 操作系统:

  • Bionic 18.04 (LTS)
  • Xenial 16.04 (LTS)
  • Trusty 14.04 (LTS) (Docker CE v18.06 及以下版本)

使用 APT 安装

由于 apt 源(APT是一个客户/服务器系统)使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

1
2
3
4
5
6
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

1
$curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

然后,我们需要向 source.list 中添加 Docker 软件源

1
2
3
4
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"

安装 Docker CE

更新 apt 软件包缓存,并安装 docker-ce:

1
2
3
# 工具更新
$ sudo apt-get update
$ sudo apt-get install docker-ce

启动 Docker CE

镜像加速

鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

1
2
3
# https://registry.docker-cn.com
docker build -t nginx:v1
docker run --name webserver -d -p 80:80 6b91d233e367

Docker如何装载应用程序

将应用程序制作成镜像,通过Docker引擎将镜像生成容器,最后以容器的形式运行程序

如何用docker运行SpringBoot

用docker运行的首先是一个容器,SpringBoot就在这个容器中,容器由镜像生成
因此首先要解决的是如何生成应用程序的镜像文件

docker-compose.yaml来用Docker Compose编排文件
这是整合多容器直接的相互配合

如果是在windows环境下则需要安装Docker for Windows

Docker操作

systemctl start docker
systemctl stop docker

镜像

镜像重命名

1
2
docker tag d72169616e20 mysql:8.0.16
docker rmi mysql:latest

构建镜像

1
2
docker build [选项] <上下文路径/URL/-> 下面的.路径为当前文件夹
docker build -t nginx:v1 .

查看和删除镜像

1
2
docker image ls
docker image rm {id}

容器

8a965478d94d为DockerID

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基于镜像新建并启动
$ docker run --name webserver -d -p 80:80 {ImageID}

# 查看所有容器命令
$ docker container ls -a
# 容器启动
$ docker container start 8a965478d94d
# 容器停止
$ docker container stop 684d344fd36f
# 容器删除
$ docker container rm 4cd3e089d3e5
# 删除所有未启动的容器
$ docker container prune

进入/离开容器

$ docker exec {DockerId} bin/bash
$ docker exec -it 名字 /bin/bash
$ docker exec -it mysql1 bash
$ docker attach (会导致容器停止)
$ exit

容器的导入和导出

1
2
3
4
5
6
7
8

#导出容器快照
$ docker export 7691a814370e > ubuntu.tar
#导入容器快照
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
#保存所有数据
docker load

更新权限

docker exec -it gitlab update-permissions
docker restart gitlab

查看日志

docker logs -f {containerID}
docker logs –details {containerID}

私有仓库

Java ClassLoader

发表于 2019-02-26 更新于 2019-03-12 分类于 JVM
123…6

fsh

54 日志
4 分类
20 标签
© 2019 fsh
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.3.0