在k8s中使⽤SpringCloud框架部署微服务
搜索DevOps和k8s全栈技术,即可关注我的,也可通过扫描⽂章最后的⼆维码关注,每天都会分享技术⽂章供⼤家参考阅读~,拥抱开源,同⼤家共同进步~
⽬录
⼀、介绍
组件简介
功能简介
服务发现简介
.综上个⼈感慨
⼆、环境配置
配置说明
配置操作
三、SpringCloud Kubernetes 服务发现⽰例项⽬
1、Maven 引⼊相关变量
2、创建⼀个 Controller 类获取服务列表
3、创建 application 配置⽂件
4、创建启动类并启⽤服务发现注解
5、测试接⼝
四、服务发现可配参数
1、可配置参数表
2、配置参数说明及⽰例
五、源码分析
1、服务发现实现类源码
2、服务发现参数配置类源码
⼀、介绍
组件简介
这⾥主要介绍的是如何在 Kubernetes 中使⽤ SpringCloud 框架开发 Java 应⽤,在这个过程中主要使⽤的组件就是 SpringCloud Kubernetes 来完成服务发现、动态配置,利⽤ Feign 来进⾏服务间的通信等。
这⾥先简单介绍下 SpringCloud Kubernetes,它主要是提供了使⽤ Kubernetes 本地服务的 Spring Cloud 通⽤接⼝实现。⽬标是促进 Spring Cloud 和运⾏在 Kubernetes 中的 Spring Boot 应⽤程序的集成。
SpringCloud Kubernetes 能在 Kubernetes 中完成服务发现和配置监听功能主要依赖 Fabric8 提供的 Kubernetes Client 组件,该组件是 Kubernetes Java API 的第三⽅客户端,它的主要功能是远程操作 Kubernetes API 完成在 Kubernetes 环境下的⼀系列操作。
功能简介
主要提供以下⼏种功能:
在 Kubernetes 中实现服务发现、服务名称解析功能。
在 Kubernetes 中读取 ConfigMaps 和 Secrets 的配置,当 ConfigMap 或 Secret 更改时重新加载应⽤程序属性。
在 Kubernetes 可去掉 Kubernetes ⾃带的服务负载均衡,实现与 Ribbon 结合,通过 Ribbon 完成负载均衡。
服务发现简介
在原⽣的 SpringCloud 中,我们服务发现⼤多数是通过将服务注册到注册中⼼(如 Eureka)后通后,各个服务通过连接注册中⼼,从注册中⼼定时获取服务列表及服务地址的这种⽅式完成服务发现。
在 Kubernetes 中所有的 Service、Pod 等信息都会存⼊ Etcd 中记录,相当于 Ectd 扮演了⼀个注册中⼼的⾓⾊,并且在Kubernetes 中能通过 CoreDNS 完成通过 服务名称 + 端⼝号 ⽅式让各个服务间能相互通信,由此可知我们要是能获⼀个服务的服务
名和端⼝号就能完成服务间的通信⼯作,所以重点就在如何获取这两个值。
综上个⼈感慨
综上所述,应⽤ SpringCloud Kubernetes 作⽤就是通过它获取 Kubernetes 下的服务列表进⾏服务发现。故⽽在这种情况下,没必要在继续坚持在 Kubernetes 上再启动⼀个 Eureka,然后为了 Eureka ⾼可⽤设置为有状态模式 StatefulSet,感觉这有点…..多此⼀举。
⼆、环境配置
配置说明
使⽤ SrpingCloud Kubernetes 相关组件的服务,在本地测试的时候并不需将程序构建成 Docker 镜像,然后在 Kubernetes 中部署它,因为 SpringCloud Kubernetes 组件依赖于 Fabric8 Kubernetes Java 客户端,可以通过使⽤ http 协议与 Kubernetes API 进⾏通信,通过控制 API 来完成⼀些列操作,所以我们只需要配置 本地环境变量,让其能够有权限调⽤ Kubernetes API 即可,这样也⽅便在本地进⾏程序的调试⼯作。
配置操作
这⾥我们需要平时使⽤ Kubectl ⼯具时使⽤的凭证⽂件 config 将其放在系统的⽤户⽬录中,如果是 Linux 环境且能操作 Kubectl 命令,在该系统中直接⽤ SpringCloud Kubernetes 组件即可,不过考虑⼤多数⼈开发环境是 Windows 系统,本⼈也是,所以需要将这
个 config 复制出来,放到系统的⽤户⽬录的 .kube 下⾯,这⾥记录下这个操作过程。
由于在⽤户⽬录下⽆法直接创建带”.“的⽂件夹,所以这⾥打开 cmd 命令⾏窗⼝⼯具,进⼊个⼈⽤户⽬录,然后创建”.kube”⽂件夹,之后将 config ⽂件复制到该⽂件夹下即可。
使⽤管理员⾝份打开 Windows 的 cmd 命令⾏窗⼝
Microsoft Windows [版本 10.0.17763.1]
(c) 2018 Microsoft Corporation。保留所有权利。
c:\Users\mydlq>
使⽤”cd”命令进⼊⽤户⽬录
$ cd /users/mydlq
使⽤”mkdir”命令创建”.kube”⽂件夹
$ mkdir .kube
将 linux 中的 config ⽂件拷贝到上⾯创建的”.kube”⽬录下
这样连接 Kubernetes API 的认证配置环境设置完成,下⾯将写⼀个基于 SpringCloud Kubernetes 例⼦,⽤于发现 Kubernetes 下的服务列表,测试⼀下该配置是否能⽤。
三、SpringCloud Kubernetes 服务发现⽰例项⽬
这⾥⽤ SpringCloud Kubernetes 中的服务发现组件 spring-cloud-starter-kubernetes 来演⽰获取 Kubernetes 环境中的 服务列表和服务实例信息。
1、Maven 引⼊相关变量
在”l”⽂件中引⼊ SpringBoot 与 SpringCloud Kubernetes 相关 Jar。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</parent>
<groupId&dlq</groupId>
<artifactId>springcloud-k8s-discovery-demo</artifactId>
<version>0.0.1</version>
<name>springcloud-k8s-discovery-demo</name>
<description>SpringCloud Kubernetes Discovery Demo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--SpringBoot Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot Actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--SpringCloud Kubernetes Discovery-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、创建⼀个 Controller 类获取服务列表
这⾥创建⼀个 /service 与 /instance 两个接⼝,⽤于获取连接 Kubernetes 集配置⽂件⽤户所拥有权限的 Namespace 下的所有 Service 列表和服务实例。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
el表达式获取map的值import java.util.List;
@RestController
public class ServiceController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/service")
public List<String> getServiceList(){
Services();
}
@GetMapping("/instance")
public Object getInstance(@RequestParam("name") String name){
Instances(name);
}
}
3、创建 application 配置⽂件
创建 application.yaml 配置⽂件,设置⼀些 SpringBoot 基本参数和开启服务发现
spring:
application:
name: springcloud-kubernetes-discovery-demo
cloud:
kubernetes:
discovery:
enabled: true #开启服务发现
server:
port: 8080
management:
server:
port: 8081
endpoints:
web:
exposure:
include: "*"
4、创建启动类并启⽤服务发现注解
创建⼀个 SpringBoot 项⽬的启动类,且引⼊服务发现注解 @EnableDiscoveryClient。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论