【Kubernetes】基于K8S & SpringCloud OpenFeign的一种微服务构建模式
在构建微服务之前,需要进行微服务框架选型,之前的微服务完全基于springcloud构建,而现在则需要基于云原生的方式来构建。
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博客
更多推荐
所有评论(0)