最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群的方案

 更新時(shí)間:2024年08月29日 14:53:34   作者:Harries Blog  
Kubernetes是一個(gè)開(kāi)源的容器編排平臺(tái),可以自動(dòng)化在部署、管理和擴(kuò)展容器化應(yīng)用過(guò)程中涉及的許多手動(dòng)操作,這篇文章主要介紹了Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群,需要的朋友可以參考下

1.什么是kubernetes?

Kubernetes(也稱(chēng) k8s 或 “kube”)是一個(gè)開(kāi)源的容器編排平臺(tái),可以自動(dòng)化在部署、管理和擴(kuò)展容器化應(yīng)用過(guò)程中涉及的許多手動(dòng)操作。 Kubernetes 最初是由 Google 工程師作為 Borg 項(xiàng)目開(kāi)發(fā)和設(shè)計(jì)的,后于 2015 年捐贈(zèng)給 云原生計(jì)算基金會(huì)(CNCF)。紅帽® 是第一批與 Google 合作研發(fā) Kubernetes 的公司之一,作為 Kubernetes 上游項(xiàng)目的第二大貢獻(xiàn)者,我們甚至在這個(gè)項(xiàng)目啟動(dòng)之前就已參與其中。

傳統(tǒng)部署時(shí)代:

早期,各個(gè)組織是在物理服務(wù)器上運(yùn)行應(yīng)用程序。 由于無(wú)法限制在物理服務(wù)器中運(yùn)行的應(yīng)用程序資源使用,因此會(huì)導(dǎo)致資源分配問(wèn)題。 例如,如果在同一臺(tái)物理服務(wù)器上運(yùn)行多個(gè)應(yīng)用程序, 則可能會(huì)出現(xiàn)一個(gè)應(yīng)用程序占用大部分資源的情況,而導(dǎo)致其他應(yīng)用程序的性能下降。 一種解決方案是將每個(gè)應(yīng)用程序都運(yùn)行在不同的物理服務(wù)器上, 但是當(dāng)某個(gè)應(yīng)用程序資源利用率不高時(shí),剩余資源無(wú)法被分配給其他應(yīng)用程序, 而且維護(hù)許多物理服務(wù)器的成本很高。

虛擬化部署時(shí)代:

因此,虛擬化技術(shù)被引入了。虛擬化技術(shù)允許你在單個(gè)物理服務(wù)器的 CPU 上運(yùn)行多臺(tái)虛擬機(jī)(VM)。 虛擬化能使應(yīng)用程序在不同 VM 之間被彼此隔離,且能提供一定程度的安全性, 因?yàn)橐粋€(gè)應(yīng)用程序的信息不能被另一應(yīng)用程序隨意訪問(wèn)。 虛擬化技術(shù)能夠更好地利用物理服務(wù)器的資源,并且因?yàn)榭奢p松地添加或更新應(yīng)用程序, 而因此可以具有更高的可擴(kuò)縮性,以及降低硬件成本等等的好處。 通過(guò)虛擬化,你可以將一組物理資源呈現(xiàn)為可丟棄的虛擬機(jī)集群。 每個(gè) VM 是一臺(tái)完整的計(jì)算機(jī),在虛擬化硬件之上運(yùn)行所有組件,包括其自己的操作系統(tǒng)。

容器部署時(shí)代:

容器類(lèi)似于 VM,但是更寬松的隔離特性,使容器之間可以共享操作系統(tǒng)(OS)。 因此,容器比起 VM 被認(rèn)為是更輕量級(jí)的。且與 VM 類(lèi)似,每個(gè)容器都具有自己的文件系統(tǒng)、CPU、內(nèi)存、進(jìn)程空間等。 由于它們與基礎(chǔ)架構(gòu)分離,因此可以跨云和 OS 發(fā)行版本進(jìn)行移植。 容器因具有許多優(yōu)勢(shì)而變得流行起來(lái),例如:

  • 敏捷應(yīng)用程序的創(chuàng)建和部署:與使用 VM 鏡像相比,提高了容器鏡像創(chuàng)建的簡(jiǎn)便性和效率。
  • 持續(xù)開(kāi)發(fā)、集成和部署:通過(guò)快速簡(jiǎn)單的回滾(由于鏡像不可變性), 提供可靠且頻繁的容器鏡像構(gòu)建和部署。
  • 關(guān)注開(kāi)發(fā)與運(yùn)維的分離:在構(gòu)建、發(fā)布時(shí)創(chuàng)建應(yīng)用程序容器鏡像,而不是在部署時(shí), 從而將應(yīng)用程序與基礎(chǔ)架構(gòu)分離。
  • 可觀察性:不僅可以顯示 OS 級(jí)別的信息和指標(biāo),還可以顯示應(yīng)用程序的運(yùn)行狀況和其他指標(biāo)信號(hào)。
  • 跨開(kāi)發(fā)、測(cè)試和生產(chǎn)的環(huán)境一致性:在筆記本計(jì)算機(jī)上也可以和在云中運(yùn)行一樣的應(yīng)用程序。
  • 跨云和操作系統(tǒng)發(fā)行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方運(yùn)行。
  • 以應(yīng)用程序?yàn)橹行牡墓芾恚禾岣叱橄蠹?jí)別,從在虛擬硬件上運(yùn)行 OS 到使用邏輯資源在 OS 上運(yùn)行應(yīng)用程序。
  • 松散耦合、分布式、彈性、解放的微服務(wù):應(yīng)用程序被分解成較小的獨(dú)立部分, 并且可以動(dòng)態(tài)部署和管理 - 而不是在一臺(tái)大型單機(jī)上整體運(yùn)行。
  • 資源隔離:可預(yù)測(cè)的應(yīng)用程序性能。
  • 資源利用:高效率和高密度

為什么需要 Kubernetes,它能做什么?

容器是打包和運(yùn)行應(yīng)用程序的好方式。在生產(chǎn)環(huán)境中, 你需要管理運(yùn)行著應(yīng)用程序的容器,并確保服務(wù)不會(huì)下線。 例如,如果一個(gè)容器發(fā)生故障,則你需要啟動(dòng)另一個(gè)容器。 如果此行為交由給系統(tǒng)處理,是不是會(huì)更容易一些? 這就是 Kubernetes 要來(lái)做的事情! Kubernetes 為你提供了一個(gè)可彈性運(yùn)行分布式系統(tǒng)的框架。 Kubernetes 會(huì)滿足你的擴(kuò)展要求、故障轉(zhuǎn)移你的應(yīng)用、提供部署模式等。 例如,Kubernetes 可以輕松管理系統(tǒng)的 Canary (金絲雀) 部署。

Kubernetes相關(guān)概念總結(jié)

k8s中配置客戶端訪問(wèn)pod中應(yīng)用的流程如下:

client->ingress->service->pod->container

INGRESS

Ingress 是對(duì)集群中服務(wù)的外部訪問(wèn)進(jìn)行管理的 API 對(duì)象,典型的訪問(wèn)方式是 HTTP。 Ingress 可以提供負(fù)載均衡、SSL 終結(jié)和基于名稱(chēng)的虛擬托管。

SERVICE

將運(yùn)行在一組 Pods 上的應(yīng)用程序公開(kāi)為網(wǎng)絡(luò)服務(wù)的抽象方法。Kubernetes Service 定義了這樣一種抽象:邏輯上的一組 Pod,一種可以訪問(wèn)它們的策略 —— 通常稱(chēng)為微服務(wù)。 Service 所針對(duì)的 Pods 集合通常是通過(guò)選擇算符來(lái)確定的。

POD

Pod 是可以在 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計(jì)算單元。 Pod (就像在鯨魚(yú)莢或者豌豆莢中)是一組(一個(gè)或多個(gè)) 容器; 這些容器共享存儲(chǔ)、網(wǎng)絡(luò)、以及怎樣運(yùn)行這些容器的聲明。 Pod 中的內(nèi)容總是并置(colocated)的并且一同調(diào)度,在共享的上下文中運(yùn)行。 Pod 所建模的是特定于應(yīng)用的“邏輯主機(jī)”,其中包含一個(gè)或多個(gè)應(yīng)用容器, 這些容器是相對(duì)緊密的耦合在一起的。 在非云環(huán)境中,在相同的物理機(jī)或虛擬機(jī)上運(yùn)行的應(yīng)用類(lèi)似于 在同一邏輯主機(jī)上運(yùn)行的云應(yīng)用。

節(jié)點(diǎn)(Node)

Kubernetes 集群中其中一臺(tái)工作機(jī)器,是集群的一部分。

k8s-client-java選型

目前通過(guò)java操作k8s,開(kāi)源版本共有兩個(gè):

kubernetes-client/javafabric8io/kubernetes-client對(duì)比

和官網(wǎng)API一致性社區(qū)活躍度代碼生成
kubernetes-client/java根據(jù)k8s-openapi隨之更新,一致性和更新頻率高目前不活躍kubernetes-client/java提供了生成代碼的通用跨語(yǔ)言工具,該工具托管在 kubernetes-client / gen存儲(chǔ)庫(kù)中
fabric8io/kubernetes-client一致性低,更新慢;其中不支持k8s1.8和1.13社區(qū)活躍,目前使用者多暫無(wú)

鑒于kubernetes-client/java官網(wǎng)API一致性好,本文決定采用它

2.環(huán)境部署

Download and run the installer for the latest release.

Or if using PowerShell, use this command:

New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force
Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' -UseBasicParsing

Add the minikube.exe binary to your PATH.

Make sure to run PowerShell as Administrator.

$oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine)
if ($oldPath.Split(';') -inotcontains 'C:\minikube'){
[Environment]::SetEnvironmentVariable('Path', $('{0};C:\minikube' -f $oldPath), [EnvironmentVariableTarget]::Machine)
}

If you used a terminal (like powershell) for the installation, please close the terminal and reopen it before running minikube

other plateform,

please visit at:https://minikube.sigs.k8s.io/docs/start/?arch=%2Fwindows%2Fx86-64%2Fstable%2F.exe+download

install kubectl

https://kubernetes.io/docs/tasks/tools/install-kubectl-windows/

Start your cluster

minikube start

Interact with your cluster

kubectl get po -A

Alternatively, minikube can download the appropriate version of kubectl and you should be able to use it like this:

minikube kubectl -- get po -A

You can also make your life easier by adding the following to your shell config: (for more details see: kubectl)

alias kubectl="minikube kubectl --"

Initially, some services such as the storage-provisioner, may not yet be in a Running state. This is a normal condition during cluster bring-up, and will resolve itself momentarily. For additional insight into your cluster state, minikube bundles the Kubernetes Dashboard, allowing you to get easily acclimated to your new environment:

minikube dashboard

3.代碼工程

實(shí)驗(yàn)?zāi)繕?biāo)

  • 實(shí)現(xiàn)java api獲取pod信息
  • 實(shí)現(xiàn)java api創(chuàng)建ingress
  • 實(shí)現(xiàn)java api創(chuàng)建service

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>Kubernetes</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.kubernetes</groupId>
            <artifactId>client-java</artifactId>
            <version>12.0.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

kubernetes工具類(lèi)

package com.et.k8s.client;
import io.kubernetes.client.custom.IntOrString;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.apis.ExtensionsV1beta1Api;
import io.kubernetes.client.openapi.apis.NetworkingV1Api;
import io.kubernetes.client.openapi.models.*;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.KubeConfig;
import lombok.extern.slf4j.Slf4j;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
@Slf4j
public class K8sClient {
    private ApiClient apiClient;
    /**
     * loading the in-cluster config, including:
     * 1. service-account CA
     * 2. service-account bearer-token
     * 3. service-account namespace
     * 4. master endpoints(ip, port) from pre-set environment variables
     */
    public K8sClient() {
        try {
            this.apiClient = ClientBuilder.cluster().build();
        } catch (IOException e) {
            log.error("build K8s-Client error", e);
            throw new RuntimeException("build K8s-Client error");
        }
    }
    /**
     * loading the out-of-cluster config, a kubeconfig from file-system
     *
     * @param kubeConfigPath 
     */
    public K8sClient(String kubeConfigPath) {
        try {
            this.apiClient = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();
        } catch (IOException e) {
            log.error("read kubeConfigPath error", e);
            throw new RuntimeException("read kubeConfigPath error");
        } catch (Exception e) {
            log.error("build K8s-Client error", e);
            throw new RuntimeException("build K8s-Client error");
        }
    }
    /**
     * get all Pods
     *
     * @return podList
     */
    public V1PodList getAllPodList() {
        // new a CoreV1Api
        CoreV1Api api = new CoreV1Api(apiClient);
        // invokes the CoreV1Api client
        try {
            V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null, null);
            return list;
        } catch (ApiException e) {
            log.error("get podlist error:" + e.getResponseBody(), e);
        }
        return null;
    }
    /**
     * create k8s service
     *
     * @param namespace   
     * @param serviceName 
     * @param port        
     * @param selector    
     * @return 
     */
    public V1Service createService(String namespace, String serviceName, Integer port, Map<String, String> selector) {
        V1Service svc = new V1ServiceBuilder()
                .withNewMetadata()
                .withName(serviceName)
                .endMetadata()
                .withNewSpec()
                .addNewPort()
                .withProtocol("TCP")
                .withPort(port)
                .withTargetPort(new IntOrString(port))
                .endPort()
                .withSelector(selector)
                .endSpec()
                .build();
        // Deployment and StatefulSet is defined in apps/v1, so you should use AppsV1Api instead of CoreV1API
        CoreV1Api api = new CoreV1Api(apiClient);
        V1Service v1Service = null;
        try {
            v1Service = api.createNamespacedService(namespace, svc, null, null, null);
        } catch (ApiException e) {
            log.error("create service error:" + e.getResponseBody(), e);
        } catch (Exception e) {
            log.error("create service system error:", e);
        }
        return v1Service;
    }
    /**
     * create k8s V1Ingress
     *
     * @param namespace
     * @param ingressName
     * @param annotations
     * @param path
     * @param serviceName
     * @param servicePort
     * @return
     */
    public V1Ingress createV1Ingress(String namespace, String ingressName, Map<String, String> annotations, String path,
                                     String serviceName, Integer servicePort) {
        //build ingress yaml
        V1Ingress ingress = new V1IngressBuilder()
                .withNewMetadata()
                .withName(ingressName)
                .withAnnotations(annotations)
                .endMetadata()
                .withNewSpec()
                .addNewRule()
                .withHttp(new V1HTTPIngressRuleValueBuilder().addToPaths(new V1HTTPIngressPathBuilder()
                        .withPath(path)
                        .withPathType("Prefix")
                        .withBackend(new V1IngressBackendBuilder()
                                .withService(new V1IngressServiceBackendBuilder()
                                        .withName(serviceName)
                                        .withPort(new V1ServiceBackendPortBuilder()
                                                .withNumber(servicePort).build()).build()).build()).build()).build())
                .endRule()
                .endSpec()
                .build();
        NetworkingV1Api api = new NetworkingV1Api(apiClient);
        V1Ingress v1Ingress = null;
        try {
            v1Ingress = api.createNamespacedIngress(namespace, ingress, null, null, null);
        } catch (ApiException e) {
            log.error("create ingress error:" + e.getResponseBody(), e);
        } catch (Exception e) {
            log.error("create ingress system error:", e);
        }
        return v1Ingress;
    }
    /**
     * create k8s ExtensionIngress
     *
     * @param namespace
     * @param ingressName
     * @param annotations
     * @param path
     * @param serviceName
     * @param servicePort
     * @return
     */
    public ExtensionsV1beta1Ingress createExtensionIngress(String namespace, String ingressName, Map<String, String> annotations, String path,
                                                           String serviceName, Integer servicePort) {
        //build ingress yaml
        ExtensionsV1beta1Ingress ingress = new ExtensionsV1beta1IngressBuilder()
                .withNewMetadata()
                .withName(ingressName)
                .withAnnotations(annotations)
                .endMetadata()
                .withNewSpec()
                .addNewRule()
                .withHttp(new ExtensionsV1beta1HTTPIngressRuleValueBuilder().addToPaths(new ExtensionsV1beta1HTTPIngressPathBuilder()
                        .withPath(path)
                        .withBackend(new ExtensionsV1beta1IngressBackendBuilder()
                                .withServiceName(serviceName)
                                .withServicePort(new IntOrString(servicePort)).build()).build()).build())
                .endRule()
                .endSpec()
                .build();
        ExtensionsV1beta1Api api = new ExtensionsV1beta1Api(apiClient);
        ExtensionsV1beta1Ingress extensionsV1beta1Ingress = null;
        try {
            extensionsV1beta1Ingress = api.createNamespacedIngress(namespace, ingress, null, null, null);
        } catch (ApiException e) {
            log.error("create ingress error:" + e.getResponseBody(), e);
        } catch (Exception e) {
            log.error("create ingress system error:", e);
        }
        return extensionsV1beta1Ingress;
    }
}

以上只是一些關(guān)鍵代碼,所有代碼請(qǐng)參見(jiàn)下面代碼倉(cāng)庫(kù)

代碼倉(cāng)庫(kù)

4.測(cè)試

獲取pods

@Test
public void getAllPodListTest() {
    String kubeConfigPath = "C:\\Users\\Dell\\.kube\\config";
    if (!new File(kubeConfigPath).exists()) {
        System.out.println("kubeConfig not exist,jump over");
        return;
    }
    K8sClient k8sClient = new K8sClient(kubeConfigPath);
    V1PodList podList = k8sClient.getAllPodList();
    for (V1Pod item : podList.getItems()) {
        System.out.println(item.getMetadata().getNamespace() + ":" + item.getMetadata().getName());
    }
}

輸出結(jié)果

default:nginx-6b5775b9c6-kqh5j
kube-system:coredns-5dd5756b68-7f4mj
kube-system:etcd-minikube
kube-system:kube-apiserver-minikube
kube-system:kube-controller-manager-minikube
kube-system:kube-proxy-pnt5q
kube-system:kube-scheduler-minikube
kube-system:metrics-server-7c66d45ddc-4jp25
kube-system:storage-provisioner
kubernetes-dashboard:dashboard-metrics-scraper-7fd5cb4ddc-bpvvs
kubernetes-dashboard:kubernetes-dashboard-8694d4445c-98vfm
middleware:mongodb-enterprise-operator-6dcd58f895-tmcr8
middleware:ops-manager-0
middleware:ops-manager-1
middleware:ops-manager-2
middleware:ops-manager-db-0
middleware:ops-manager-db-1
middleware:ops-manager-db-2

創(chuàng)建Ingress

@Test
public void createV1IngressTest() {
    String kubeConfigPath = "C:\\Users\\Dell\\.kube\\config";
    if (!new File(kubeConfigPath).exists()) {
        System.out.println("kubeConfig not exist,jump over");
        return;
    }
    K8sClient k8sClient = new K8sClient(kubeConfigPath);
    String namespace = "default";
    String ingressName = "my-nginx-ingress";
    Map<String, String> annotations = new HashMap<>();
    annotations.put("nginx.ingress.kubernetes.io/rewrite-target", "/");
    String path = "/my-nginx";
    String serviceName = "my-nginx-service";
    Integer servicePort = 80;
    V1Ingress v1Ingress = k8sClient.createV1Ingress(namespace, ingressName, annotations, path, serviceName, servicePort);
    System.out.println(v1Ingress != null ? v1Ingress.getMetadata() : null);
}

創(chuàng)建Service

@Test
public void createServiceTest() {
    String kubeConfigPath = "C:\\Users\\Dell\\.kube\\config";
    if (!new File(kubeConfigPath).exists()) {
        System.out.println("kubeConfig not exist,jump over");
        return;
    }
    K8sClient k8sClient = new K8sClient(kubeConfigPath);
    String namespace = "default";
    String serviceName = "my-nginx-service";
    Integer port = 80;
    Map<String, String> selector = new HashMap<>();
    selector.put("run", "my-nginx");
    V1Service v1Service = k8sClient.createService(namespace, serviceName, port, selector);
    System.out.println(v1Service != null ? v1Service.getMetadata() : null);
}

5.引用

到此這篇關(guān)于Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群的文章就介紹到這了,更多相關(guān)Spring Boot集成kubernetes內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 為Java應(yīng)用創(chuàng)建Docker鏡像的3種方式總結(jié)

    為Java應(yīng)用創(chuàng)建Docker鏡像的3種方式總結(jié)

    Docker的使用可以將應(yīng)用程序做成鏡像,這樣可以將鏡像發(fā)布到私有或者公有倉(cāng)庫(kù)中,在其他主機(jī)上也可以pull鏡像,并且運(yùn)行容器,運(yùn)行程,下面這篇文章主要給大家總結(jié)介紹了關(guān)于為Java應(yīng)用創(chuàng)建Docker鏡像的3種方式,需要的朋友可以參考下
    2023-06-06
  • 關(guān)于ZooKeeper原理剖析

    關(guān)于ZooKeeper原理剖析

    ZooKeeper是一種分布式、高可用性的協(xié)調(diào)服務(wù),主要用于幫助系統(tǒng)避免單點(diǎn)故障和建立可靠的應(yīng)用程序,它通過(guò)Leader、Follower和Observer的角色來(lái)協(xié)調(diào)節(jié)點(diǎn),并提供分布式協(xié)作服務(wù)和維護(hù)配置信息,ZooKeeper在HDFS、YARN、HBase、SmallFS和Kafka等大數(shù)據(jù)產(chǎn)品中都有廣泛的應(yīng)用
    2025-02-02
  • mybaties?plus?selectMaps和selectList的區(qū)別說(shuō)明

    mybaties?plus?selectMaps和selectList的區(qū)別說(shuō)明

    這篇文章主要介紹了mybaties?plus?selectMaps和selectList的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Springboot如何同時(shí)裝配兩個(gè)相同類(lèi)型數(shù)據(jù)庫(kù)

    Springboot如何同時(shí)裝配兩個(gè)相同類(lèi)型數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Springboot如何同時(shí)裝配兩個(gè)相同類(lèi)型數(shù)據(jù)庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 深入理解SpringBoot?最大連接數(shù)及最大并發(fā)數(shù)

    深入理解SpringBoot?最大連接數(shù)及最大并發(fā)數(shù)

    SpringBoot能支持的最大并發(fā)量主要看其對(duì)Tomcat的設(shè)置,可以在配置文件中對(duì)其進(jìn)行更改,本文就來(lái)介紹一下SpringBoot?最大連接數(shù)及最大并發(fā)數(shù),感興趣的可以了解一下
    2023-08-08
  • 在lambda的foreach遍歷中break退出操作(lambda foreach break)

    在lambda的foreach遍歷中break退出操作(lambda foreach break)

    這篇文章主要介紹了在lambda的foreach遍歷中break退出操作(lambda foreach break),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Spring-boot JMS 發(fā)送消息慢的解決方法

    Spring-boot JMS 發(fā)送消息慢的解決方法

    這篇文章主要為大家詳細(xì)介紹了Spring-boot JMS 發(fā)送消息慢的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Springboot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)實(shí)例

    Springboot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)實(shí)例

    這篇文章主要介紹了Springboot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)代碼實(shí)例,Quartz?是一款功能強(qiáng)大的開(kāi)源任務(wù)調(diào)度框架,幾乎可以集成到任何?Java?應(yīng)用程序中,Quartz?可用于創(chuàng)建簡(jiǎn)單或復(fù)雜的任務(wù)調(diào)度,用以執(zhí)行數(shù)以萬(wàn)計(jì)的任務(wù),需要的朋友可以參考下
    2023-08-08
  • SpringBoot中@Conditional注解的使用

    SpringBoot中@Conditional注解的使用

    這篇文章主要介紹了SpringBoot中@Conditional注解的使用,@Conditional注解是一個(gè)條件裝配注解,主要用于限制@Bean注解在什么時(shí)候才生效,以指定的條件形式控制bean的創(chuàng)建,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼

    java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03

最新評(píng)論

金阳县| 曲周县| 海口市| 无极县| 奇台县| 信丰县| 屯昌县| 仁怀市| 托克逊县| 闽清县| 山东省| 崇仁县| 罗甸县| 永德县| 盐山县| 镇巴县| 海南省| 闽侯县| 浮梁县| 金山区| 嘉义县| 班戈县| 崇左市| 锡林郭勒盟| 龙门县| 普定县| 紫阳县| 奇台县| 南康市| 沂源县| 宣城市| 汶上县| 惠来县| 惠安县| 如皋市| 徐水县| 观塘区| 南涧| 东至县| 小金县| 郓城县|