@TOC
背景
現(xiàn)在微服務(wù)開(kāi)發(fā)模式應(yīng)用的越來(lái)越廣泛,注冊(cè)中心Eureka
也逐漸被其它注冊(cè)中心產(chǎn)品替代,比如阿里出品的Nacos
。隨著云原生相關(guān)技術(shù)的普及,k8s
迅猛發(fā)展,我們把K8s
中的Pod
暴露給外部訪問(wèn),通過(guò)少了Service
,這也是今天的主角。
有沒(méi)有發(fā)現(xiàn),其實(shí)Service
已經(jīng)解決了Pod
的注冊(cè)與發(fā)現(xiàn)的問(wèn)題,并且也實(shí)現(xiàn)了負(fù)載,我們?cè)诨谠圃_(kāi)發(fā)微服務(wù)的時(shí)候,可以利用Service
的能力,獲取后面的Pod
列表,通過(guò)Ribbon
等客戶端負(fù)載對(duì)Pod
發(fā)起調(diào)用,也可以直接利用Service
的負(fù)載能力進(jìn)行調(diào)用。k8s
內(nèi)部會(huì)使用ETCD
服務(wù)維護(hù)這些信息的變化。Spring
官網(wǎng)也為k8s
提供了一套原生的支持子項(xiàng)目,那就是Spring Cloud Kubernetes
。
本地開(kāi)發(fā)環(huán)境說(shuō)明
開(kāi)發(fā)依賴 | 版本 |
---|---|
Spring Boot | 3.1.0 |
Spring Cloud | 2022.0.3 |
JDK | 20 |
本地非K8s環(huán)境如何進(jìn)行開(kāi)發(fā)調(diào)試
在傳統(tǒng)的微服務(wù)開(kāi)發(fā)中,會(huì)借助Nacos注冊(cè)中心,現(xiàn)在沒(méi)有Nacos了,本地通過(guò)Fabric8,底層與k8s的API Server進(jìn)行交互,獲取集群內(nèi)的資源信息文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-531492.html
主要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>
啟動(dòng)類
- 使用
@EnableDiscoveryClient
開(kāi)啟服務(wù)發(fā)現(xiàn)注冊(cè)功能 - 使用
@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);
}
}
寫一個(gè)Feign的調(diào)用
- 如果多個(gè)微服務(wù)都是部署在集群內(nèi),可以通過(guò)
service
相互調(diào)用 - 如果是本地調(diào)集群內(nèi)的微服務(wù),可以指定
url
參數(shù),優(yōu)級(jí)級(jí)比name
要高,url
可以指定為集群內(nèi)service
暴露的外部端點(diǎn)
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);
}
寫一個(gè)Controller
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);
}
}
bootstrap.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,代表在整個(gè)集群范圍查找資源,可能沒(méi)有權(quán)限
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
寫一個(gè)最簡(jiǎn)單的微服務(wù),提供一個(gè)/hello接口,部署到k8s,這一步直接省略。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-531492.html
到了這里,關(guān)于【Spring Cloud Kubernetes】使用k8s原生service實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!