0.前言

       在构建微服务之前,需要进行微服务框架选型,之前的微服务完全基于springcloud构建, 而现在则需要基于云原生的方式来构建。

1.为什么选择Kubernetes

1)云原生架构:目前微服务比较流行的架构
2)服务下沉:用k8s构建微服务,相比如springcloud等微服务框架,将服务注册发现,负载均衡等功能下沉到基础架构上(也就是k8s上),让业务系统更加专注于业务(springcloud这种框架,会自己通过服务的方式来进行服务注册发现和负载均衡等)。
3)DevOps: k8s是更加符合devops流程的微服务框架,

2.如何基于K8S和Feign来构建

整体构建流程:

2.0)搭建本地K8S环境

https://xiangflight.github.io/build-kubernetes-on-mac-os 
https://github.com/AliyunContainerService/k8s-for-docker-desktop 

2.1)构建程序代码:

消费端consumer:

pom.xml: 引入spring-cloud-start-openfeign

FeignClient核心代码:

@FeignClient(name = "springboot-k8s-provider", url = "http://127.0.0.1:8082")
public interface HelloFeignService {

    @GetMapping(value = "/hello")
    String helloFeignService();

    @PostMapping(value = "/hello/name")
    String helloNameFeignService(@RequestParam(value = "name") String name);
}

备注:”springboot-k8s-provider“就是provider的消费者的"spring.application.name"。

生产端provider:

application.yml: "spring.application.name"的定义要与consumer中feign定义的@FeignClient的name要一致。

验证:确保本地能访问通畅api

2.2)构建docker镜像

2.2.1) mvn package -Dmaven.test.skip=true

2.2.2) edit Dockerfile (consumer and provider)

FROM openjdk:8-jdk-alpine
COPY ../target/springboot-k8s-consumer.jar app.jar
ENV JAVA_OPTS=""
ENV APP_OPTS=""
ENTRYPOINT ["sh", "-c","java -Djava.security.egd=file:/dev/./urandom ${JAVA_OPTS} -jar /app.jar"]

FROM openjdk:8-jdk-alpine
COPY ../target/springboot-k8s-provider.jar app.jar
ENV JAVA_OPTS=""
ENV APP_OPTS=""
ENTRYPOINT ["sh", "-c","java -Djava.security.egd=file:/dev/./urandom ${JAVA_OPTS} -jar /app.jar"]

2.2.3)构建镜像

docker build -t springboot-k8s-provider:0.0.1 .
docker build -t springboot-k8s-consumer:0.0.1 .

2.2.4)运行并验证镜像

kubectl apply -f consumer-kubenetes.yml
kubectl apply -f provider-kubenetes.yml

>端口8111是机器暴露出来的端口;8080是具体服务映射到的服务端口

>通过请求接口来看镜像是否正常。

验证:部署完成镜像之后,通过docker运行镜像,可以访问到数据,确保镜像是正常的。

2.3)部署到k8s环境中

consumer-kubernetes.yml:

apiVersion: v1
kind: Service
metadata:
  name: springboot-k8s-consumer
spec:
  type: NodePort
  ports:
    - name: server
      nodePort: 31000
      port: 8080
      targetPort: 8080
    - name: management
      nodePort: 31001
      port: 8081
      targetPort: 8081
  selector:
    app: springboot-k8s-consumer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-k8s-consumer
  labels:
    app: springboot-k8s-consumer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot-k8s-consumer
  template:
    metadata:
      name: springboot-k8s-consumer
      labels:
        app: springboot-k8s-consumer
    spec:
      restartPolicy: Always
      containers:
        - name: springboot-k8s-consumer
          image: springboot-k8s-consumer:0.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              name: server
            - containerPort: 8081
              name: management
          resources:
            limits:
              memory: 1000Mi
              cpu: 1000m
            requests:
              memory: 500Mi
              cpu: 500m

provider-kubernetes.yml:

apiVersion: v1
kind: Service
metadata:
  name: springboot-k8s-provider
spec:
  type: NodePort
  ports:
    - name: server
      nodePort: 31002
      port: 8082
      targetPort: 8082
    - name: management
      nodePort: 31003
      port: 8083
      targetPort: 8083
  selector:
    app: springboot-k8s-provider
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-k8s-provider
  labels:
    app: springboot-k8s-provider
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot-k8s-provider
  template:
    metadata:
      name: springboot-k8s-provider
      labels:
        app: springboot-k8s-provider
    spec:
      restartPolicy: Always
      containers:
        - name: springboot-k8s-provider
          image: springboot-k8s-provider:0.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8082
              name: server
            - containerPort: 8083
              name: management
          resources:
            limits:
              memory: 1000Mi
              cpu: 1000m
            requests:
              memory: 500Mi
              cpu: 500m
kubectl apply -f consumer-kubenetes.yml
kubectl apply -f provider-kubenetes.yml

3.原理

     在SpringCloud微服务体系构建中,生产和消费是通过Eureka来实现服务的注册和发现功能从而进行相关的通信的,那在本文的模式下是如何进行的呢?通过K8S中CoreDNS和Service等组件实现。

Author:忆之独秀

Email:leaguenew@qq.com

转载注明出处:【Kubernetes】基于K8S & SpringCloud OpenFeign的一种微服务构建模式_忆之独秀的博客-CSDN博客

Logo

开源、云原生的融合云平台

更多推荐