• 【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之分支结构
    开发工程师必备————【Day2】网络编程之TCP与UDP协议,黏包处理
    零基础html学习/刷题-第三期
    Ansible Tower对接ldap和git仓库
    宠物经济:千亿级的孤独生意,如何用智能化玩出新花样?
    小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)
    2023年9月18日
    以字符串mark作为分隔符,对字符串s进行分割
    景联文科技:高质量AI数据标注助力大语言模型训练,推动人工智能落地应用
    移动端微信浏览器调试工具整理eruda,微信x5调试工具无法使用,推荐新工具eruda和debugxweb
  • 原文地址:https://blog.csdn.net/lavorange/article/details/126085804