在构建微服务之前,需要进行微服务框架选型,之前的微服务完全基于springcloud构建, 而现在则需要基于云原生的方式来构建。
1)云原生架构:目前微服务比较流行的架构
2)服务下沉:用k8s构建微服务,相比如springcloud等微服务框架,将服务注册发现,负载均衡等功能下沉到基础架构上(也就是k8s上),让业务系统更加专注于业务(springcloud这种框架,会自己通过服务的方式来进行服务注册发现和负载均衡等)。
3)DevOps: k8s是更加符合devops流程的微服务框架,
整体构建流程:
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
在SpringCloud微服务体系构建中,生产和消费是通过Eureka来实现服务的注册和发现功能从而进行相关的通信的,那在本文的模式下是如何进行的呢?通过K8S中CoreDNS和Service等组件实现。
Author:忆之独秀
Email:leaguenew@qq.com
转载注明出处:【Kubernetes】基于K8S & SpringCloud OpenFeign的一种微服务构建模式_忆之独秀的博客-CSDN博客