乐趣区

关于kubernetes:Java微服务云原生想法

当初越来越多人在探讨云原生,也就是应用 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: 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 我的项目根门路,执行命令构建镜像

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 作为主力开发环境,想不到 6 年过去了,我仍然还是在用 Java8。其实 Java 的版本始终在更新,素来都没有应用过。没当市场呈现新潮的技术,总想蠢蠢欲动,学了很多货色,也遗记了很多货色🤦。我总是通知本人我还能学,实际上连工作快找不到了,真的迷茫了,不晓得该往什么方向走了。

退出移动版