【Spring Cloud Kubernetes】使用k8s原生service实现服务注册和发现

news/2025/1/24 17:58:16/

@TOC

背景

现在微服务开发模式应用的越来越广泛,注册中心Eureka也逐渐被其它注册中心产品替代,比如阿里出品的Nacos。随着云原生相关技术的普及,k8s迅猛发展,我们把K8s中的Pod暴露给外部访问,通过少了Service,这也是今天的主角。

有没有发现,其实Service已经解决了Pod的注册与发现的问题,并且也实现了负载,我们在基于云原生开发微服务的时候,可以利用Service的能力,获取后面的Pod列表,通过Ribbon等客户端负载对Pod发起调用,也可以直接利用Service的负载能力进行调用。k8s内部会使用ETCD服务维护这些信息的变化。Spring官网也为k8s提供了一套原生的支持子项目,那就是Spring Cloud Kubernetes

本地开发环境说明

开发依赖版本
Spring Boot3.1.0
Spring Cloud2022.0.3
JDK20

本地非K8s环境如何进行开发调试

在传统的微服务开发中,会借助Nacos注册中心,现在没有Nacos了,本地通过Fabric8,底层与k8s的API Server进行交互,获取集群内的资源信息

主要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);
}

写一个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 {@Resourceprivate DiscoveryClient discoveryClient;@Resourceprivate SpringMinFeignClient springMinFeignClient;@Resourceprivate 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: debugspring:application:name: spring-cloud-k8s-democloud:kubernetes:client:namespace: demomaster-url: https://k8s-cluster-ip:6443trust-certs: trueoauth-token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdiscovery:enabled: true# all-namespaces为true,代表在整个集群范围查找资源,可能没有权限all-namespaces: falsenamespaces:- copreload:enabled: truemode: event
#        mode: polling
#        period: 5000loadbalancer:enabled: truemode: serviceclusterDomain: cluster.localportName: restspringboot-min:url: http://10.79.193.64:8880

k8s部署springboot-min

写一个最简单的微服务,提供一个/hello接口,部署到k8s,这一步直接省略。


http://www.ppmy.cn/news/337619.html

相关文章

软件工程开发文档写作教程(12)—概要设计书的编制目标

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 概要设计书概述 《概要设计说明书》又称为《系统设计说明书》&#xff0c;编制的目的是说明…

Cracking C++(10): 基本的输入输出流

文章目录 1. 目的2. I/O Streams 输入/输出流3. Stream Operators 流操作符4. 禁止使用 std::endl5. 缓冲区&#xff1a;直观理解6. References 1. 目的 查看 hackingcpp 上的 Input & Output (Basics) 教程后的笔记和拓展内容。 2. I/O Streams 输入/输出流 使用 C 的标…

CUID格式化操作

CUID只能写一次&#xff0c;再写就会报错&#xff0c;这时需要对卡进行格式化&#xff0c;步骤如下 1.读取分析卡之后保存文件 2.然后使用还原有密S50卡&#xff0c;载入刚才保存的文件 3.再次写入所需的卡数据就不报错了

一不小心把手机格式化了,应该怎么办?

只要不是被数据覆盖是可以恢复的&#xff01;手机出现格式化的时候千万不要再次格式化&#xff0c;并立马使用软件恢复&#xff0c;这样恢复的概率还是有的&#xff0c;可以尝试一下失易得数据恢复软件。

openGauss5 企业版之SQL语法和数据结构

文章目录 1.openGauss SQL 语法2. 数据类型2.1数值类型2.2 布尔类型2.3 字符类型2.4 二进制类型2.5日期/时间类型2.6 几何类型2.7 网络地址类型2.8 位串类型2.9 文本搜索类型2.10 UUID数据类型2.11 JSON/JSONB类型2.11 HLL数据类型2.12 范围类型2.13 索引2.14 对象标识符类型2.…

总结MySQL 的一些知识点:MySQL 排序

MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。 如果我们需要对读取的数据进行排序&#xff0c;我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序&#xff0c;再返回搜索结果。 语法 以下是 SQL SELECT 语句使用 ORDER B…

分享5个最好的在线wap浏览器|wap浏览器软件

在手机和网络普及到千家万户的今天&#xff0c;随时随地在地铁上、汽车里通过手机使用wap浏览器上网冲浪已经成为一种时尚。那么wap是什么&#xff0c;有哪些好用的wap电脑软件&#xff0c;和在线wap浏览器呢&#xff1f; 一、wap是什么 WAP英文全称是Wireless Application Pro…

wap---介绍

WAP WAP是Wireless Application Protocol&#xff08;无线应用协议&#xff09;&#xff0c;本质的说WAP是一种使无线设备接入互联网成为可能的技术&#xff0c;它把互联网上的信息转换成能在手机屏幕和其它移动设备上显示的信息。 移动电话是如何接入互联网的&#xff1f;   …