【Chrome】使用k8s、docker部署无头浏览器Headless,Java调用示例

什么是无头浏览器?

无头浏览器是一种没有图形用户界面的浏览器。无头浏览器不通过其图形用户界面(GUI)控制浏览器的操作,而是使用命令行。

为什么要用Chrome无头?

  • Chrome Headless用于抓取(谷歌)、测试(开发者)和黑客(黑客)。
  • 搜索引擎,使用它来呈现页面、生成动态内容和索引来自单页Web应用程序的数据。
  • SEO工具,用来分析网站,提出如何改进的建议。
  • 监控工具,用于监控Web应用中JavaScript的执行时间。
  • 一个测试工具,用于呈现页面并将其与以前的版本进行比较,以跟踪用户界面的变化。
  • 使用Headless Chrome的主要优势在于,用户可以编写脚本以编程方式运行浏览器,并快速、大规模地执行抓取、分析或成像网站等任务,而无需打开浏览器的GUI并点击一百万个东西。
  • 要做到这一点需要三样东西:无头ChromeDevTools协议和木偶师。
  • 你已经见过Chrome Headless了。Dev ProtocolChrome DevTools的远程实例,在另一个浏览器中打开。它允许你“通过你的眼睛”看到无头Chrome,而不需要运行浏览器GUIPuppeteer是一个节点库,它为开发者提供了通过DevTools协议编程控制无头Chrome的工具。
  • 把三者结合起来,就可以用Headless Chrome编写重复的大规模动作脚本,并快速大规模运行。

安装chrome浏览器并测试

基本上每个程序员都会安装chrome浏览器,如果没有安装的可以去下载安装,安装好之后,可以直接利用chrome浏览器执行无头浏览器的命令,假设chrome浏览器安装路径是: C:\Users\administrator\AppData\Local\Google\Chrome\Application\chrome.exe,可以执行如下命令

C:\Users\best5\AppData\Local\Google\Chrome\Application\chrome.exe --headless --hide-scrollbars --disable-gpu --screenshot=e:\chrome.jpg  --window-size=1280,1696 https://www.baidu.com

会生成一个chrome.jpg文件

Docker运行

  • 拉取镜像: docker pull browserless/chrome:latest
  • 运行容器: docker run -p 3000:3000 browserless/chrome:latest
  • 使用浏览器访问: http://localhost:3000/
    在这里插入图片描述

看起来很厉害的样子

k8s部署

  • 编写部署ymal文件,并命名browserless-chrome.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: browserless-chrome
  namespace: kube-public
  labels:
    app: browserless-chrome
spec:
  type: NodePort
  ports:
    - name: websocket
      port: 30000
      targetPort: 3000
      nodePort: 30000
  selector:
    app: browserless-chrome
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: browserless-chrome
  namespace: kube-public
spec:
  replicas: 1
  revisionHistoryLimit: 0 #Replica Sets中的历史数量
  selector:
    matchLabels:
      app: browserless-chrome
  template:
    metadata:
      labels:
        app: browserless-chrome
    spec:
      containers:
        - name: browserless-chrome
          imagePullPolicy: Always
          image: browserless/chrome:latest
          env:
            - name: PORT
              value: "3000"
          securityContext:
            runAsNonRoot: true
            runAsUser: 999
            runAsGroup: 999
          ports:
            - containerPort: 3000
          livenessProbe:
            tcpSocket:
              port: 3000
            initialDelaySeconds: 5
            failureThreshold: 2
            periodSeconds: 60
          readinessProbe:
            tcpSocket:
              port: 3000
            initialDelaySeconds: 5
            periodSeconds: 10
          startupProbe:
            tcpSocket:
              port: 3000
            failureThreshold: 30
            periodSeconds: 10
          resources:
            requests:
              cpu: 0.2
              memory: 300Mi
            limits:
              cpu: 1
              memory: 1Gi
      imagePullSecrets:
        - name: puller
  • kubectl apply -f browserless-chrome.yaml

把镜像推送到私有仓库

  • 给镜像重新打标签: docker tag browserless/chrome:latest xxx.cn/base/browserless-chrome:latest
  • 推送到私有仓库: docker push imgsreg.ipipa.cn:20443/base/browserless-chrome:latest

Java调用示例

  • pom.xml中添加以下依赖
<dependency>
  <groupId>io.github.fanyong920</groupId>
  <artifactId>jvppeteer</artifactId>
  <version>1.1.5</version>
</dependency>
  • 使用本地chrome程序调用示例代码
public class BrowserTest {

    @SneakyThrows
    @Test
    void test() {
        //自动下载,第一次下载后不会再下载
//        BrowserFetcher.downloadIfNotExist(null);
        ArrayList<String> arrayList = new ArrayList<>();
        //生成pdf必须在无头模式下才能生效
        LaunchOptions options = new LaunchOptionsBuilder()
                .withExecutablePath("C:\\Users\\administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe")
                .withArgs(arrayList)
                .withHeadless(true)
                .build();
        arrayList.add("--no-sandbox");
        arrayList.add("--disable-setuid-sandbox");
        Browser browser = Puppeteer.launch(options);
        Page page = browser.newPage();
        page.goTo("https://www.baidu.com");
        PDFOptions pdfOptions = new PDFOptions();
        pdfOptions.setPath("test.pdf");
        page.pdf(pdfOptions);
        page.close();
        browser.close();
    }
}
  • 使用wetsocket远程调用chrome示例代码
public class BrowserTest {

    @SneakyThrows
    @Test
    void test() {
        //自动下载,第一次下载后不会再下载
//        BrowserFetcher.downloadIfNotExist(null);
        ArrayList<String> arrayList = new ArrayList<>();
        //生成pdf必须在无头模式下才能生效
        LaunchOptions options = new LaunchOptionsBuilder()
                .withArgs(arrayList)
                .withHeadless(true)
                .build();
        arrayList.add("--no-sandbox");
        arrayList.add("--disable-setuid-sandbox");
        Browser browser = Puppeteer.connect(options, "ws://localhost:3000", null, null);
        Page page = browser.newPage();
        page.goTo("https://www.baidu.com");
        PDFOptions pdfOptions = new PDFOptions();
        pdfOptions.setPath("test.pdf");
        page.pdf(pdfOptions);
        page.close();
        browser.close();
    }
}

在工程目录下会生成test.pdf文件,可以打开看看效果

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: DockerKubernetes是两个非常流行的容器化技术,可以用来部署Java服务。Docker可以将Java应用程序打包成一个容器镜像,然后在任何支持Docker的环境中运行。Kubernetes则可以管理和协调多个Docker容器,以确保Java服务的高可用性和可伸缩性。在使用DockerKubernetes部署Java服务时,需要注意一些细节,例如如何优化容器镜像、如何配置Kubernetes集群等。 ### 回答2: 随着云计算和容器技术的发展,DockerKubernetes已经成为开发和部署Java服务的首选工具。在本文中,我们将重点介绍如何使用DockerKubernetes部署Java服务。 Docker是一种容器化技术,可以将应用程序、库和依赖项打包到Docker镜像中,并将其部署到任何支持Docker的环境中。对于Java服务来说,这意味着将Java应用程序打包到Docker镜像中,然后将这些镜像部署Docker容器中。这可以简化应用程序的部署、维护和扩展,同时保证基础架构的可移植性。 Kubernetes是一种容器编排平台,可以管理和编排多个Docker容器,形成一个高可用、可扩展的分布式应用程序。对于Java服务来说,Kubernetes可以协调多个Java服务的部署、发现和负载均衡。这可以提高应用程序的可用性和性能,同时简化应用程序的部署和运维。 下面是使用DockerKubernetes部署Java服务的具体步骤: 1. 创建Docker镜像:首先,需要编写Dockerfile文件,指定Java应用程序的构建、运行和依赖项。然后,使用Docker CLI来构建和发布镜像到Docker Hub或私有Docker Registry。 2. 配置Kubernetes集群:可以使用minikube或kubeadm来创建本地或云端的Kubernetes集群。然后,使用kubectl工具来检查集群状态、创建命名空间、服务和容器等。 3. 部署Java服务:使用kubectl来创建Deployment对象,指定Java应用程序的Docker镜像和容器端口等。可以指定多个复制品(replica)来提高可用性和负载均衡。然后,使用kubectl expose命令创建Service对象,使外部客户端能够访问Java服务。 4. 水平扩展Java服务:使用kubectl scale命令可以让Kubernetes自动扩展Java服务的复制品数。也可以使用HPA(Horizontal Pod Autoscaler)来根据CPU使用率或其他指标动态扩展Java服务。 总之,使用DockerKubernetes部署Java服务可以简化应用程序的维护和扩展,同时提高应用程序的可用性和性能。需要注意的是,在实践中需要考虑安全、监控、日志记录等方面的问题。 ### 回答3: Docker是一款轻量级的容器化技术,它可以将应用程序及其依赖打包成独立的可执行容器,方便部署和迁移。而Kubernetesk8s)则是一款开源的容器编排系统,可以自动化管理和调度Docker容器,提供高可用性和伸缩性。 在部署Java服务的过程中,可以采用DockerKubernetes的组合,使得应用程序能够快速部署和扩展。具体的步骤如下: 1. 编写Dockerfile,该文件定义了构建Docker镜像的步骤,包括基础镜像、依赖安装、代码拷贝等操作。同时,可以在Dockerfile中设置环境变量和启动命令,以便在容器启动时执行相应的操作。 2. 构建Docker镜像,使用Docker命令将Dockerfile构建成镜像,可以使用DockerHub等公共仓库或者自行搭建私有仓库。 3. 部署Docker容器,使用Kubernetes的Pod部署Java应用程序,一个Pod可以包含一个或多个容器,通常情况下一个Pod只包含一个容器。可以在Pod中设置容器的资源需求和限制,以便在高负载时自动扩展和缩容。 4. 设置服务发现和负载均衡,使用Kubernetes的Service来暴露Pod中的应用程序,同时实现内部和外部的负载均衡和服务发现,可以使用Kubernetes自带的Ingress或者第三方的Ingress Controller。 5. 监控和日志收集,使用Kubernetes的监控和日志收集功能,可以实时监控容器的状态和性能指标,同时收集容器的日志,为故障排查和性能优化提供支持。 综上所述,采用DockerKubernetes部署Java服务可以加速应用程序的部署和扩展,同时提高应用程序的可用性和可维护性。需要注意的是,这只是一个简单的部署流程,实际上根据实际情况还需要进行相关的优化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太空眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值