“我报名参与金石计划1期挑战——分割10万奖池,这是我的第3篇文章,点击检查活动概况”

一 计划概述

将spring cloud应用上K8s集群,服务注册直接运用K8s service,即为服务绑定service,服务发现运用K8s service(改计划负责均衡为服务端负载均衡)。

二 SpringBoot + K8s service服务注册发现计划

2.1 计划简介

运用K8s 原生service/endpoints/coredns/etcd组建完成服务注册发现进程,服务注册运用和服务发现均运用service,在K8s环境下,凭借K8s service才能完成负载均衡,更高级流量、安全等功能需求凭借服务管理框架完成。

云原生架构之SpringBoot+K8s service服务注册发现方案(东西流量)

2.2 服务注册发现完成

2.2.1 服务注册进程:

spring cloud 服务配置有serivce的服务,发动后k8s集群针对调用该service,后端会回来详细的pod列表。

2.2.2 服务发现进程:

  • 在同一称号空间,直接运用service进行调用;
  • 跨称号空间运用resttemplate进行调用service;

2.3 计划特点

  • 优点:
    • 负载均衡算法在服务端完成(service 的原生负载均衡算法),后期可运用服务管理框架例如istio/linkerd进行服务管理。
  • 不足:
    • 服务直接经过k8s服务发现,经过service一层,在书主机恳求经过iptables/lvs是转发一层,功能稍弱。

三 实战

3.1 服务提供者

3.1服务提供者 项目方位:github.com/redhatxl/cl…

3.2 服务消费端

3.2.1 顾客逻辑

服务注册,仅需为服务编写 service yaml 资源清单即可。 springboot-clientservice 直接运用service 建议调用,服务发现经过service后端关联的endpoints,转发至对应endpoints上。

3.2.2 服务发现

引入 spring-cloud-starter-openfeign 进行客户端http恳求建议; 引入 spring-cloud-starter-loadbalancer 进行负载均衡(实际针对service建议调用不用负载均衡);

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
   <version>3.1.3</version>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-loadbalancer</artifactId>
   <version>3.1.3</version>
</dependency>

3.2.3 项目目录结构

.
├── Dockerfile
├── HELP.md
├── README.md
├── deploy
│   ├── deploy.yaml
├── mvnw
├── mvnw.cmd
├── pom.xml
├── springboot-clientservice.iml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── xuel
│   │   │           ├── controller
│   │   │           │   └── SpringBootClientServiceController.java
│   │   │           ├── feign
│   │   │           │   └── FeignService.java
│   │   │           ├── service
│   │   │           │   ├── SpringBootClientService.java
│   │   │           │   └── impl
│   │   │           │       └── SpringBootClientServiceImpl.java
│   │   │           └── springbootclientservice
│   │   │               └── SpringbootClientserviceApplication.java
│   │   └── resources
│   │       ├── application.properties
│   │       ├── static
│   │       └── templates

3.2.4 K8s布置文件

  • deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: spring
  name: springboot-clientservice
  labels:
    app: springboot-clientservice
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot-clientservice
  template:
    metadata:
      labels:
        app: springboot-clientservice
    spec:
      containers:
        - name: springboot-clientservice
          image: ccr.ccs.tencentyun.com/xxxxxxx-dev/springbootclientservice:img_v7
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              port: 8080
              path: /actuator/health
            periodSeconds: 10
            initialDelaySeconds: 3
            terminationGracePeriodSeconds: 10
            failureThreshold: 5
            timeoutSeconds: 10
          readinessProbe:
            httpGet:
              port: 8080
              path: /actuator/health
            initialDelaySeconds: 5
            periodSeconds: 10
            failureThreshold: 5
            timeoutSeconds: 10
  • service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: springbootclientservice
      namespace: spring
      labels:
        app: springboot-clientservice
    spec:
      ports:
        - port: 8080
          protocol: TCP
          targetPort: 8080
      type: ClusterIP
      selector:
        app: springboot-clientservice
    

3.2.5 项目源码

项目方位:github.com/redhatxl/cl…

四 测试

4.1 访问服务提供者

因为本地mac 运用kind布置,经过port-forward进行映射到宿主机。

k port-forward -n spring --address 0.0.0.0 svc/springbootinit 9999:8080

/services: 获取到对的service 列表,当前的时间,相应的 Pod 主机称号。

云原生架构之SpringBoot+K8s service服务注册发现方案(东西流量)
云原生架构之SpringBoot+K8s service服务注册发现方案(东西流量)

4.2 访问服务顾客

k port-forward -n spring --address 0.0.0.0 svc/springbootclientservice 8888:8080

/getsvc : 获取 K8s 内部列表,即恳求到的 POD hostname。

云原生架构之SpringBoot+K8s service服务注册发现方案(东西流量)

云原生架构之SpringBoot+K8s service服务注册发现方案(东西流量)

在此负载均衡运用的为service的,测试访问很屡次才进行轮换。

云原生架构之SpringBoot+K8s service服务注册发现方案(东西流量)

4.3 检查资源

云原生架构之SpringBoot+K8s service服务注册发现方案(东西流量)

五 其他

总结下来,服务注册经过给服务增加service,服务发现经过直接调用service建议恳求。