@TOC _
バックグラウンド
現在、マイクロサービス開発モデルはますます広く使用されており、登録センターは、Eureka
Ali によって作成されたものなど、他の登録センター製品に徐々に置き換えられていますNacos
。クラウドネイティブ関連技術の普及と急速な発展によりk8s
、K8s
内部がPod
外部アクセスにさらされるようになり、パスが減りService
、これが今日の主役でもあります。
Service
登録と検出の問題が解決されPod
、負荷も軽減されたことがわかりましたか? クラウド ネイティブに基づいてマイクロサービスを開発する場合、次Service
のPod
リストを取得する機能を使用し、Ribbon
待機してPod
呼び出しを開始できます。クライアントの負荷を にロードし、Service
負荷容量を使用して直接呼び出すこともできます。k8s
これらの情報への変更は、サービスを使用して内部的に維持されますETCD
。Spring
公式 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 にデプロイします。この手順は直接省略されます。