現在越來越多人在討論云原生,也就是使用Kubernetes作為部署架構邻寿,完全抽離IASS伯复。其實Java跟云原生并不是這么搭配的搞莺,至少Spring Cloud跟Kubernetes 不合的撵溃,有很多功能重復的疚鲤。 Spring Cloud的服務發(fā)現、配置中心征懈、負載均衡石咬、網關這些都可以在Kubernetes找到替代揩悄。我在想如果完全使用Kubernetes結構來處理分布式系統(tǒng)連接卖哎、發(fā)現、配置問題删性,剩下的服務器好像只有一個Spring Boot而已亏娜,不需要引入太多組件了。
簡單構建兩個微服務蹬挺、讓后將服務發(fā)現维贺、注冊中心這些組件統(tǒng)統(tǒng)拋棄,去使用Kubernetes去實現替代效果巴帮。使用pod 探針去檢測微服務存過效果溯泣,完全是沒有任何問題的虐秋。配置中心可以通過ConfigMap的卷掛載達到類似的效果,服務間的Fegin訪問垃沦,可以不依賴服務發(fā)現進行客给,通過配置文件設定服務訪問地址,訪問地址再由Service進行維護肢簿,就可以達到屏蔽服務之間IP變化靶剑。其實很多人都很不屑為了這一點點性能,破壞整個完整Spring Cloud體系池充,但是我想的是桩引,要Java往云原生發(fā)展,必須慢慢進行改變才行的收夸,至少現在不能完全轉向坑匠,量變促進質變。在云原生時代卧惜,對每一個服務有更高需要笛辟,更小的軟件制品、更快的啟動速度序苏、更快執(zhí)行速度手幢,這些都要求在開發(fā)時盡量將每一個微服務技術依賴控制在一個可能小的范圍。我的想法能不依賴就不依賴忱详。減少微服務的技術依賴也有利于開發(fā)更容易參與進來围来,下面就可以行動吧。
項目編碼
項目依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.3.RELEASE</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>${artifactId}</finalName>
</build>
下面只展示部分代碼匈睁、feign客戶端連接另一個服務
@FeignClient(name = "author",url = "${app.author.remote}")
public interface AuthorFeign {
@GetMapping("/author/getOne")
AuthorDTO getOne();
}
controller調用feign接口
@RestController
@RequestMapping("book")
public class BookController {
@Autowired
private AuthorFeign authorFeign;
@GetMapping("getOne")
public Book getOne(){
Book book = new Book();
return book;
}
@GetMapping("getAuthor")
public AuthorDTO getAuthor(){
return authorFeign.getOne();
}
}
application.yml配置文件
server:
port: 8080
spring:
application:
name: book
app:
author:
remote: localhost:8081
編譯構建,Dockerfile
如下
FROM --platform=linux/amd64 docker.io/adoptopenjdk/openjdk8 AS java8
WORKDIR /opt/web
COPY target/book.jar .
ENV AUTHOR_URL author
ENTRYPOINT java -jar book.jar --app.author.remote}=${AUTHOR_URL} --server.port=80
進入book項目根路徑监透, 執(zhí)行命令構建鏡像
docker build . -t book:1.0v
Kubernetes 配置
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: book-deployment
labels:
app: book
spec:
replicas: 1
selector:
matchLabels:
app: book
template:
metadata:
labels:
app: book
spec:
containers:
- name: book
image: book:1.0v
env:
- name: AUTHOR_URL
value: "author-clusterip"
ClusterIP配置
將服務端口暴露給集群內Pod訪問
apiVersion: v1
kind: Service
metadata:
name: book-clusterip
spec:
type: ClusterIP
selector:
app: book
ports:
- name: http
port: 80
targetPort: 80
NodePort配置
將外部流量接入Pod
apiVersion: v1
kind: Service
metadata:
name: book-nodeport
spec:
type: NodePort
selector:
app: book
ports:
- name: book-http
port: 80
targetPort: 80
nodePort: 30001
如果有興趣,去github看完整的項目cloud-demo
其實我對云原生Java應用也不是很了解航唆,想聽聽大伙意見胀蛮。
我從事Java快7年了,14年出的Java8糯钙,17年就已經開始使用Java8作為主力開發(fā)環(huán)境粪狼,想不到6年過來了,我依然還是在用Java8.其實Java的版本一直在更新任岸,從來都沒有使用過再榄。沒當市場出現新潮的技術,總想躍躍欲試享潜,學了很多東西困鸥,也忘記了很多東西??。我總是告訴自己我還能學剑按,實際上連工作快找不到了疾就,真的迷茫了澜术,不知道該往什么方向走了。