• 【Kubernetes】基于K8S & SpringCloud OpenFeign的一种微服务构建模式


    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核心代码:

    1. @FeignClient(name = "springboot-k8s-provider", url = "http://127.0.0.1:8082")
    2. public interface HelloFeignService {
    3. @GetMapping(value = "/hello")
    4. String helloFeignService();
    5. @PostMapping(value = "/hello/name")
    6. String helloNameFeignService(@RequestParam(value = "name") String name);
    7. }

    备注:”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)

    1. FROM openjdk:8-jdk-alpine
    2. COPY ../target/springboot-k8s-consumer.jar app.jar
    3. ENV JAVA_OPTS=""
    4. ENV APP_OPTS=""
    5. ENTRYPOINT ["sh", "-c","java -Djava.security.egd=file:/dev/./urandom ${JAVA_OPTS} -jar /app.jar"]
    6. FROM openjdk:8-jdk-alpine
    7. COPY ../target/springboot-k8s-provider.jar app.jar
    8. ENV JAVA_OPTS=""
    9. ENV APP_OPTS=""
    10. ENTRYPOINT ["sh", "-c","java -Djava.security.egd=file:/dev/./urandom ${JAVA_OPTS} -jar /app.jar"]

    2.2.3)构建镜像

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

    2.2.4)运行并验证镜像

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

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

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

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

    2.3)部署到k8s环境中

    consumer-kubernetes.yml:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: springboot-k8s-consumer
    5. spec:
    6. type: NodePort
    7. ports:
    8. - name: server
    9. nodePort: 31000
    10. port: 8080
    11. targetPort: 8080
    12. - name: management
    13. nodePort: 31001
    14. port: 8081
    15. targetPort: 8081
    16. selector:
    17. app: springboot-k8s-consumer
    18. ---
    19. apiVersion: apps/v1
    20. kind: Deployment
    21. metadata:
    22. name: springboot-k8s-consumer
    23. labels:
    24. app: springboot-k8s-consumer
    25. spec:
    26. replicas: 1
    27. selector:
    28. matchLabels:
    29. app: springboot-k8s-consumer
    30. template:
    31. metadata:
    32. name: springboot-k8s-consumer
    33. labels:
    34. app: springboot-k8s-consumer
    35. spec:
    36. restartPolicy: Always
    37. containers:
    38. - name: springboot-k8s-consumer
    39. image: springboot-k8s-consumer:0.0.1
    40. imagePullPolicy: IfNotPresent
    41. ports:
    42. - containerPort: 8080
    43. name: server
    44. - containerPort: 8081
    45. name: management
    46. resources:
    47. limits:
    48. memory: 1000Mi
    49. cpu: 1000m
    50. requests:
    51. memory: 500Mi
    52. cpu: 500m

    provider-kubernetes.yml:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: springboot-k8s-provider
    5. spec:
    6. type: NodePort
    7. ports:
    8. - name: server
    9. nodePort: 31002
    10. port: 8082
    11. targetPort: 8082
    12. - name: management
    13. nodePort: 31003
    14. port: 8083
    15. targetPort: 8083
    16. selector:
    17. app: springboot-k8s-provider
    18. ---
    19. apiVersion: apps/v1
    20. kind: Deployment
    21. metadata:
    22. name: springboot-k8s-provider
    23. labels:
    24. app: springboot-k8s-provider
    25. spec:
    26. replicas: 1
    27. selector:
    28. matchLabels:
    29. app: springboot-k8s-provider
    30. template:
    31. metadata:
    32. name: springboot-k8s-provider
    33. labels:
    34. app: springboot-k8s-provider
    35. spec:
    36. restartPolicy: Always
    37. containers:
    38. - name: springboot-k8s-provider
    39. image: springboot-k8s-provider:0.0.1
    40. imagePullPolicy: IfNotPresent
    41. ports:
    42. - containerPort: 8082
    43. name: server
    44. - containerPort: 8083
    45. name: management
    46. resources:
    47. limits:
    48. memory: 1000Mi
    49. cpu: 1000m
    50. requests:
    51. memory: 500Mi
    52. cpu: 500m
    1. kubectl apply -f consumer-kubenetes.yml
    2. kubectl apply -f provider-kubenetes.yml

    3.原理

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

    Author:忆之独秀

    Email:leaguenew@qq.com

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

  • 相关阅读:
    【JAVA】03 对象
    探索科技地图:通向未来的科技之路
    cartographer(1)-运行
    Netty线程模型
    使用docker安装nginx笔记
    用Python分析了30000+《独行月球》影评数据,看看观众们怎么说~
    开源交流丨任务or实例 详解大数据DAG调度系统Taier任务调度
    数字探秘:用神经网络解密MNIST数据集中的数字!
    PV 操作与案例分析
    数据库系列之MySQL中Join语句优化问题
  • 原文地址:https://blog.csdn.net/lavorange/article/details/126085804