当初越来越多人在探讨云原生,也就是应用Kubernetes作为部署架构,齐全抽离IASS。其实Java跟云原生并不是这么搭配的,至多Spring Cloud跟Kubernetes 不合的,有很多性能反复的。 Spring Cloud的服务发现、配置核心、负载平衡、网关这些都能够在Kubernetes找到代替。我在想如果齐全应用Kubernetes构造来解决分布式系统连贯、发现、配置问题,剩下的服务器如同只有一个Spring Boot而已,不须要引入太多组件了。
简略构建两个微服务、让后将服务发现、注册核心这些组件通通摈弃,去应用Kubernetes去实现代替成果。应用pod 探针去检测微服务存过成果,齐全是没有任何问题的。配置核心能够通过ConfigMap的卷挂载达到相似的成果,服务间的Fegin拜访,能够不依赖服务发现进行,通过配置文件设定服务拜访地址,拜访地址再由Service进行保护,就能够达到屏蔽服务之间IP变动。其实很多人都很不屑为了这一点点性能,毁坏整个残缺Spring Cloud体系,然而我想的是,要Java往云原生倒退,必须缓缓进行扭转才行的,至多当初不能齐全转向,质变促成量变。在云原生时代,对每一个服务有更高须要,更小的软件制品、更快的启动速度、更快执行速度,这些都要求在开发时尽量将每一个微服务技术依赖管制在一个可能小的范畴。我的想法能不依赖就不依赖。缩小微服务的技术依赖也有利于开发更容易参加进来,上面就能够口头吧。
我的项目编码
我的项目依赖
<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: 8080spring: application: name: bookapp: author: remote: localhost:8081
编译构建,Dockerfile
如下
FROM --platform=linux/amd64 docker.io/adoptopenjdk/openjdk8 AS java8WORKDIR /opt/webCOPY target/book.jar .ENV AUTHOR_URL authorENTRYPOINT java -jar book.jar --app.author.remote}=${AUTHOR_URL} --server.port=80
进入book我的项目根门路, 执行命令构建镜像
docker build . -t book:1.0v
Kubernetes 配置
Deployment
apiVersion: apps/v1kind: Deploymentmetadata: name: book-deployment labels: app: bookspec: 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: v1kind: Servicemetadata: name: book-clusteripspec: type: ClusterIP selector: app: book ports: - name: http port: 80 targetPort: 80
NodePort配置
将内部流量接入Pod
apiVersion: v1kind: Servicemetadata: name: book-nodeportspec: 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作为主力开发环境,想不到6年过去了,我仍然还是在用Java8。其实Java的版本始终在更新,素来都没有应用过。没当市场呈现新潮的技术,总想蠢蠢欲动,学了很多货色,也遗记了很多货色。我总是通知本人我还能学,实际上连工作快找不到了,真的迷茫了,不晓得该往什么方向走了。