【Spring Cloud Kubernetes】k8sネイティブサービスを利用してサービスの登録と検出を実現

@TOC _

バックグラウンド

現在、マイクロサービス開発モデルはますます広く使用されており、登録センターは、EurekaAli によって作成されたものなど、他の登録センター製品に徐々に置き換えられていますNacosクラウドネイティブ関連技術の普及と急速な発展によりk8sK8s内部がPod外部アクセスにさらされるようになり、パスが減りService、これが今日の主役でもあります。

Service登録と検出の問題が解決されPod、負荷も軽減されたことがわかりましたか? クラウド ネイティブに基づいてマイクロサービスを開発する場合、ServicePodリストを取得する機能を使用し、Ribbon待機してPod呼び出しを開始できます。クライアントの負荷を にロードしService負荷容量を使用して直接呼び出すこともできます。k8sこれらの情報への変更は、サービスを使用して内部的に維持されますETCDSpring公式 Web サイトでは、k8sネイティブ サポート サブプロジェクトのセットも提供していますSpring Cloud Kubernetes

ローカル開発環境の説明

開発の依存関係 バージョン
スプリングブーツ 3.1.0
春の雲 2022.0.3
JDK 20

ローカルの非 K8s 環境で開発およびデバッグする方法

従来のマイクロサービス開発では Nacos 登録センターが使用されていましたが、現在は Nacos が存在せず、基盤となるレイヤーはローカルで Fabric8 を介して k8s API サーバーと対話し、クラスター内のリソース情報を取得します。

メインの pom.xml 依存関係

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-fabric8-all</artifactId>
        </dependency>
    </dependencies>

スタートアップクラス

  • @EnableDiscoveryClientサービスディスカバリ登録機能を使用して有効にします。
  • @EnableFeignClientsイネーブル@FeignClient機能を使用する
package com.wen3.springcloudk8s.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class DemoSpringCloudKubernetesApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(DemoSpringCloudKubernetesApplication.class, args);
    }
}

Feign に電話をかける

  • クラスター内に複数のマイクロサービスがデプロイされている場合、service相互に呼び出して呼び出すことができます。
  • ローカルチューニングクラスター内のマイクロサービスの場合、パラメーターを指定できurl、優先順位の比率nameが高く、urlクラスター内でservice公開される外部エンドポイントとして指定できます。
package com.wen3.springcloudk8s.demo.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

@FeignClient(name = "springboot-min", url = "${springboot-min.url:}")
public interface SpringMinFeignClient {
    
    

    @RequestMapping(path = "/hello")
    String hello(@RequestBody(required = false) Map<String,Object> bodyMap);
}

コントローラーを作成する

package com.wen3.springcloudk8s.demo.controller;

import com.wen3.springcloudk8s.demo.feign.SpringMinFeignClient;
import io.fabric8.kubernetes.api.model.ConfigMap;
import io.fabric8.kubernetes.api.model.ConfigMapList;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.dsl.ApiextensionsAPIGroupDSL;
import io.fabric8.kubernetes.client.dsl.MixedOperation;
import jakarta.annotation.Resource;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.kubernetes.commons.KubernetesClientProperties;
import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.Enumeration;
import java.util.List;
import java.util.Map;

@RequestMapping(path = "/k8s")
@RestController
public class K8sController {
    
    

    @Resource
    private DiscoveryClient discoveryClient;
    @Resource
    private SpringMinFeignClient springMinFeignClient;
    @Resource
    private KubernetesClientProperties kubernetesClientProperties;

    @GetMapping("/services")
    public List<String> getServices() {
    
    
        return discoveryClient.getServices();
    }

    @RequestMapping(path = "/hello")
    public String hello(@RequestBody(required = false) Map<String,Object> bodyMap) {
    
    
        return springMinFeignClient.hello(bodyMap);
    }
}

ブートストラップ.yaml

debug: true
logging:
  level:
    root: debug

spring:
  application:
    name: spring-cloud-k8s-demo
  cloud:
    kubernetes:
      client:
        namespace: demo
        master-url: https://k8s-cluster-ip:6443
        trust-certs: true
        oauth-token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      discovery:
        enabled: true
        # all-namespaces为true,代表在整个集群范围查找资源,可能没有权限
        all-namespaces: false
        namespaces:
          - cop
      reload:
        enabled: true
        mode: event
#        mode: polling
#        period: 5000
      loadbalancer:
        enabled: true
        mode: service
        clusterDomain: cluster.local
        portName: rest


springboot-min:
  url: http://10.79.193.64:8880

k8s デプロイメント springboot-min

最も単純なマイクロサービスを作成し、/hello インターフェイスを提供し、それを k8s にデプロイします。この手順は直接省略されます。

おすすめ

転載: blog.csdn.net/friendlytkyj/article/details/131152403