近來(lái)因工作需要,springboot / spring cloud 構(gòu)建的產(chǎn)品需要提供嵌入k8s的能力,所以手動(dòng)部署了一下。
目標(biāo):部署服務(wù)A與B,請(qǐng)求到達(dá)服務(wù)A,服務(wù)A內(nèi)部請(qǐng)求服務(wù)B,然后返回結(jié)果。
要實(shí)現(xiàn)在k8s上面通信,筆者使用了 spring-cloud-kubernetes 這個(gè)依賴包來(lái)完成,且使用的 maven 來(lái)構(gòu)建 project,讀者可以自行更換 gradle 等以及對(duì)應(yīng)版本,個(gè)人只貼出pom依賴,且version并未貼出,請(qǐng)自行尋找與自己使用的springboot版本對(duì)應(yīng)的veision:
org.springframework.cloud spring-cloud-starter-kubernetes
1.編寫(xiě)兩個(gè)springboot應(yīng)用,分別名字為 demo-request 以及 demo-data,實(shí)現(xiàn)以上功能,具體如何構(gòu)建不再贅述,
demo-data服務(wù)部分核心服務(wù)代碼如下(忽略了部分重要的導(dǎo)包):
1.1 定義一個(gè)controller,返回了當(dāng)前請(qǐng)求的 ip 與 hostname@RestController
public class DataController {@GetMapping("/data")
public ResponseVOdata(){HashMapmap = new HashMap<>();
try {InetAddress address = InetAddress.getLocalHost();
map.put("name",address.getHostName());
map.put("address",address.getHostAddress());
System.out.println("Host Name: " + address.getHostName());
System.out.println("Host Address: " + address.getHostAddress());
} catch (UnknownHostException e) {e.printStackTrace();
}
return ResponseVOUtil.success(map);
}
}
1.2 main class標(biāo)記為一個(gè)web應(yīng)用啟動(dòng)這里有一個(gè)比較重要的點(diǎn),是通過(guò) @EnableDiscoveryClient 開(kāi)啟服務(wù)發(fā)現(xiàn)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class DataApp {public static void main(String[] args) {SpringApplication.run(DataApp.class, args);
}
}
1.3 appliaction.yml配置其中定義了服務(wù)的端口、名稱以及指定 namespace。
(筆者懶,直接使用之前測(cè)試es用的namespace,讀者可以提前構(gòu)建,命令如下:kubectl create ns ${your define namespace})
server:
port: 12001
spring:
application:
name: demo-data
cloud:
kubernetes:
discovery:
namespaces:
- myes
demo-request 服務(wù)部分核心服務(wù)代碼如下(忽略了部分重要的導(dǎo)包),大體與 demo-data 類似:
1.3 定義一個(gè)請(qǐng)求其他服務(wù)的請(qǐng)求筆者這里使用openFeign組件調(diào)用 demo-data 服務(wù)中的 /data 請(qǐng)求拿到結(jié)果,讀者可以自行使用其他組件比如 RestTemplate、okhttp等等
@RestController
public class RequestController {@Resource
private DataServer dataServer;
@GetMapping("request")
public ResponseVO data(){return dataServer.data();
}
}
1.4 feign接口配置這里的url很重要,因?yàn)槲匆肫渌M件,此處的 url 采用了 k8s的 dns 尋址,拼接規(guī)則采用的 {service-name}.{namespace},讀者也可使用{namespace}.{service-name}等等,還可以使用環(huán)境變量,可以自行查看官方文檔描述。
但是在 spring-cloud-kubernetes 的官網(wǎng)中有這個(gè)描述:使用 spring-cloud-starter-kubernetes-discoveryclient 這個(gè)依賴包的全的命名規(guī)則為:{service-name}.{namespace}.svc.{cluster}.local:{service-port}。這里是官網(wǎng)描述,但是本人嘗試過(guò)沒(méi)有連通,如果有大佬能告知感激不盡!
@FeignClient(name = "demo-data", url = "http://demo-data.myes:12001")
public interface DataServer {@GetMapping("data")
public ResponseVOdata();
}
1.5 application.yml配置server:
port: 12002
spring:
application:
name: demo-request
cloud:
kubernetes:
discovery:
namespaces:
- myes
1.6 構(gòu)建鏡像自行測(cè)試以上服務(wù)能夠正常請(qǐng)求即可,打包以及構(gòu)建過(guò)程省略,請(qǐng)自行構(gòu)建鏡像
貼一個(gè)簡(jiǎn)單的構(gòu)建demo-request服務(wù)的Dockerfile,筆者此處只寫(xiě)了最小功能,如有需要可以自行修改
FROM java:8
MAINTAINER jyu
ADD ./demo-request-1.0-SNAPSHOT.jar /app.jar
EXPOSE 12002
ENTRYPOINT ["java","-jar","-Xms512m","-Xmx512m","-Dfile.encoding=utf-8","/app.jar"]
二、編寫(xiě)k8s的yaml文件筆者自行創(chuàng)建 namespace 以及修改對(duì)應(yīng)的配置,其實(shí)這塊沒(méi)什么好寫(xiě)的,因?yàn)槭菫榱藢?shí)現(xiàn)本文的目標(biāo)寫(xiě)最小資源清單,筆者可以自行根據(jù)需要新增配置。
2.1 配置demo-data的yaml文件apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-data
namespace: myes
spec:
# 副本數(shù)增加為了測(cè)試service的負(fù)載均衡
replicas: 2
selector:
matchLabels:
run: demo-data
template:
metadata:
labels:
run: demo-data
spec:
# 此處筆者懶,指定了機(jī)器加載鏡像,但是在實(shí)際開(kāi)發(fā)過(guò)程中,pod的構(gòu)建應(yīng)該交給k8s本身,讀者可以去掉
nodeName: node4
containers:
# 此處自行傳到自己的鏡像倉(cāng)庫(kù)或者使用本地鏡像
- image: demo-data:1.0
name: demo-data
ports:
- containerPort: 12001
---
kind: Service
apiVersion: v1
metadata:
name: demo-data
namespace: myes
labels:
run: demo-data
spec:
type: NodePort
selector:
run: demo-data
ports:
- port: 12001
protocol: TCP
nodePort: 31991
2.2 配置demo-request的yaml文件總體與demo-data類似
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-request
namespace: myes
spec:
selector:
matchLabels:
run: demo-request
template:
metadata:
labels:
run: demo-request
spec:
nodeName: node4
containers:
- image: demo-request:1.0
name: demo-request
ports:
- containerPort: 12002
---
kind: Service
apiVersion: v1
metadata:
name: demo-request
namespace: myes
labels:
run: demo-request
spec:
type: NodePort
selector:
run: demo-request
ports:
- port: 12002
protocol: TCP
nodePort: 31992
2.3 結(jié)果測(cè)試根據(jù)2.1以及2.2的資源清單創(chuàng)建以后,會(huì)有如下資源出現(xiàn):
其中 pod/curl-test 為筆者創(chuàng)建的一個(gè)用于 curl 測(cè)試的臨時(shí)鏡像,命令如下,自行修改 namespace:
kubectl run -i --tty --image radial/busyboxplus:curl curl-test --restart=Never --rm -n myes
此時(shí)我們?cè)?curl-test 這個(gè) pod 中 ping 一下 service/demo-request 的預(yù)定義名稱,看看 ip 是否對(duì)應(yīng)的上:
ping demo-request.myes
結(jié)果如下,可以很清楚的看得到 demo-request.myes 這個(gè)域名能夠?qū)?yīng) service/demo-request 的 cluster-ip:
那么下一步請(qǐng)求一下 1.3 中預(yù)定義的請(qǐng)求:
curl demo-request.myes:12002/request
結(jié)果如下:
這里能夠正常返回,注意此處的結(jié)果,實(shí)際上是 demo-data 服務(wù)返回的結(jié)果,注意看返回的 name 與 address 字段。
那么整個(gè)請(qǐng)求單向鏈路圖為:
那么多來(lái)幾次就能看到負(fù)載能力,可以很清楚的看到 ip 是變了的:
總結(jié):本文屬于入門級(jí)教程,只告訴了讀者 springboot application 在 k8s 內(nèi)部如何內(nèi)部不通過(guò)其他組件實(shí)現(xiàn)通信,有一些更深入的玩法請(qǐng)自行了解官網(wǎng)。
比如 service 的負(fù)載均衡策略,配合 ingress 使用等等。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:如何將多個(gè)springboot應(yīng)用部署在k8s并實(shí)現(xiàn)互相通信-創(chuàng)新互聯(lián)
當(dāng)前URL:http://jinyejixie.com/article28/jgicp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站設(shè)計(jì)、企業(yè)建站、動(dòng)態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容